使用docker搭建MySQL主从架构集群

拉取mysql镜像

这里拉取的是mysql 5.7版本的镜像

1
docker pull mysql:5.7

启动两个MySQL容器

启动两个MySQL容器,一个作为master,一个作为slave

master节点,将本地的 3307端口映射到容器的3306端口,密码为123456

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

slave节点,将本地的 3308端口映射到容器的3306端口,密码为123456

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

启动完成之后,可通过docker ps 查看是否启动成功。

登录到mysql中

登录到master节点中

1
mysql -uroot -h127.0.0.1 -P3307 -p123456

再启动一个命令窗口,进入到 slave节点

1
mysql -uroot -h127.0.0.1 -P3308 -p123456

配置master

通过docker exec进入容器内部

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

修改my.cnf文件

1
echo -e "[mysqld]\nserver-id=100\nlog-bin=mysql-bin" >> etc/mysql/my.cnf

其实也就是新增下面两句配置

1
2
3
4
5
[mysqld]
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin

重启mysql服务

1
service mysql restart

重启时容器会退出,我们需要重新启动一次容器

1
docker start mysql-master

配置slave

和master一样,修改my.cnf文件

1
echo -e "[mysqld]\nserver-id=101\nlog-bin=mysql-slave-bin\nrelay_log=edu-mysql-relay-bin" >> etc/mysql/my.cnf

其实也就在文件中加入下面的配置

1
2
3
4
5
6
7
[mysqld]
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin

然后重启mysql服务

1
service mysql restart

重启过程中,容器会自动退出,我们需要重新启动一次容器

1
docker start mysql-master

下一步在Master数据库创建数据同步用户,授予用户
slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。

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

将slave链接到master

先去master中查看下binlog的状态

1
mysql -uroot -h127.0.0.1 -P3307 -p123456

查看状态

1
show master status;

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

进入到slave

1
mysql -uroot -h127.0.0.1 -P3308 -p123456

链接到master

1
2
3
4
5
6
7
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= 0,
master_connect_retry=30;

注:

  • master_host Master的地址,指的是容器的独立ip,可以通过下面命令查看

    1
    docker inspect --format='{{.NetworkSettings.IPAddress}}'  mysql-master
  • master_port 容器的端口号,指的是容器内部运行mysql的端口号

  • master_user 是我们在master中配置的用户主从复制的用户名

  • master_log_file 是上一步中从master中查出File字段的值

  • master_log_pos 是复制起始点,如果为0,为从头复制

开启主从复制

在 slave 中查看主从复制状态,可以看到目前主从复制是还没有开启的。

1
show slave status \G;

开启主从复制

1
start slave;

再次查看,我们看到主从复制已经开启了。

测试主从复制

我们在master中创建一个数据库,看是否在slave中也会创建

进入到master中的mysql执行创建数据库命令

1
create database test default character set utf8;

然后进入到slave节点中查看是否有该数据库

1
show databases;


我们看到从库中已经创建了test数据库,至此我们的主从MySQL集群架构已经搭建完毕了。

-------------本文结束感谢您的阅读-------------