主从同步

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;