# 使用Docker搭建Mysql主从

使用Docker拉取MySQL镜像,使用5.7版本 我们可以先使用search命令查询一下mysql镜像,选择官方版本

docker pull mysql:5.7
1

下载完成后,可以使用如下命令查看mysql镜像:

docker images
1

# 使用下载好的镜像搭建MySQL主从

Master:

docker run -p 3301:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
1

Slave:

docker run -p 3302:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
1

Master 对外映射的端口号是 3301 Slave 对外映射的端口号是 3302 可以自己随意设置。因为docker容器是相互隔离的,每个容器有其独立的IP地址,所以不同容器使用相同的端口并不会冲突。如果是在生产环境,肯定是在不同的机器上安装MySQL,相对来说会简单一些。

# 配置Master

使用如下命令进入到Master容器内部,使用容器ID或者名称均可:

# docker exec -it XXXXXX /bin/bash		 # XXXXXX为容器ID
docker exec -it mysql-master /bin/bash		 # mysql-master为容器名称
1
2

需要在docker内部安装vim工具

apt-get update && apt-get install vim
1

修改配置文件

vim /etc/mysql/mysql.conf.d/mysqld.cnf 
1
[mysqld]
#上面还有一些原有配置,别动,追加即可
#复制下面的
server-id=100  
log-bin=master-bin
binlog-format=ROW
1
2
3
4
5
6

配置完成后,需要重启mysql服务使其修改的配置文件生效,使用如下命令使mysql进行重启

service mysql restart
1

重启会导致docker容器停止,使用如下命令重新启动容器:

docker start mysql-master
1

# 创建数据库同步账户

使用docker命令重新进入到Master容器内部:

docker exec -it mysql-master /bin/bash
1

在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。登录到mysql客户端:

mysql -uroot -p123456
1

创建用户并授权:(注意是这个里面mysql> )

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
1
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
1

至此,Master配置完成。


# 配置Slave

类似于Master,使用docker命令docker exec -it mysql-slave /bin/bash 进入到slave容器中,进入到etc/mysql路径,使用vim命令编辑my.cnf文件:

使用如下命令进入到slave容器内部,使用容器ID或者名称均可:

docker exec -it mysql-slave /bin/bash
1

同样需要在docker内部安装vim工具

apt-get update && apt-get install vim
1

修改配置文件

vim /etc/mysql/mysql.conf.d/mysqld.cnf 
1
[mysqld]
#上面还有一些原有配置,别动,追加即可
#复制下面的
server-id=101
log-bin=mysql-slave-bin
relay_log=mysql-relay-bin  
1
2
3
4
5
6

配置完成后,需要重启mysql服务使其修改的配置文件生效,使用如下命令使mysql进行重启

service mysql restart
1

重启会导致docker容器停止,使用如下命令重新启动容器:

docker start mysql-slave
1

slave配置完成


# 开启Master-Slave主从复制

进入Master库mysql客户端:输入

show master status;
1

查看Master状态:

记住File和Position (就是master-bin.000001和617,下面要用),后面需要用到。此时一定不要操作Master库,否则将会引起Master状态的变化,File和Position字段也将会进行变化。

进入到Slave库mysql客户端,执行如下命令:

change master to master_host='172.17.0.3', master_user='slave', master_password='123456', master_port=3306, master_log_file='master-bin.000001', master_log_pos=617, master_connect_retry=30;
1

命令说明: master_host :Master库的地址,指的是容器的独立ip,可以通过

docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master
1
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-slave
1

查询 如下所示: master_port:Master的端口号,指的是容器的端口号 (查到啥就填啥) master_user:用于数据同步的用户 master_password:用于同步的用户的密码 master_log_file:即上文中提到的 File 字段的值 (对应master-bin.000001) master_log_pos:从哪个 Pos 开始读,即上文中提到的 Position 字段的值 (对应617) master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

在Slave 中的mysql终端执行

show slave status \G;
1

用于查看主从同步状态。

使用以下开启slave主从复制

start slave;
1

再次查询主从同步状态

show slave status \G;
1

使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error提示予以排除。

1、网络不通:检查ip,端口 2、密码不对:检查是否创建用于同步的用户和用户密码是否正确 3、pos不对:检查Master的 Position 4、试试关闭防火墙

service firewalld stop
#重启时不会再启动防火墙
systemctl disable firewalld.service
1
2
3

正常启动后如下:

Slave_IO_Running 和 Slave_SQL_Running 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。

大功告成,主从创建表和库测试去吧

over

如果不成功再参考一下这两篇文章 文章1 (opens new window) 文章2 (opens new window)