Docker 中配置 MySQL 主从同步(2)

上一篇中,完成了构建镜像的准备工作,接下来开始正式构建镜像

1. 构建镜像

进入 master 目录,运行

1
docker build -t master/mysql .

(命令最后有个.,不要忘记,代表当前目录)

然后分别进入 slave1 和 slave2 目录,分别运行

1
2
3
4
5
# slave1 目录下
docker build -t slave1/mysql .
# slave2 目录下
docker build -t slave2/mysql .

2. 运行容器

建议开启三个终端,分别对应三个容器,方便操作

运行

1
docker run -p 3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=mysql -d master/mysql

语法:-p 3306是将3306端口映射出来,也可以使用*:3306指定映射之后的端口,mysql-master为容器的名称,mysql为指定密码,master/mysql为镜像源,下同。

这个终端作为 master 容器的操作终端,新建一个终端,运行

1
docker run -p 3306 --name mysql-slave1 -e MYSQL_ROOT_PASSWORD=mysql -d slave1/mysql

这个终端作为 slave1 容器的操作终端,再新建一个终端,运行

1
docker run -p 3306 --name mysql-slave2 -e MYSQL_ROOT_PASSWORD=mysql -d slave2/mysql

这个终端作为 slave2 容器的操作终端

至此,已经成功运行了三个 mysql 容器,可以运行

1
docker ps

进行查看

3. 进入容器内部的 mysql 环境

在 master 终端中,运行

1
docker exec -it mysql-master bash

进入容器内部,然后运行

1
mysql -uroot -p

输入之前设置的 mysql 密码后进入 mysql 环境

用同样的方法分别在 slave1 和 slave2 的终端中运行,并进入相应的 mysql 环境

1
2
3
4
5
# slave1终端
docker exec -it mysql-slave1 bash
# slave2终端
docker exec -it mysql-slave2 bash

4. mysql 主从配置

接下来开始正式配置主从连接服务

4.1 配置主库(master)

在 master 终端中输入

1
mysql>GRANT REPLICATION SLAVE ON *.* to 'user'@'%' identified by 'mysql'; # 所有ip

查看 master 数据库状态

1
mysql>show master status

记录 mysql-bin 和 pos 的值, 下面要用到,至此,master 终端不要再进行任何操作,防止状态改变

4.2 配置从库(slave1)

在 slave1 终端中输入

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql>change master to
master_host='172.17.0.1', # 要连接的 master 服务器的ip
master_user='user', # 指定的用户名,最好不要用root
master_log_file='mysql-bin.000003', # master记录的值
master_log_pos=1201, # 主库的pos值
master_port=32771, # 主库3306映射的端口,如果不知道可以使用docker ps查看
master_password='mysql'; # 主库要连接的用户的密码了

查看容器 ip 可以在新终端中运行下面的命令

1
docker inspect --format '{{ .NetworkSettings.IPAddress }}' [1f7d8f36523c]

[ ] 内是容器id

方便起见,可以在 ~/.bashrc 中写一个 bash 函数:

1
2
3
function docker_ip() {
sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' $1
}

运行 source ~/.bashrc 后,可以使用下面的命令直接进行查看

1
2
$ docker_ip 1f7d8f36523c
172.17.0.1

如果一切顺利,那么距离成功还有最后一步,输入

1
mysql>start slave1

启动从服务器。

4.3 检查 slave1 状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
mysql>show slave1 status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.17.0.1 # 主服务器地址
Master_User: mysync # 授权帐户名,尽量避免使用root
Master_Port: 3306 # 数据库端口,部分版本没有此行
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 600 # 同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
Relay_Log_File: ddte-relay-bin.000003
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes # 此状态必须YES
Slave_SQL_Running: Yes # 此状态必须YES

注:Slave_IO 及 Slave_SQL进程必须正常运行,即 YES 状态,否则都是错误的状态(如:其中一个 NO 或 其他值均属错误)。

4.4 配置从库(slave2)

切换到 slave2 的终端,重复 4.2 到 4.3 的步骤

4.5 验证主从同步生效

在 master 库中新建一个数据库,增加几条数据,分别在 slave1 和 slave2 中查看,验证主从同步是否生效