Docker的Mysql主从复制

ecat 5个月前 (2019-06-12) 273

摘要

用Docker搭建MySQL5.7主从服务器获取docker MySQL5.7版本镜像docker pull mysql:5.7 启动2个MySQ...

用Docker搭建MySQL5.7主从服务器

获取docker MySQL5.7版本镜像

docker pull mysql:5.7

 

启动2个MySQL5.7容器

主3011

docker run -d -p 3011:3306 --name mysql3011 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7


从3012

docker run -d -p 3012:3306 --name mysql3012 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

-d 容器启动后后台运行
-p 将容器3306 端口映射到宿主机3011端口
-e 指定容器内的环境变量,初始化MySQL  root密码为123456


使用docker ps 查看正在运行的容器

4.png


使用工具测试连接


配置主(3011)MySQL环境配置

docker exec -it mysql3011 /bin/bash  #进入容器内存

 修改my.cnf文件

vim /etc/mysql/my.cnf
#添加
[mysqld]
# 同一局域网内注意要唯一
server-id=100  
# 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin

bash: vi: command not found,需要在docker容器内部自行安装vim。执行apt-get update,然后再次执行apt-get install vim即可成功安装vim


添加完成之后,需要重启mysql服务使配置生效

service mysql restart

重启mysql服务时会使得docker容器停止,还需要重新启动docker容器

docker start mysql-master


创建数据同步用户,并授权。用于在主从库之间同步数据。

mysql -uroot -p123456                                              #登录mysql
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';                    #创建用户
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
flush privileges;                  # 刷新权限,使其生效


配置从(3012)MySQL环境配置

和主(3011)一样,配置文件/etc/mysql/my.cnf 中添加

[mysqld]
# 设置server_id,注意要唯一
server-id=101  

# 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin   
# relay_log配置中继日志
relay_log=edu-mysql-relay-bin

配置完成后重启服务和容器


配置主从复制

查询容器的独立ip

docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id

7.png


主(3011)mysql 执行

[root@localhost ~]mysql -uroot -p123456
mysql>show master status;

6.png

File和Position字段的值将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。


从(3012)mysql 执行

[root@localhost ~]mysql -uroot -p123456
mysql> change master to master_host='172.18.0.7', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 769, master_connect_retry=30;

命令说明:
master_host :MySQL 的ip地址
master_port:MySQL的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒



查看主从同步状态

show slave status \G;

8.png

SlaveIORunning 和 SlaveSQLRunning 都是No,因为还没有开启主从复制过程。


使用start slave;开启主从复制过程,然后再次查询主从同步状态show slave status \G;

9.png

SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启


排错:
如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态。一般是下面几种原因造成的
1.网络不通,检查ip,端口
2.密码不对,检查是否创建用于同步的用户和用户密码是否正确
3.pos不对,检查Master的 Position

stop slave ;     #停止salve 
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave ;     #修改完成再启动


测试主从复制


再主MySQL创建一个测试数据库,然后在从MySQL查看是否也新建了

11.png

有好的文章希望我们帮助分享和推广,猛戳这里欢迎来稿

分享到:
未经允许不得转载

作者:ecat
原文地址: https://www.yijinxi.com/docker/137.html发布于5个月前 (2019-06-12)
转载或复制请以超链接形式并注明出处一个简单的

3

0

发表评论中国互联网举报中心

快捷回复:

验证码

    评论列表 (暂无评论,共273人参与)参与讨论

    还没有评论,来说两句吧...