行业资讯 2025年08月6日
0 收藏 0 点赞 862 浏览 7170 个字
摘要 :

文章目录 1. 搭建docker环境 2. docker下载mysql5.7版本镜像 3. docker创建MySQL_1节点容器  指令说明: 4. 修改配置文件 5. docker创建MySQL_2节点容器 6. docker创……




  • 1. 搭建docker环境
  • 2. docker下载mysql5.7版本镜像
  • 3. docker创建MySQL_1节点容器
    •  指令说明:
  • 4. 修改配置文件
  • 5. docker创建MySQL_2节点容器
  • 6. docker创建MySQL_3节点容器
  • 7. docker创建MySQL_4节点容器
  • 8. docker创建MySQL_5节点容器
  • 9. docker创建MySQL_6节点容器
  • 10. 配置双向主从同步
  • 11、如何管理mysql集群
  • 12、考虑数据库集群读写一致性的问题
    •  写入和查询间隔时间太短
    • 主从同步失效
  • 13、总结

本文主要讲解Docker如何搭建双主四从MySQL集群,让我们来一起学习下相关的搭建步骤吧!

1. 搭建docker环境

如果你本地没有docker,那就先装一个吧,具体参考《Docker安装、运行、卸载—Docker学习教程(2)》这篇文章就行。

2. docker下载mysql5.7版本镜像

docker pull mysql:5.7

3. docker创建MySQL_1节点容器

docker默认的网段是172.17.0.x,为了和别的项目区分,创建新的网段

docker network create --subnet=172.19.0.0/16 mynet

创建容器并且关联MySQL5.7镜像命令,成功后即可连接数据库,访问权限需要在用户管理中将主机修改为%或者新创建一个用户赋予权限(推荐)

docker run -it -d --name mysql_1 -p 7001:3306 
    --net mynet --ip 172.19.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 
   --lower_case_table_names=1 

 指令说明:

  • “docker run”: “启动一个新的Docker容器。”,
  • “-it”: “让容器的shell交互模式启动,即你可以与容器进行交互。”,
  • “-d”: “以后台模式运行容器。”,
  • “–name mysql_1”: “为容器指定一个名称,名为mysql_1。”,
  • “-p 7001:3306”: “端口映射,将主机的7001端口映射到容器的3306端口。”,
  • “–net mynet”: “将容器连接到名为mynet的网络。”,
  • “-ip 172.19.0.2”: “为容器指定一个IP地址。”,
  • “-m 400m”: “限制容器使用的最大内存为400兆字节。”,
  • “-v /root/mysql_1/data:/var/lib/mysql”: “挂载卷。将主机上的/root/mysql_1/data目录映射到容器的/var/lib/mysql目录。”,
  • “-v /root/mysql_1/config:/etc/mysql/conf.d”: “挂载卷。将主机上的/root/mysql_1/config目录映射到容器的/etc/mysql/conf.d目录。”,
  • “-e MYSQL_ROOT_PASSWORD=abc123456”: “设置环境变量。在这里,你设置了MySQL的root用户的密码为abc123456。”,
  • “-e TZ=Asia/Shanghai”: “设置环境变量。在这里,你设置了容器的时区为上海。”,
  • “–privileged=true”: “以特权模式运行容器,容器内可以执行一些特权操作。”,
  • “mysql:5.7”: “指定要运行的Docker镜像,这里是mysql的5.7版本。”,
  • “–lower_case_table_names=1”: “设置MySQL的一个特定参数,让MySQL在存储表名时始终使用小写。”

4. 修改配置文件

修改配置文件前,先关闭MySQL容器

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

随后在重新启动容器

docker start mysql_1

5. docker创建MySQL_2节点容器

创建容器

docker run -it -d --name mysql_2 -p 7002:3306 
    --net mynet --ip 172.19.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 
   --lower_case_table_names=1

停止容器

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

启动容器

docker start mysql_2

同步操作

在mysql_2的数据库中操作

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

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

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

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

结果如下即成功Docker如何搭建双主四从MySQL集群

6. docker创建MySQL_3节点容器

创建容器

docker run -it -d --name mysql_3 -p 7003:3306 
    --net mynet --ip 172.19.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 
   --lower_case_table_names=1

停止容器

docker stop mysql_3

/root/mysql_3/config目录里创建my.cnf文件

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

#开启binlog日志,规定日志文件名称
log_bin = mysql_bin
relay_log = relay_bin

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

在mysql_3的数据库中操作

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

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

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

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

