docker mysql5.7主从复制搭建(双主双从)

1.1 简单说明

这里用了两台服务器,分别是161,163,有条件可以用四台

  • 161服务器 :

11备(mysql-5.7-master-161  mysql-5.7-slave-161

端口:3339 3340

  • 163服务器 :

11备(mysql-5.7-master-163  mysql-5.7-slave-163

端口:3339 3340

  • docker镜像

mysql:5.7

1.2 这分别构建容器

  • 拉取镜像:
docker pull mysql:5.7
  • 分别创建容器:

(可以挂载配置文件,这里没有挂载)

161服务器:

docker run -itd --name=mysql-5.7-master-161 -p 3339:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

docker run -itd --name=mysql-5.7-slave-161 -p 3340:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

163服务器.

docker run -itd --name=mysql-5.7-master-163 -p 3339:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

docker run -itd --name=mysql-5.7-slave-163 -p 3340:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

分别进入容器修改配置文件:(没有挂载文件的需要vim命令修改配置)

apt-get update
apt-get install vim

分别修改配置文件:

 vim /etc/mysql/my.cnf  

4份配置文件添加信息如下:(可相应去补充其他的)

161-master======

[mysqld]
server-id=1
log-bin=mysql-bin
skip-name-resolve
log-slave-updates
lower_case_table_names=1
interactive_timeout=7200
wait_timeout=86400
max_connections=4000
back_log=100
expire_logs_days=3
max_binlog_size=100M
character_set_server=utf8
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

161-slave======

[mysqld]
server-id=2
log-bin=mysql-slave-bin
relay_log=edu-mysql-relay-bin
skip-name-resolve
log-slave-updates=1
lower_case_table_names=1
interactive_timeout=7200
wait_timeout=86400
max_connections=4000
back_log=100
expire_logs_days=3
max_binlog_size=100M
character_set_server=utf8
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

   163-master======

[mysqld]
server-id=3
log-bin=mysql-bin
skip-name-resolve
log-slave-updates
lower_case_table_names=1
interactive_timeout=7200
wait_timeout=86400
max_connections=4000
back_log=100
expire_logs_days=3
max_binlog_size=100M
character_set_server=utf8
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
163-slave======
[mysqld]
server-id=4
log-bin=mysql-slave-bin
relay_log=edu-mysql-relay-bin
skip-name-resolve
log-slave-updates=1
lower_case_table_names=1
interactive_timeout=7200
wait_timeout=86400
max_connections=4000
back_log=100
expire_logs_days=3
max_binlog_size=100M
character_set_server=utf8
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

1.3 配置文件字段说明

Server-id

ID值唯一的标识了复制群集中的主从服务器,因此它们必须各不相同。Master_id必须为12321之间的一个正整数值,slave_id值必须为22321之间的一个正整数值。

Log-bin

表示打开binlog,打开该选项才可以通过I/O写到Slaverelay-log,也是可以进行replication的前提。

Binlog-do-db

表示需要记录二进制日志的数据库。如果有多个数据可以用逗号分隔,或者使用多个binlog-do-dg选项。

Binglog-ingore-db

表示不需要记录二进制日志的数据库,如果有多个数据库可用逗号分隔,或者使用多binglog-ignore-db选项。

Replicate-do-db

表示需要同步的数据库,如果有多个数据可用逗号分隔,或者使用多个replicate-do-db选项。

Replicate-ignore-db

表示不需要同步的数据库,如果有多个数据库可用逗号分隔,或者使用多个replicate-ignore-db选项。

Master-connect-retry

master-connect-retry=n表示从服务器与主服务器的连接没有成功,则等待n秒(s)后再进行管理方式(默认设置是60s)。如果从服务器存在mater.info文件,它将忽略些选项。

Log-slave-updates

配置从库上的更新操作是否写入二进制文件,如果这台从库,还要做其他从库的主库,那么就需要打这个参数,以便从库的从库能够进行日志同步。

Slave-skip-errors

在复制过程,由于各种原因导致binglo中的sql出错,默认情况下,从库会停止复制,要用户介入。可以设置slave-skip-errors来定义错误号,如果复制过程中遇到的错误是定义的错误号,便可以路过。如果从库是用来做备份,设置这个参数会存在数据不一致,不要使用。如果是分担主库的查询压力,可以考虑。

1.4 配置主从、主主

  • 创建slave角色,用于数据同步。

   分别进入在161和163服务器的主库容器中:

 

docker exec -it mysql-5.7-master-161 /bin/bash
mysql -uroot -p123456
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
flush privileges;

  

docker exec -it mysql-5.7-master-163 /bin/bash
mysql -uroot -p123456
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
flush privileges;
  • 配置主从连接

    在宿主机161、163分别执行命令

 docker inspect mysql-5.7-master-161
 docker inspect mysql-5.7-master-163

              161的是172.17.0.2 主从之间基于此ip,可能docker重启ip会发生改变,也可以用宿主机host的ip和端口

              163的是172.17.0.3

              下面分别在161、163配置主从连接

                    1) 161-master:

        show master status;

  

              关注file和position的值

                  2) 161-slave:

show slave status \G;
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000004', master_log_pos=1490;
start slave;
show slave status \G;

                   change操作前要先stop slave;

  • 配置主主连接

             分别去对应show master status;查看对应的动态参数。

#主机2复制主机1命令
change master to master_host='xxx.xx.x.161',
master_port=3339,
master_user='slave', 
master_password='123456', 
master_log_file='mysql-bin.000003',
master_log_pos=1306,
master_connect_retry=60;

#主机1复制主机2命令
change master to master_host='xxx.xx.x.163',
master_port=3339,
master_user='slave', 
master_password='123456', 
master_log_file='mysql-bin.000005',
master_log_pos=769,
master_connect_retry=60;

  关联主从,主主之间主要关注:

      master_host,master_log_file,master_log_pos字段
  • 验证

 

posted @ 2020-07-07 09:18  半城狂客  阅读(656)  评论(0编辑  收藏  举报