一、系统环境说明:
两个同样配置环境的linux服务,每台服务器都安装有docker服务,并且通过docker 安装了mysql镜像。
linux系统: centos7.2 64 位
主master:192.168.239.130
从slave :192.168.239.131
关于docker 安装mysql,请直接参考: 《docker 安装mysql》
二、实现目标:
在docker环境下,通过修改mysql配置,实现mysql的主从复制,即:mater上的数据变化后,会直接影slave的数据。
三、实现步骤:
步骤1: 启动mysql , 两个服务器执行同样的操作。
使用docker 启动mysql,同时开放防火墙的3306端口
docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d hub.c.163.com/library/mysql
开放3306端口:
[root@VM_0_17_centos ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
[root@VM_0_17_centos ~]# firewall-cmd --reload
开启后,可以使用Navicat工具,检查是否连接成功。
步骤二: 创建master的复制账号,在Navicat下执行
GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by 'backup';
show grants for 'backup'@'%';
步骤三: 修改mysql的配置,先从master开始
由于docker下没有vim工具,这里直接使用docker cp命令,将mysql配置文件copy到主机,进行修改后再进行替换。
[root@192 mysql]# docker cp mysql:/etc/mysql/mysql.conf.d/mysqld.cnf /usr/local/mysql/mysqld.cnf
在配置文件中最后增加:
log-bin=mysql-bin
server-id=1
(注意:server-id 一定不能和slave重复,确保每个mysql唯一)
修改后,将配置文件替换到docker中
[root@192 mysql]# docker cp /usr/local/mysql/mysqld.cnf mysql:/etc/mysql/mysql.conf.d/mysqld.cnf
重启mysql服务,让配置生效:
docker restart mysql
从服务器按照上述操作,也操作一遍,注意serverid 不要和master重复。
步骤四:配置主从复制
主从复制是实现slave复制master上的数据,所以配置是在slave服务器中进行。
使用Navicat连接slave后新建查询,执行以下SQL
CHANGE MASTER TO
MASTER_HOST='192.168.239.130',
MASTER_PORT=3306,
MASTER_USER='backup',
MASTER_PASSWORD='backup';
START SLAVE;
MASTER_HOST 填Navicat连接配置中的ip应该就可以
MASTER_PORT 主容器的端口
MASTER_USER 同步账号的用户名
MASTER_PASSWORD 同步账号的密码
检查是否配置成功:
Navicat下执行:show slave status;
如果两个都是Yes,则基本配置完成。
如果遇到“slave have equal MySQL Server UUIDs”问题,则是由于master 和 slave 有同样的uuid, 除了上述的server-id不同之外,uuId也要求不同,所以操作就是更改slave的UUID。
[root@192 mysql]# docker cp mysql:/var/lib/mysql/auto.cnf /usr/local/mysql/auto.cnf
更换UUID ,可以在navicat下执行:select uuid(),生产一个新的uuid,然后再替换。
[root@192 mysql]# docker cp /usr/local/mysql/auto.cnf mysql:/var/lib/mysql/auto.cnf
配置后,重启mysql: docker restart mysql, 重启后再按照第四步再操作一次。
步骤五:测试主从复制
使用Navicat进行测试,在master中插入一条数据,则在slave中能够同样查看到该数据