利用Docker环境来搭建6节点的MySQL集群

下面创建6个MySQL的步骤有严格要求,顺序不能颠倒,更不能漏掉某个步骤。倘若你少做了一个步骤,然后补做该步骤也不行,MySQL集群的数据同步依然失效。正确的做法是停掉所有MySQL容器,然后删掉容器和映射目录,然后重新按照下列步骤搭建数据库集群。因此你第一次搭建MySQL集群的时候,千万要认真观看视频,中途错了或者少了一个步骤,最终都要推倒重来,切记!

一、导入MySQL5.7镜像文件

本课程附带了MySQL 5.7的镜像文件,你下载了镜像文件之后,我们需要利用MobaXterm工具把镜像文件上传到Linux系统。

mysql.tar.gz 链接:https://share.weiyun.com/s2UZ725z 密码:fm4j53

因为镜像文件放在/root目录中,所以我们在命令行先进入/root目录,再执行导入MySQL镜像的命令。

cd /root
docker load < mysql.tar.gz

二、创建MySQL容器,实现读写分离

按照计划,一共要创建6个MySQL节点。其中前三个和后三个节点,都是读写分离的方案。先来搭建前三个MySQL节点。

由于Docker容器的IP地址是动态分配的,每次启动相同容器,它的IP地址都会有变化。这就非常影响数据库集群的搭建,比如说MySQL_2要同步MySQL_1的数据,MySQL_1容器的IP地址经常变来变去肯定是不行的,所以我们要给每个Docker容器都分配固定的IP地址。

Docker默认的网段是172.17.0.x的,有时候不同项目用到的容器都在同一个网段里面,难免我们使用的时候会弄混淆了。所以不同项目用到的容器最好放在不同的网段。于是我们要为咱们的项目创建一个新的网段,创建容器的时候,把它们的IP地址绑定到该网段。执行下面的命令,创建新的网段:

docker network create --subnet=172.18.0.0/18 mynet
  1. 创建MySQL_1节点

创建容器并且关联MySQL5.7镜像的命令非常简单,执行下面的命令创建出MySQL_1容器。注意:你把这段命令复制以后,在MobaXterm软件中,粘贴命令是Shift + Insert,就能把语句粘贴到命令行。

docker run -it -d --name mysql_1 -p 7001:3306 \
--net mynet --ip 172.18.0.2 \
-m 400m -v /root/mysql_1/data:/var/lib/mysql \
-v /root/mysql_1/config:/etc/mysql/conf.d  \
-e MYSQL_ROOT_PASSWORD=abc123456 \
-e TZ=Asia/Shanghai --privileged=true \
mysql:5.7.41 \
--lower_case_table_names=1

用Navicat连接本地电脑的7001端口。如果你用的是云主机,就去连接云主机的7001端口。

在Navicat上面给MySQL_1创建一个新账户,将来MySQL_2和MySQL_3订阅binlog日志的时候就用这个帐户登陆MySQL_1节点。

新账户的用户名为sync,密码是abc123456,密码加密策略一定要设置成mysql_native_password。

我们切换到服务器权限选项卡,然后勾选下面的三个权限,这三个权限都是订阅日志所必须的。

接下来我们要修改配置文件,所以要先关闭MySQL容器。运行Docker命令,关闭MySQL_1容器。

docker stop mysql_1

在/root/mysql_1/config目录里创建my.cnf文件。配置文件的内容如下:

[mysqld]
#数据库字符集
character_set_server = utf8
#MySQL编号(只可以是数字)
server_id = 1

#开启binlog日志,规定日志文件名称
log_bin = mysql_bin
#开启relaylog日志,规定日志文件名称
relay_log = relay_bin
#从库的写操作是否写入binlog日志
log-slave-updates = 1
#采用严格的SQL语句模式
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

改好配置文件,我们就可以重新启动MySQL_1节点了。

docker start mysql_1
  1. 创建MySQL_2节点

创建MySQL_2节点的命令如下,用该命令我们创建MySQL_2节点出来。容器创建成功后,你可以用Navicat去连接试试。

docker run -it -d --name mysql_2 -p 7002:3306 \
--net mynet --ip 172.18.0.3 \
-m 400m -v /root/mysql_2/data:/var/lib/mysql \
-v /root/mysql_2/config:/etc/mysql/conf.d  \
-e MYSQL_ROOT_PASSWORD=abc123456 \
-e TZ=Asia/Shanghai --privileged=true \
mysql:5.7.41 \
--lower_case_table_names=1

