章
目
录
本文主要讲解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集群的全部内容,这些步骤你学会了吗?希望本文对你有帮助。欢迎持续关注潘子夜个人博客,学习愉快哦!