Docker之MySQL_GROUP_REPLICATION组复制(MGR)、宕机节点恢复和Spirngboot整合

三台服务器修改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=NONE

log_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官网》
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值