主从同步
1. 下载镜像
docker pull mysql
2. 利用 mysql 镜像,创建用于主从同步的两个新镜像
我们当前所在的服务器叫宿主服务器,我们要利用 docker 虚拟两个 docker 容器服务器,一个主服务器,两个从服务器。
2.1 创建 master(主) 和 slave(从) 两个文件夹
/usr/mysql/master
/usr/mysql/slave1
/usr/mysql/slave2
2.2 在 master 和 slave1 和 slave2 文件夹下 创建 Dockerfile 内容为
FROM mysql
COPY my.cnf /etc/mysql/
EXPOSE 3306
CMD ["mysqld"]
2.3 在 master 和 slave1 和 slave2 文件夹下 创建 my.cnf 内容为
#master文件下的my.cnf内容为
[mysqld]
log-bin=mysql-bin //[必须]启用二进制日志
server-id=1 //[必须]服务器唯一ID,默认是1,一般取IP最后一段,这里看情况分配
#slave1文件下的my.cnf内容为
[mysqld]
log-bin=mysql-bin //[必须]启用二进制日志
server-id=2 //[必须]服务器唯一ID,默认是1,一般取IP最后一段,这里看情况分配
#slave2文件下的my.cnf内容为
[mysqld]
log-bin=mysql-bin //[必须]启用二进制日志
server-id=3 //[必须]服务器唯一ID,默认是1,一般取IP最后一段,这里看情况分配
2.4 切换到 master 目录下构建 master/mysql 镜像
#切换到master文件夹下上创建master/mysql镜像
docker build -t master/mysql .
#切换到slave1文件夹下上创建slave1/mysql镜像
docker build -t slave1/mysql .
#切换到slave2文件夹下上创建slave2/mysql镜像
docker build -t slave2/mysql .
2.5 查看是否创建成功主从镜像
docker images
3 用镜像创建容器
docker run -p 3307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=mysql -d master/mysql
docker run -p 3308:3306 --name mysql-slave1 -e MYSQL_ROOT_PASSWORD=mysql -d slave1/mysql
docker run -p 3309:3306 --name mysql-slave2 -e MYSQL_ROOT_PASSWORD=mysql -d slave2/mysql
3.1 进入主从容器终端命令
#进入master
docker exec -it mysql-master bash
#进入slave1
docker exec -it mysql-slave1 bash
#进入slave2
docker exec -it mysql-slave2 bash
#进入容器后,接着进入mysql控制器
mysql -uroot -p
4.mysql 主从配置
4.1 在主容器 的mysql控制器中输入以下命令:
# 指定ip
mysql>GRANT REPLICATION SLAVE ON *.* TO 'user'@'127.0.0.1' IDENTIFIED BY 'mysql';
# 或者所有ip
mysql>GRANT REPLICATION SLAVE ON *.* to 'user'@'%' identified by 'mysql';
然后查看主容器数据库状态:
mysql> show master status;
记录 File 的值和 Position 的值,其中 File:mysql-bin.000003 ,Position :1338
4.2 然后我们配置一下从库
#设置要连接的主服务日志的监听
mysql>change master to
master_host='127.0.0.1',
master_user='user',
master_log_file='mysql-bin.000003',
master_log_pos=445,
master_port=3306,
master_password='mysql';
#开启从服务器
mysql> start slave;
参数说明:
master_host // 这里填 master 主机 ip,命令获取:docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id
master_log_file=’mysql-bin.000003’, // 这里填写 File 的值
master_log_pos=1338, // 这里填写 Position 的值。
mysql> start slave; // 启动从服务器复制功能
如果不小心配置错, 输入 mysql> stop slave; 然后重新设置要连接的主服务日志的监听,再mysql> start slave;就解决了
5 检查主从连接状态
mysql> show slave status\G
返回结果集两个参数必须是 Yes 为 No 或者 connect 说明没有连接上:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
6.测试主从连接
注意设置主从后,操作只能在 master 终端上,slave 上的操作不会同步到 master 上。
如果从库同步出现错误:
mysql>set global sql_slave_skip_counter=1;
mysql>start slave;