Docker之MySQL_GROUP_REPLICATION组复制(MGR)、宕机节点恢复和Spirngboot整合
创始人
2024-03-21 20:28:35
0

三台服务器修改hosts文件

vim /etc/hosts

追加内容

192.168.1.11   node1
192.168.1.12   node2
192.168.1.13   node3

修改hostname

vim /etc/hostname

重启网络使配置文件生效

systemctl restart network

三台服务器拉取MySQL镜像

docker pull mysql:8.0.23

创建配置文件夹

mkdir -p /docker_data/mysql/conf/
vim /docker_data/mysql/conf/my.cnf

内容如下

[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
default_authentication_plugin=mysql_native_password

三台服务器开放3306和33061端口

firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=33061/tcp --permanent
firewall-cmd --reload

三台服务器启动MySQL容器

必须使用连通宿主机ip的网络

docker run -d --network=host --name mysql --privileged=true --restart=always -v /docker_data/mysql/data:/var/lib/mysql -v /docker_data/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql-8.0.23 mysql:8.0.23

启动以后进入mysql容器,安装插件

docker exec -it mysql-8.0.23 bash
#容器执行:mysql -uroot -p
#输入mysql密码
#安装插件
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
#退出mysql容器,回到宿主机,修改配置文件

修改配置文件

vim /docker_data/mysql/conf/my.cnf

追加内容
三台服务器除了server_id和group_replication_local_address不同其它全部相同

[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
port=3306
character-set-server=utf8mb4
default_authentication_plugin=mysql_native_password#MGR
#其他存储引擎,包括临时MEMORY存储引擎,可能会导致组复制中出现错误。
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
#服务唯一ID
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONElog_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64
#添加MGR插件(如果是docker则在容器里安装后再写入以下配置,否则启动会报错,因为你没有安装插件)
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=OFF
#根据当前服务器的别名配置,如:你当前服务器是node2那就改成node2,然后server_id改成2或者其它不重复的,node1~3都是自定义的
group_replication_local_address= "node1:33061"
group_replication_group_seeds= "node1:33061,node2:33061,node3:33061"
group_replication_bootstrap_group=OFF

保存配置文件,重启mysql容器

docker restart mysql-8.0.23

三台服务器执行SQL

#先禁用二进制日志
SET SQL_LOG_BIN=0;
CREATE USER copy@'%' IDENTIFIED BY 'copy';
GRANT REPLICATION SLAVE ON *.* TO copy@'%';
GRANT CONNECTION_ADMIN ON *.* TO copy@'%';
GRANT BACKUP_ADMIN ON *.* TO copy@'%';
#GRANT GROUP_REPLICATION_STREAM ON *.* TO copy@'%';
FLUSH PRIVILEGES;
#重新启用二进制日志
SET SQL_LOG_BIN=1;
#启动单主模式主从复制
CHANGE MASTER TO MASTER_USER='copy', MASTER_PASSWORD='copy' FOR CHANNEL 'group_replication_recovery';

主库执行SQL

我的是node1

SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
#查看组复制情况
SELECT * FROM performance_schema.replication_group_members;

成功则查询出如下所示内容:

+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | ec4f4975-7480-11ed-a4eb-000c29993f4c | node1       |        3306 | ONLINE       | PRIMARY     | 8.0.23         |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+

从库执行SQL

即node1和2

START GROUP_REPLICATION;
# 从库查看MGR组信息
SELECT * FROM performance_schema.replication_group_members;

3096错误:启动GROUP_REPLICATION命令失败,因为有初始化组通信层时出错。

  1. 修改hosts文件,然后使hosts文件生效
  2. docker启动时没有使用宿主机的网络–network=host --name mysql

主节点宕机,MGR自动选主测试

手动停止主节点node1,模拟宕机

docker stop mysql-8.0.23

任一从节点执行SQL,发现从节点node2变成了主节点(PRIMARY)

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | c40efe0e-7480-11ed-aeda-00505629a57a | node2       |        3306 | ONLINE       | PRIMARY     | 8.0.23         |
| group_replication_applier | ce0f8f45-7480-11ed-b616-0050562dbd10 | node3       |        3306 | ONLINE       | SECONDARY   | 8.0.23         |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+

重启node1节点,加入组

docker start mysql-8.0.23

node1执行SQL

#重启后必须执行START GROUP_REPLICATION;重新加入组,否则节点不会自动加入组
START GROUP_REPLICATION;
#任一节点执行查询节点信息SQL
SELECT * FROM performance_schema.replication_group_members;

node1变成从节点

+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | c40efe0e-7480-11ed-aeda-00505629a57a | node2       |        3306 | ONLINE       | PRIMARY     | 8.0.23         |
| group_replication_applier | ce0f8f45-7480-11ed-b616-0050562dbd10 | node3       |        3306 | ONLINE       | SECONDARY   | 8.0.23         |
| group_replication_applier | ec4f4975-7480-11ed-a4eb-000c29993f4c | node1       |        3306 | ONLINE       | SECONDARY   | 8.0.23         |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+

常见问题

组中 MySQL 服务器的最大数量是多少?

一个组最多可以包含 9 台服务器。正在尝试添加 具有 9 个成员的组的另一个服务器导致请求 加入被拒绝。此限制已从测试中确定 并将基准测试作为小组执行的安全边界 在稳定的局域网上可靠运行。

如何和springboot整合?

可以通过Apache ShardingSphere-JDBC实现高可用。
《Shardingsphere官网》
在这里插入图片描述

相关内容

热门资讯

律师进阶:直面对金钱的喜爱 律师这个职业,已经从光鲜亮丽的精英群体逐步走向了平常职业。但是想要做好律师,难度却一点也没减少。 律...
公安部有关部门下发通知要求 依... 本报北京12月26日讯 记者张晨 2026年元旦、春节将至,节令食品和假期餐饮进入消费高峰期。为切实...
重庆建工集团股份有限公司 关于... 本公司董事会及全体董事保证本公告内容不存在任何虚假记载、误导性陈述或者重大遗漏,并对其内容的真实性、...
产能闲置vs退役潮来袭:动力电... 来源:财联社 中国新能源汽车市场连续多年的高速增长,正将动力电池回收产业推至一个关键的十字路口。 财...
*ST建艺[002789]关于... 本版导读 2025-12-27 2025-12-27 2025-12-27 2025...
诺普信定增与减持并行 年内诉讼... 【深圳商报讯】(记者 詹钰叶)深圳诺普信作物科学股份有限公司(下称诺普信)最近连发两条关于实际控制人...
释新闻|美国在公海扣押委内瑞拉... 继在加勒比海域集结大批军力并对涉嫌运送毒品的船只进行打击之后,特朗普如今又把目标对准了油轮。自12月...
亿晶光电科技股份有限公司关于累... 本公司董事会及全体董事保证本公告内容不存在任何虚假记载、误导性陈述或者重大遗漏,并对其内容的真实性、...
重庆四方新材股份有限公司 关于... 证券代码:605122 证券简称:四方新材 公告编号:2025-080 重庆四方新材股份有限公司 关...
深圳市建艺装饰集团股份有限公司... ■ 深圳市建艺装饰集团股份有限公司 关于诉讼的进展公告 本公司及董事会全体成员保证信息披露的内容真实...