1. 首先拉取镜像
docker pull mysql:5.7.26
2. 创建容器
docker run -p 3340:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=
123456 -d mysql:5.7.26
docker run -p 3341:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=
123456 -d mysql:5.7.26
–name 为容器指定名称,这里是mysql-master和mysql-slave
-p 将容器的指定端口映射到主机的指定端口,这里是将容器的3341和3342端口映射到主机的3306端口
-e 设置环境变量,这里是指定root账号的密码为123456
-d 后台运行容器,并返回容器ID
mysql:5.7.26 指定运行的mysql版本
3.配置Master(主)
首先通过docker exec -it mysql-master /bin/bash
进入容器内部
然后先apt-get update
,完成之后apt-get install vim
紧接着vim /etc/mysql/my.cnf
添加如下配置
[mysqld]
## 同一局域网内注意要唯一,最好用ip段后缀来区分
server-id= 2
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
配置完成后,需要重启Mysql服务 ,service mysql restart
,重启服务会导致docker容器stop,只要 docker start mysql-master
启动容器即可
接下来,在Master中新建slave用户,并授予权限
CREATE USER 'slave'@'%'IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
[mysqld]
## 设置server_id,注意要唯一
server-id=3
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=mysql-relay-bin
配置完同样重启。
5.链接Master(主)和Slave(从)
进入Master mysql,执行show master status;
其中File和Position等等都会用到,利用这两个可以让从库找到对应的二进制文件读取信息
6. 获取Master的地址,指的是容器的独立ip,可以通过docker inspect --format='{{.NetworkSettings.IPAddress}}'
容器名称|容器id 查询容器的ip,接下来需要用到。
7.接下在Slave中进入mysql,执行以下操作:
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=1299, master_connect_retry=30;
命令说明:
master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
在Slave中执行 show slave status \G;
查看主从复制状态
别急,正常情况下圈圈里都是显示NO,因为还没开启主从复制,我这里是已经开启了才显示YES。 现在只需要start slave
,再次查询就可以看到两个都是YES了。然后就可以测试数据是否同步成功,这里就不演示了。
8.错误排查
如果你的Slave_IO_RUNNGING显示的是connecting,那么你可以滑倒下面查看Last_IO_Error
,一般情况下错误都是因为:
my.cnf
配置文件可能配置错了,再检查一遍。9.编写shell脚本
用nagios
监控监控slave的两个YES(Slave_IO和Slave_SQL进程),如果其中一个为no,表明主从有问题,然后发送短信警报!