结果如下即成功Docker如何搭建双主四从MySQL集群

7. docker创建MySQL_4节点容器

创建容器并且关联MySQL5.7镜像命令,成功后即可连接数据库,访问权限需要在用户管理中将主机修改为%或者新创建一个用户赋予权限(推荐)

docker run -it -d --name mysql_4 -p 7004:3306 
    --net mynet --ip 172.19.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 
   --lower_case_table_names=1
   

修改配置文件前,先关闭MySQL容器

docker stop mysql_4

/root/mysql_4/config目录里创建my.cnf文件

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

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

随后在重新启动容器

docker start mysql_4

8. docker创建MySQL_5节点容器

创建容器

docker run -it -d --name mysql_5 -p 7005:3306 
    --net mynet --ip 172.19.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 
   --lower_case_table_names=1

停止容器

docker stop mysql_5

/root/mysql_2/config目录里创建my.cnf文件

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

#开启binlog日志,规定日志文件名称
log_bin = mysql_bin
relay_log = relay_bin

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

启动容器

docker start mysql_5

同步操作

在mysql_2的数据库中操作

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

#设置与MySQL_4同步数据
change master to master_host=\'172.19.0.5\',master_port=3306,master_user=\'root\',master_password=\'abc123456\';

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

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

结果如下即成功Docker如何搭建双主四从MySQL集群

9. docker创建MySQL_6节点容器

创建容器

docker run -it -d --name mysql_6 -p 7006:3306 
    --net mynet --ip 172.19.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 
   --lower_case_table_names=1

停止容器

docker stop mysql_6

/root/mysql_6/config目录里创建my.cnf文件

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

#开启binlog日志,规定日志文件名称
log_bin = mysql_bin
relay_log = relay_bin

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

启动容器

docker start mysql_6

同步操作

在mysql_6的数据库中操作

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

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

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

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

结果如下即成功Docker如何搭建双主四从MySQL集群

10. 配置双向主从同步

配置MySQL_1节点

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

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

#设置与MySQL_4同步数据
change master to master_host=\'172.19.0.5\',master_port=3306,master_user=\'root\',master_password=\'abc123456\';

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

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

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

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

#设置与MySQL_4同步数据
change master to master_host=\'172.19.0.2\',master_port=3306,master_user=\'root\',master_password=\'abc123456\';

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

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

接下来就可以mysql_1和mysql_2两个数据库进行增删改操作进行验证了

提供一个测试表SQL

-- 创建表  
CREATE TABLE employees (  
  employee_id INT PRIMARY KEY,  
  first_name VARCHAR(50),  
  last_name VARCHAR(50),  
  department VARCHAR(50),  
  salary DECIMAL(10, 2)  
);  
  
-- 插入数据  
INSERT INTO employees (employee_id, first_name, last_name, department, salary)  
VALUES  
  (1, \'John\', \'Doe\', \'IT\', 5000.00),  
  (2, \'Jane\', \'Smith\', \'HR\', 6000.00),  
  (3, \'Mike\', \'Johnson\', \'Sales\', 7000.00),  
  (4, \'Emily\', \'Brown\', \'Marketing\', 8000.00),  
  (5, \'David\', \'Wilson\', \'Finance\', 9000.00);

11、如何管理mysql集群

那么以上双主四从的mysql集群搭建好了该如何去管理呢?有兴趣的朋友可以看下《如何安装MyCat并管理MySQL集群》这篇文章哦。

12、考虑数据库集群读写一致性的问题

 写入和查询间隔时间太短

假设我们要执行的insert语句发送给了MySQL_1节点执行,但是紧接着马上执行了select语句,这个查询语句被MyCat转发给MySQL_2执行。假设insert和select语句之间间隔短到1毫秒,导致MySQL_2还没有同步写入的数据,查询语句就来了,自然是查询不到刚刚插入的数据。

解决方法:redis事务

主从同步失效

假设因为网络不同的问题导致主从同步失效,导致MySQL_1写入的数据没有同步到MySQL_2,这样就可能查不到刚才写入的数据。

解决方法:可以写监控程序,每隔1秒钟执行一次show slave status语句,查看是否包含两个Yes。如果数据同步失效就立即发送邮件告警处理。

13、总结

以上就是docker如何搭建双主四从MySQL集群的全部内容,这些步骤你学会了吗?希望本文对你有帮助。欢迎持续关注潘子夜个人博客,学习愉快哦!

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/9781.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号