docker搭建mysql主从复制

系统环境

  • 操作系统:linux centos7
  • Docker环境:Docker version 1.13.1, build dded712/1.13.1 (Docker安装参考文档)
  • Mysql版本:mysql:5.7.23

环境搭建

本次搭建主库和从库不在同一台服务器上,所以需要准备两台服务器。

  • 主库:192.168.xxxx.1
  • 从库:192.168.xxxx.2

目录结构:

  • 两台服务器挂载目录相同如下所示
--home
   --mysql
      --data  //挂载mysql数据存储目录
      --conf  //挂载mysql配置文件目录   
         --my.cnf  //挂载mysql配置文件   
  • 执行命令
mkdir -p /home/mysql/data

mkdir -p /home/mysql/conf

编写master(主库)的my.cnf

  • 执行命令
vi my.cnf
  • my.cnf文件内容如下
[mysqld]

server_id = 1

log-bin= mysql-bin

read-only=0

binlog-do-db=testing

replicate-ignore-db=mysql

replicate-ignore-db=sys

replicate-ignore-db=information_schema

replicate-ignore-db=performance_schema

!includedir /etc/mysql/conf.d/

!includedir /etc/mysql/mysql.conf.d/
  • my.cnf参数说明:

参考文档:my.cnf 配置文件参数解释

log-bin :需要启用二进制日志 
server_id : 用于标识不同的数据库服务器,而且唯一
binlog-do-db : 需要记录到二进制日志的数据库 
binlog-ignore-db : 忽略记录二进制日志的数据库 
replicate-do-db :指定复制的数据库 
replicate-ignore-db :不复制的数据库 
relay_log :从库的中继日志,主库日志写到中继日志,中继日志再重做到从库 log-slave-updates :该从库是否写入二进制日志,如果需要成为多主则可启用。只读可以不需要

replicate-do-db :指定复制的数据库 replicate-ignore-db :不复制的数据库 relay_log :从库的中继日志,主库日志写到中继日志,中继日志再重做到从库 log-slave-updates :该从库是否写入二进制日志,如果需要成为多主则可启用。只读可以不需要

编写slave的my.cnf

  • 执行命令
vi my.cnf
  • my.cnf文件内容如下
[mysqld]

server_id = 2

log-bin= mysql-bin

relay_log_recovery=on

read-only=1

binlog-do-db=testing

replicate-ignore-db=mysql

replicate-ignore-db=sys

replicate-ignore-db=information_schema

replicate-ignore-db=performance_schema

!includedir /etc/mysql/conf.d/

!includedir /etc/mysql/mysql.conf.d/

启动master主库

docker run -d  -v /home/mysql/data:/var/lib/mysql  -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf  -v /etc/localtime:/etc/localtime -p 3306:3306 --name  master -e MYSQL_ROOT_PASSWORD=Test@2018     mysql:5.7.23
  • 进入容器内部
docker exec -it master /bin/bash

mysql -u root -p

  • 用户赋予一定权限
GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY 'Test@2018'; FLUSH PRIVILEGES;

注意: FLUSH PRIVILEGES;这个命令必须填写,否则上面设置的用户权限失效。


  • 查看master数据库状态,命令如下:
show master status;

docker搭建mysql主从复制_第1张图片

启动slave从库

docker run -d -v /home/mysql/data:/var/lib/mysql  -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf  -v /etc/localtime:/etc/localtime -p 3306:3306 --name  slave -e MYSQL_ROOT_PASSWORD=Test@2018     mysql:5.7.23
  • 进入容器内部
docker exec -it slave /bin/bash

mysql -u root -p

  • 用户赋予一定权限
GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY 'Test@2018'; FLUSH PRIVILEGES;
  • 在slave数据库中配置主从关系关联:
change master to
master_host='192.168.xxxx.1',
master_port=3306,
master_user='root',
master_password='Test@2018',
master_log_file='mysql-bin.000004',
master_log_pos=345;
  • 参数说明
change master to

master_host='192.168.xxxx.1',   //Master 服务器Ip地址,也就是上面写的192.168.88.22

master_port=3306,   //Master 端口号

master_user='root',  //Master 用户名

master_password='Test@2018',   //Master 用户密码

master_log_file='mysql-bin.000004', //Master 服务器产生的日志要和Master服务器所配置的相互对应(与上面截图中的file对应)

master_log_pos=345;//要和Master服务器所配置的相互对应(与上面截图中的)Position对应)
  • 在salve数据库中启动服务,命令如下:
start slave;
  • 在salve数据库中查看启动状态,命令如下:
show slave status\G;

注意:下图中的 Slave_IO_Running 和 Slave_SQL_Running 是Yes才是OK的。
docker搭建mysql主从复制_第2张图片

搭建到这里就算搭建完成了,接下来可以尝试改动主库中的数据,看从库是否自动同步。(注意本次搭建指定记录testing数据库的二进制日志,因此只同步testing数据库中的内容)

安装过程遇到的问题

  • 如果 Slave_IO_Running 为NO

    在slave从库中的配置文件my.cnf加入:relay_log_recovery=on
    然后重新启动mysql容器,在容器内部重新启动slave:start slave;

  • 如果 Slave_SQL_Running 为NO
    存在多种情况,可能是你要同步的数据库在从库中不存在,所以要在从库中新建相对应的数据库。

    其它情况(建议只是尝试):将在slave数据库中配置主从关系关联步骤中的参数:master_log_pos值改为0:master_log_pos=0;
    然后在salve数据库中重新启动服务:start slave;
    再次查看slave的启动状态:show slave status\G;

你可能感兴趣的:(docker搭建mysql主从复制)