docker搭建mysql主从复制
一、下载镜像
docker pull mysql:5.7.32
二、创建目录及配置文件
$ mkdir /trs/mysql/
$ cd /trs/mysql/
$ mkdir master slave
$ cd /trs/mysql/master
$ mkdir data logs
$ cd /trs/mysql/slave
$ mkdir data logs
# 进入mater目录创建配置文件 my.cnf
$ vi my.cnf
--------------------------------------
[mysqld]
# [必须]服务器唯一ID,默认是1,一般取IP最后一段,这里看情况分配(每个mysql节点必须不一样)
server-id=1
# [必须]启用二进制日志
log-bin=mysql-bin
# 进入mater目录创建配置文件 my.cnf
$ vi my.cnf
--------------------------------------
[mysqld]
server-id=2
log-bin=mysql-bin
三、启动容器
master
sudo docker run -p 3316:3306 --name mysql_master \
-v /trs/mysql/master:/etc/mysql \
-v /trs/mysql/master/logs:/var/log/mysql \
-v /trs/mysql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7.32
slave
sudo docker run -p 3317:3306 --name mysql_slave \
-v /trs/mysql/slave:/etc/mysql \
-v /trs/mysql/slave/logs:/var/log/mysql \
-v /trs/mysql/slave/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7.32
查看结果
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
22c4c9e03476 mysql:5.7.32 "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 33060/tcp, 0.0.0.0:3317->3306/tcp mysql_slave
723646be27ef mysql:5.7.32 "docker-entrypoint.s…" 9 minutes ago Up 9 minutes 33060/tcp, 0.0.0.0:3316->3306/tcp mysql_master
四、授权
因为从节点需要读取主节点的bin_log日志,所以要在主节点为从节点开放权限
1、在master节点创建主从复制专用用户并赋权
# 进入容器
$ docker exec -it mysql_master bash
# 连接mysql
root@723646be27ef:/# mysql -uroot -p123456
# 创建rep用户,任意ip访问,密码:test@A123456
mysql> create user 'rep'@'%' identified by 'test@A123456';
# 授权rep权限
mysql> grant replication slave,replication client on *.* to 'rep'@'%';
2、在slave测试
注意slave容器并不能直接连到宿主机,所以要通过docker0网桥转发,docker0虚拟网桥的默认ip是172.17.0.1
如果使用172.17.0.1还是连不通,可以尝试关掉防火墙
# 进入容器
$ docker exec -it mysql_slave bash
# 连接mysql,连接上说明授权成功
root@723646be27ef:/# mysql -h 172.17.0.1 -P 3316 -u'rep' -p'test@A123456'
五、配置主从同步
1、查看master节点当前bin-log日志的文件名及位置
# 进入容器
$ docker exec -it mysql_master bash
# 连接mysql
root@723646be27ef:/# mysql -uroot -p123456
# 查看bin-log
mysql> show master status;
到这里为止,主库千万不要再做任何操作,防止状态改变
2、在slave节点配置主从复制
# 进入容器
$ docker exec -it mysql_slave bash
# 连接mysql
root@723646be27ef:/# mysql -uroot -p123456
# **配置主从同步**
mysql> change master to
master_host='172.17.0.1',
master_port=3316,
master_user='rep',
master_password='test@A123456',
master_log_file='mysql-bin.000004',
master_log_pos=613;
3、开始主从复制
# 开始主从复制
mysql> start slave;
# 查看状态 以下两项都为Yes,说明成功。
mysql> show slave status\G;
-----------
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
-----------
4、(如果成功不需要)错误情况
- connect:
检查ip端口用户名密码是否正确
ip是否能ping通,mysql是否允许远程链接等
- no:
检查bin-log 文件名或者位置是否正确
状态失败后,执行stop slave;然后修改相应的配置后,重新start slave;
六、测试
在master上建表,查看从库是否出现同样的表
在master上执行增删改查,查看从库是否执行相应的操作
参考文章
使用docker 实现MySQL主从同步/读写分离 - 西柚柠檬 - 博客园 (cnblogs.com)
MySQL主从同步详解与配置 - 知乎 (zhihu.com)