Docker如何搭建双主四从MySQL集群

后端 潘老师 6个月前 (11-16) 130 ℃ (0) 扫码查看

本文主要讲解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;

结果如下即成功

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;

结果如下即成功

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;

结果如下即成功

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;

结果如下即成功

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.panziye.com/back/11278.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】