基于docker 搭建mysql主从复制集群

主从复制的方式

  1. 基于日志(bin log)
  2. 基于GTID(全局事务标识符)
    这篇文章采用第一种方式

前提条件

  1. 主从服务器的操作系统版本和位数需要一致
  2. mysql版本和从 mysql版本需要一致
  3. 主从数据库中的 数据 需要一致
  4. 主数据库 开启 二进制日志,主数据库和从数据库的 server_id局域网内必须 唯一

流程

1. 首先拉取镜像

docker pull mysql:5.7.26

2. 创建容器

Master(主)
docker run -p 3340:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=
123456 -d mysql:5.7.26
Slave(从)
docker run -p 3341:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=
123456 -d mysql:5.7.26

​–name 为容器指定名称,这里是mysql-master和mysql-slave
-p 将容器的指定端口映射到主机的指定端口,这里是将容器的3341和3342端口映射到主机的3306端口
-e 设置环境变量,这里是指定root账号的密码为123456
-d 后台运行容器,并返回容器ID
mysql:5.7.26 指定运行的mysql版本

使用docker ps命令查看正在运行的容器:
在这里插入图片描述

3.配置Master(主)
首先通过docker exec -it mysql-master /bin/bash进入容器内部
然后先apt-get update,完成之后apt-get install vim
紧接着vim /etc/mysql/my.cnf添加如下配置

[mysqld]
## 同一局域网内注意要唯一,最好用ip段后缀来区分
server-id= 2
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin

配置完成后,需要重启Mysql服务 ,service mysql restart,重启服务会导致docker容器stop,只要 docker start mysql-master启动容器即可
接下来,在Master中新建slave用户,并授予权限
CREATE USER 'slave'@'%'IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

  1. 配置Slave(从)
    进入mysql-slave 和上面步骤一致,然后在 my.cnf添加如下配置:
[mysqld]
## 设置server_id,注意要唯一
server-id=3
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin   
## relay_log配置中继日志
relay_log=mysql-relay-bin  

配置完同样重启。

5.链接Master(主)和Slave(从)
进入Master mysql,执行show master status;
基于docker 搭建mysql主从复制集群_第1张图片
其中File和Position等等都会用到,利用这两个可以让从库找到对应的二进制文件读取信息
6. 获取Master的地址,指的是容器的独立ip,可以通过docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id 查询容器的ip,接下来需要用到。
在这里插入图片描述
7.接下在Slave中进入mysql,执行以下操作:
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=1299, master_connect_retry=30;

命令说明:
master_port:Master的端口号,指的是容器的端口号

master_user:用于数据同步的用户

master_password:用于同步的用户的密码

master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值

master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值

master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

在Slave中执行 show slave status \G;查看主从复制状态
基于docker 搭建mysql主从复制集群_第2张图片
别急,正常情况下圈圈里都是显示NO,因为还没开启主从复制,我这里是已经开启了才显示YES。 现在只需要start slave,再次查询就可以看到两个都是YES了。然后就可以测试数据是否同步成功,这里就不演示了。
8.错误排查
如果你的Slave_IO_RUNNGING显示的是connecting,那么你可以滑倒下面查看Last_IO_Error,一般情况下错误都是因为:

  • 端口或IP地址错误,可能你防火墙没打开,亦或者如果你是阿里云服务器的话要记得提前打开安全组。
  • 密码不对,确认主从同步的用户和密码是否正确。
  • POS和FILE不对,再此检查一下
  • 主从的my.cnf配置文件可能配置错了,再检查一遍。

9.编写shell脚本
nagios监控监控slave的两个YES(Slave_IO和Slave_SQL进程),如果其中一个为no,表明主从有问题,然后发送短信警报!

你可能感兴趣的:(数据库,docker)