修改配置文件之前,照例还是要关闭MySQL节点的。

docker stop mysql_2

在/root/mysql_2/config目录里创建my.cnf文件,内容如下:

[mysqld]
#数据库字符集
character_set_server = utf8
#MySQL编号(只可以是数字)
server_id = 2

#为什么从节点要开启binlog日志?(下面有解答)
log_bin = mysql_bin
relay_log = relay_bin

#限制普通帐户无法INSERT、DELETE、UPDATE语句,但是该配置对管理员帐户无效
read-only = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

作为从节点来说,为什么要开启binlog日志呢?这是为了将来挂载更多读节点而准备的。现在我们是两个从节点与主节点同步数据,主节点的压力并不大。如果将来挂载更多的从节点,那么主节点的磁盘和网络压力就很大了,所以我们要分担主节点的压力。让从节点跟从节点去同步数据。例如下面的示意图,A3要把数据同步给A4,A3节点必须要开启binlog日志才可以。

执行Docker命令,重新运行MySQL_2节点。

docker start mysql_2

在Navicat上面通过MySQL_2节点执行SQL语句,让MySQL_2订阅MySQL_1的日志文件,实现数据同步。

#停止数据同步服务
stop slave;

#设置与MySQL_1同步数据
change master to master_host='172.18.0.2',master_port=3306,master_user='sync',master_password='abc123456';

#开启数据同步服务
start slave;

#查询数据同步状态
show slave status;

如果SQL语句执行结果中出现两个YES,说明主从同步就配置成功了。如果不成功,你就再检查上述的步骤,然后重新运行这几行SQL语句。或者先停掉容器,再删除容器和映射到/root目录的mysql目录,重新创建容器,严格遵守每个配置步骤,重新弄一遍主从同步。

  1. 配置MySQL_3节点

执行命令,创建MySQL容器。该节点与MySQL_2一样,都是读节点。

docker run -it -d --name mysql_3 -p 7003:3306 \
--net mynet --ip 172.18.0.4 \
-m 400m -v /root/mysql_3/data:/var/lib/mysql \
-v /root/mysql_3/config:/etc/mysql/conf.d  \
-e MYSQL_ROOT_PASSWORD=abc123456 \
-e TZ=Asia/Shanghai --privileged=true \
mysql:5.7.41 \
--lower_case_table_names=1

修改配置文件之前,照例还是要关闭MySQL节点的。

docker stop mysql_3

在/root/mysql_3/config目录里创建my.cnf文件,内容如下:

[mysqld]
#数据库字符集
character_set_server = utf8
#MySQL编号(只可以是数字)
server_id = 3

log_bin = mysql_bin
relay_log = relay_bin

read-only = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

执行Docker命令,重新运行MySQL_3节点。

docker start mysql_3

执行SQL语句,查看结果是不是有两个YES。

stop slave;

change master to master_host='172.18.0.2',master_port=3306,master_user='sync',master_password='abc123456';

start slave;

show slave status;
  1. 配置MySQL_4节点

因为MySQL_4是主节点,功能与MySQL_1是相同的。我们先把节点创建出来,下节课我们再去配置这两个节点的双向同步。

docker run -it -d --name mysql_4 -p 7004:3306 \
--net mynet --ip 172.18.0.5 \
-m 400m -v /root/mysql_4/data:/var/lib/mysql \
-v /root/mysql_4/config:/etc/mysql/conf.d  \
-e MYSQL_ROOT_PASSWORD=abc123456 \
-e TZ=Asia/Shanghai --privileged=true \
mysql:5.7.41 \
--lower_case_table_names=1

还是照例创建sync帐户,密码是abc123456,然后设置好三个权限。接下来还是老规矩,停掉MySQL容器。

docker stop mysql_4

在/root/mysql_4/config目录里创建my.cnf文件。配置文件的内容如下:

[mysqld]
#数据库字符集
character_set_server = utf8
server_id = 4

log_bin = mysql_bin
relay_log = relay_bin
log-slave-updates = 1
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

执行Docker命令,重新启动MySQL容器。

docker start mysql_4
  1. 配置MySQL_5节点

