3. 使用 Docker 搭建 MySQL 主从复制

3.1. 主从复制原理

../../../_images/master-slave-copy.png

复制原理 mysql的复制原理大致如下。

  • 主库开启bin-log二进制日志功能,并建立slave账号,并授权从库连接主库,从库通过change master得到主库的相关同步信息。mysql主库在事务提交时会把数据库变更作为事件Events记录在二进制文件binlog中;mysql主库上的sys_binlog控制binlog日志刷新到磁盘。

  • 从库然后连接主库进行验证,主库产生的新数据会导入到bin-log二进制文件中,同时主库会开启IO线程,从库也会开启IO线程以及SQL线程,从库中的IO线程与主库的IO线程连接一旦主库库数据有所变更则从库将变更的数据复制到relary-bin(中继日志)中。SQL线程会读取relay log(中继日志)文件中的日志,并解析成具体操作,至此整个同步过程完成。

3.2. 主从复制操作

3.2.1. 流程命令集

# 1、搭建部署 mysql
docker run --name mysql1 -p 33061:3306 -e MYSQL_ROOT_PASSWORD=123 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
docker run --name mysql2 -p 33062:3306 -e MYSQL_ROOT_PASSWORD=123 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

# 2、主机配置
## 2.1、进入mysql
mysql -u root -h 127.0.0.1 -P 33061 -p

## 2.2、 主机配置 配置一个从机登录用户
GRANT REPLICATION SLAVE ON *.* TO 'user'@'%' IDENTIFIED BY '123';  

## 2.3、进入docker容器
docker exec -it mysql1 bash

## 2.4、需要修改 MySQL 的配置,开启 binlog
vi /etc/mysql/mysql.conf.d/mysqld.cnf


# 3、从机配置
## 3.1、进入mysql
mysql -u root -h 127.0.0.1 -P 33061 -p


## 3.2、从配置 配置一个从机登录用户
change master to master_host='192.168.66.114',master_port=33061,master_user='user',master_password='123',master_log_file='binlog.000001',master_log_pos=154;

## 3.3、 slave 启动或停止
start slave;
stop slave;

## 3.4、 查看slave配置正确与否
show slave status\G;

####Slave_IO_Running 和 Slave_SQL_Running ,这两个的值必须为 Yes。

3.2.2. 配置相关文件

3.2.2.1. 主机MySQL 配置文件 mysqld.cnf

  • binlog 的开启,需要修改 MySQL 的配置,因此,我们需要进入到容器内部去执行。

    docker exec -it mysql1 /bin/bash

  • MySQL 配置文件/etc/mysql/mysql.conf.d/mysqld.cnf 追加以下内容

# 第一行表示配置 binlog 的位置,理论上 binlog 可以放在任意位置,但是该位置,MySQL 一定要有操作权限。
log-bin=/var/lib/mysql/binlog

#server-id 表示集群中,每个实例的一标识符
server-id=1

# 不同步哪些数据库  
binlog-ignore-db = mysql  
binlog-ignore-db = test  
binlog-ignore-db = information_schema  
  
# 只同步哪些数据库,除此之外,其他不同步  
binlog-do-db = game  

img

​ File 和 Position 需要记着,这两个标记了二进制日志的起点位置,在从机的配置中将使用到这两个参数。

3.2.2.2. 从机配置

  • show slave status;

    • Slave_IO_State: 当前I/O线程的状态

    • Master_Log_File: 当前同步的主服务器的二进制文件

    • Read_Master_Log_Pos: 当前同步的主服务器的二进制文件的偏移量,单位为字节,如图中为已经同步了12.9M(13630580/1024/1024)的内容

    • Relay_Master_Log_File: 当前中继日志同步的二进制文件

    • Slave_IO_Running: 从服务器中I/O线程的运行状态,YES为运行正常

    • Slave_SQL_Running: 从服务器中SQL线程的运行状态,YES为运行正常

    • Exec_Master_Log_Pos: 表示同步完成的主服务器的二进制日志偏移量

    • Seconds_Behind_Master: 表示从服务器数据比主服务器落后的持续时长