Linux下基于 Docker 搭建 MySQL 主从复制(1 Master+2 Slave)

 

1、准备环境

CentOS   7.2 64位 (CentOS-7-x86_64-DVD-1511.iso)

MySQL   10.244.87.144/library/mysql5.7/centos7.3:0.4(此为内网的镜像,根据实际需要进行选择镜像地址

Docker   1.13.1

 

2、安装Docker

执行命令:  yum –y install docker

安装成功后,查看Docker版本,执行命令: docker version

 

3、启动Docker

执行命令: systemctl start docker

=====================================================================================================================

如果命令执行之后,错误信息中出现如” SELinux is not supported with the overlay2 graph driver on this kernel错误-yellowcong”,

原因是此linux的内核中的SELinux不支持 overlay2 graph driver ,解决方法有两个,要么启动一个新内核,要么就在docker里禁用selinux,–selinux-enabled=false

Linux下基于 Docker 搭建 MySQL 主从复制(1 Master+2 Slave)_第1张图片

=====================================================================================================================

启动成功之后,将Docker设置为开机启动,

执行命令:systemctl enable docker

 

4、安装MySQL

使用Docker拉取MySQL镜像,镜像地址: 10.244.87.144/library/mysql5.7/centos7.3:0.4

=====================================================================================================================

在拉取之前,需要做些配置并登陆成功才能拉取到内网的镜像。

执行命令:vi /etc/docker/daemon.json  ,加入如下内容,并且保存退出

{

  "insecure-registries":["10.244.87.144","10.37.218.29:5000"]

}

如果/etc/docker/下不存在daemon.json文件,则创建之后再加入以上内容。

 

执行重启Docker命令:

systemctl stop docker 
systemctl daemon-reload
按照上步提示sss
systemctl start docker 

 

执行登陆命令: docker login 10.244.87.144, 用户名和密码都是输入admin,确保登录成功。

 

如果是在minikube环境中,此时如果还不能登陆成功,

执行命令:vi /usr/lib/systemd/system/docker.service

Linux下基于 Docker 搭建 MySQL 主从复制(1 Master+2 Slave)_第2张图片

把红色圈起来的这一行只保留这么多就可以了,其他的删掉。然后重启docker服务 
重启方式: 
systemctl stop docker 
systemctl daemon-reload
按照上步提示 
systemctl start docker 
重新连接 

=====================================================================================================================

执行Pull命令: docker pull 10.244.87.144/library/mysql5.7/centos7.3:0.4

Linux下基于 Docker 搭建 MySQL 主从复制(1 Master+2 Slave)_第3张图片

 

5、运行主从容器

执行命令:

docker run --name master -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d 10.244.87.144/library/mysql5.7/centos7.3:0.4

docker run --name slave1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d 10.244.87.144/library/mysql5.7/centos7.3:0.4

docker run --name slave2 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -d 10.244.87.144/library/mysql5.7/centos7.3:0.4

 

--name 为容器指定名称,这里是master

-p 将容器的指定端口映射到主机的指定端口,这里是将容器的3306端口映射到主机的3306端口

-e 设置环境变量,这里是指定root账号的密码为admin

-d 后台运行容器,并返回容器ID

 

执行命令:docker ps –a, 显示所有的容器,检验master容器是否启动成功,注意status是UP状态,才表示正在运行中

 

开放3306端口

执行命令:

firewall-cmd --zone=public --add-port=3306/tcp --permanent

firewall-cmd --reload

systemctl restart firewalld.service

--permanent 表示永久开启,避免下次开机需要再次手动开启端口

 

6、修改MySQL配置环境

进入容器,执行命令:docker exec -it master /bin/bash

查看my.cnf路径,执行命令:find / -name 'my.cnf'

找到路径后,

如果容器内部支持”vi”命令,则可以直接修改,如果不支持,则复制出去修改之后再复制回来

docker cp  master:/etc/mysql/my.cnf /usr/local/mysql/master/my.cnf

docker cp  /usr/local/mysql/master/my.cnf master: /etc/mysql/my.cnf


修改my.cnf,在 [mysqld] 节点最后加上

log-bin=mysql-bin 

server-id=1

两个必须都加上,不能遗漏,而且必须放在[mysqld] 节点最后,修改后保存退出。

log-bin=mysql-bin 使用binary logging,mysql-bin是log文件名的前缀    

server-id=1唯一服务器ID,非0整数,不能和其他服务器的server-id重复

Linux下基于 Docker 搭建 MySQL 主从复制(1 Master+2 Slave)_第4张图片

退出容器,执行命令: exit

 

重启MySQL的Docker,让配置生效

执行命令: docker restart master

启动后,重新测试连接,连接成功表示主容器配置成功

 

同样的方法配制从容器,需要注意的是server-id不能重复,同时也要注意下server-uuid也不能和主库重复,如果重复的话重新生成下(参见第8步的问题解决部分),并且配制完毕后需要重启容器。

 

7、创建主容器的复制账号

Linux下基于 Docker 搭建 MySQL 主从复制(1 Master+2 Slave)_第5张图片

主库创建一个用户供从库登录主库进行数据同步。

在图形化界面中执行SQL:

SET sql_mode = (SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' IDENTIFIED BY '123456';

FLUSH PRIVILEGES;

查看授权是否成功

SHOW GRANTS for  'backup'@'%';

Linux下基于 Docker 搭建 MySQL 主从复制(1 Master+2 Slave)_第6张图片

 

8、配置主从复制

使用Navicat连接从库后新建查询,执行以下SQL:

 

SET sql_mode = (SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

-- STOP SLAVE;

CHANGE MASTER TO

MASTER_HOST='192.168.248.129',   -- 宿主机IP地址

MASTER_PORT=3306,                           -- 主容器的端口

MASTER_USER='backup',                     -- 主容器MysQL的用户名

MASTER_PASSWORD='123456',                   -- 主容器MysQL的密码

MASTER_LOG_FILE='mysql-bin.000001',  -- 在主库中执行SHOW MASTER STATUS,将File列值填到此处

MASTER_LOG_POS=1985;                           -- 在主库中执行SHOW MASTER STATUS,将Position列值填到此处

START SLAVE;

 

=====================================================================================================================

如果执行以上语句报“[Err] 1794 - Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log.”错误,

执行 show variables like 'server_id';

Linux下基于 Docker 搭建 MySQL 主从复制(1 Master+2 Slave)_第7张图片

发现server_id为0,配置文件中的配置没有生效,经检查,log-bin=mysql-bin 和 server-id=2 一定要在 [mysqld] 节点下加上

=====================================================================================================================

 

语句执行完毕后,查看是否配置成功

继续在查询分析器中执行: SHOW SLAVE STATUS;

查看 Slave_IO_Running与Slave_SQL_Running

如果都是Yes,那么说明已经配置成功。

 

=====================================================================================================================

如果Slave_IO_Running是Connecting,查看下Last_IO_Error的报错信息,这种情况一般是1、网络不通 2、端口未映射 3 密码不对 4  pos不对

Linux下基于 Docker 搭建 MySQL 主从复制(1 Master+2 Slave)_第8张图片

首先确保从库能访问到主库,在命令行里进行访问测试,

如果网络通畅密码正确,那么检查下第7步是否操作成功,如果第7步账号授权没问题,则再排查下端口问题,确保端口已经开放,并   执行了systemctl restart firewalld.service 命令,如果以上都没问题,再检查设置下pos 的位置要主库的一致。

如果Slave_IO_Running是No,查看一下Last_IO_Error列的信息,或者查看下错误日志,具体原因具体解决,比如可能会遇到” Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs;  these UUIDs must be different for replication to work.”,这种情况是因为主库和从库的一个配置文件auto.cnf中的server-uuid节点发生了重复造成的,解决的方式就是重命名从库的auto.cnf文件,

然后重启mysql服务,再次查看slave的状态已经正常。

=====================================================================================================================

 

9、进行主从测试

在主库中新建一个数据库,再新建一个表,表里再随便插入一些数据,观察两个从库是否能同步操作及数据。

你可能感兴趣的:(Docker)