先执行命令,创建出MySQL容器,该节点是读节点。

docker run -it -d --name mysql_5 -p 7005:3306 \
--net mynet --ip 172.18.0.6 \
-m 400m -v /root/mysql_5/data:/var/lib/mysql \
-v /root/mysql_5/config:/etc/mysql/conf.d  \
-e MYSQL_ROOT_PASSWORD=abc123456 \
-e TZ=Asia/Shanghai --privileged=true \
mysql:5.7.41 \
--lower_case_table_names=1

改配置文件之前,照例还是要关闭MySQL节点的。

docker stop mysql_5

在/root/mysql_5/config目录里创建my.cnf文件,内容如下:

[mysqld]
#数据库字符集
character_set_server = utf8
#MySQL编号(只可以是数字)
server_id = 5

log_bin = mysql_bin
relay_log = relay_bin

read-only = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

执行Docker命令,重新运行MySQL_5节点。

docker start mysql_5

执行SQL语句,查看结果是不是有两个YES。

stop slave;

change master to master_host='172.18.0.5',master_port=3306,master_user='sync',master_password='abc123456';

start slave;

show slave status;
  1. 配置MySQL_6节点

先执行命令,创建出MySQL容器,该节点是读节点。

docker run -it -d --name mysql_6 -p 7006:3306 \
--net mynet --ip 172.18.0.7 \
-m 400m -v /root/mysql_6/data:/var/lib/mysql \
-v /root/mysql_6/config:/etc/mysql/conf.d  \
-e MYSQL_ROOT_PASSWORD=abc123456 \
-e TZ=Asia/Shanghai --privileged=true \
mysql:5.7.41 \
--lower_case_table_names=1

改配置文件之前,照例还是要关闭MySQL节点的。

docker stop mysql_6

在/root/mysql_6/config目录里创建my.cnf文件,内容如下:

[mysqld]
#数据库字符集
character_set_server = utf8
#MySQL编号(只可以是数字)
server_id = 6

log_bin = mysql_bin
relay_log = relay_bin

read-only = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

执行Docker命令,重新运行MySQL_6节点。

docker start mysql_6

执行SQL语句,查看结果是不是有两个YES。

stop slave;

change master to master_host='172.18.0.5',master_port=3306,master_user='sync',master_password='abc123456';

start slave;

show slave status;

三、配置双向主从同步

MySQL_1和MySQL_4之间要配置双向主从同步,其实很简单。就是先到MySQL_1节点上执行4条SQL语句,然后再切换到MySQL_4节点,依旧执行4条SQL语句,双向主从同步就配置完成了。

  1. 配置MySQL_1节点

在Navicat上面,到MySQL_1节点上执行4条SQL语句。以MySQL_4为主节点,订阅日志同步数据。

stop slave;

change master to master_host='172.18.0.5',master_port=3306,master_user='sync',master_password='abc123456';

start slave;

show slave status;
  1. 配置MySQL_4节点

这次该轮到去MySQL_4节点上执行4条SQL语句,以MySQL_1为主节点,订阅日志同步数据。

stop slave;

change master to master_host='172.18.0.2',master_port=3306,master_user='sync',master_password='abc123456';

start slave;

show slave status;

四、导入SQL文件

由于MySQL_1和MySQL_4都是主节点,我们在这两个节点中任意一个MySQL上面导入SQL文件,那么数据表都会同步到其余的5个MySQL节点上面。例如在MySQL_1节点上新建逻辑库,命名为his,然后把SQL文件导入到该逻辑库中。

五、关闭虚拟机的注意事项

某些同学是急性子,也不关闭虚拟机,就直接强制关闭电脑。这种情况会造成虚拟机和Docker容器产生很多故障。正确的方式必须先关虚拟机,然后再关闭电脑。如果遇上虚拟机无法启动,你要先点击清除按钮,然后就可以正常启动虚拟机了。

每次启动完虚拟机,你都要手动启动Docker服务,然后逐一启动每个容器。如果你觉得这么做太麻烦了,可以休眠虚拟机,然后关闭VirtualBox软件。

下次想用虚拟机的时候,选择恢复运行即可,免去了重新启动CentOS和Docker容器的步骤。

posted @ 2025-04-07 16:52  hwq1992  阅读(50)  评论(0)    收藏  举报