此文章为基于MySQL 5.7.32 撰写,内容为 MGR 架构与半同步复制架构互相转换实施。
为节约时间仅部署双节点数据库进行测试,实际生产建议至少安装三节点数据库,MGR 遵循多数存活理念,即三台服务器的集群,允许其中一台宕机。
以下对本文涉及的复制架构进行简介:
半同步复制:介于异步复制和完全同步复制之间。主库等待至少一个从库接收并记录事件(所需的从库数量是可配置的),然后提交事务。主库不会等待所有从库都确认收到,它只需要来自一个从库的确认,而不是事务已在从库端完全执行和提交。因此,半同步复制可以保证当主库崩溃时,主库已提交的所有事务都已传输到至少一个从库。
MGR:MySQL Group Replication (MGR) 是 MySQL 5.7.17 版本中引入的高可用性和高扩展性解决方案,可作为插件使用。MGR 基于分布式 paxos 协议,实现组复制,保证数据一致性。内置故障检测和自动选择主功能,只要集群中大部分节点宕机,就可以继续正常工作。提供单主模式和多主模式,多主模式支持多点写入。
一、环境检查
- 系统版本
- 关闭防火墙
- 服务器信息
10.186.62.92 MGR-node1
10.186.62.35 MGR-node2
-
MySQL 版本
- 5.7.32
二、主机名绑定
三、MGR 参数配置node1
#基本参数
[mysqld]
####: for global
skip_ssl
user =mysql3318
basedir =/usr/local/mysql
datadir =/database/mysql/data/3318
tmpdir =/database/mysql/tmp/3318
port =3318
log_error =err.log
pid_file =mysqld.pid
socket =mysqld.sock
disabled_storage_engines=archive,blackhole,example,federated,memory,merge,ndb
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so;validate_password=validate_password.so"
transaction_isolation =READ-COMMITTED #RC
#MGR复制框架
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
#MGR设置
#定义用于生成标识与事务相关联的哈希算法,在组复制中用于分布式冲突检测和处理。
transaction_write_set_extraction=XXHASH64
#告知插件加入或创建组命名,UUID
loose-group_replication_group_name="fb3f2ad0-8d25-11eb-96d3-02000aba3e5c"
#server启动时不自启组复制,为了避免每次启动自动引导具有相同名称的第二个组,所以设置为OFF。
loose-group_replication_start_on_boot=off
#告诉插件使用IP地址,端口33181用于接收组中其他成员转入连接
loose-group_replication_local_address="10.186.62.92:33181"
#启动组server,种子server,加入组应该连接这些的ip和端口;其他server要加入组得由组成员同意
loose-group_replication_group_seeds="10.186.62.92:33181,10.186.62.35:33181,10.186.62.66:33181"
loose-group_replication_bootstrap_group=off
report_host=10.186.62.92
report_port=3318
plugin_load_add='group_replication.so'
四、MGR 参数配置 node2
- 将 node1 的参数拷贝至 node2
-
修改 MGR-node2 节点 /etc/my.cnf 文件中如下三个参数为自身参数即可。
-
server_id
-
loose-group_replication_local_address
- report_host
#[MGR]
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="fb3f2ad0-8d25-11eb-96d3-02000aba3e5c"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="10.186.62.35:33181"
loose-group_replication_group_seeds="10.186.62.92:33181,10.186.62.35:33181,10.186.62.66:33181"
loose-group_replication_bootstrap_group=off
report_host=10.186.62.35
report_port=3318
plugin_load_add='group_replication.so'
五、重启MySQL使参数生效
- systemctl restart mysql3318
六、安装 MGR 插件,设置复制账号
- 所有 MGR 节点都要执行
- 语句如下:
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
验证成功加载插件
show plugins ;
SET SQL_LOG_BIN=0;
CREATE USER rpl_mgr@'10.186.62.%' IDENTIFIED WITH sha256_password BY 'ZZQzzq123###';
GRANT REPLICATION SLAVE ON *.* TO rpl_mgr@' 10.186.62.%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_mgr', MASTER_PASSWORD='ZZQzzq123###' FOR CHANNEL 'group_replication_recovery';
七、启动 MGR 单主模式
-
启动 MGR ,在主库(10.186.62.92)节点上执行
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
SELECT * FROM performance_schema.replication_group_members;
主节点可读写
-
从库(10.186.62.35)加入集群
reset master;
START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;
从节点只读
八、验证同步正常
- Master 创建数据库
- Slave 查看已同步
九、开启 MGR 时尝试启动半同步
- 在 Master 创建用户 repl 用于半同步操作
CREATE USER repl@'10.186.62.%' IDENTIFIED WITH sha256_password BY 'ZZQzzq123###';
GRANT REPLICATION SLAVE ON *.* TO repl@'10.186.62.%';
FLUSH PRIVILEGES;
-
在从库进行 change master 操作
CHANGE MASTER TO MASTER_HOST='10.186.62.92',MASTER_USER='repl',MASTER_PORT=3318,MASTER_PASSWORD='ZZQzzq123###',MASTER_AUTO_POSITION=1;
-
执行 START SLAVE ;
-
复制报错
- 结论:开启 MGR 时,无法启动半同步复制。
十、MGR 切换为半同步
- Slave 执行
停止MGR
STOP GROUP_REPLICATION;
卸载MGR插件
UNINSTALL PLUGIN group_replication;
-
在 Master 执行步骤1
-
Slave 查看当前 MGR 信息
SELECT * FROM performance_schema.replication_group_members;
- Master 查看当前 MGR 信息
-
启动半同步
- 若已执行过 步骤9的1-2则直接在 Slave 上执行 START SLAVE ;
- 否则在 Slave 上执行步骤9的1-3即可
- 查看复制状态
- 在 Master 创建库
- Slave 上验证已同步
-
永久注释 MGR 插件
必要时可在 /etc/my.cnf 中注释如下参数,使 MySQL 不自动加载 MGR 插件
#plugin_load_add='group_replication.so'
十一、半同步切换为 MGR
- Slave 上停用半同步
STOP SLAVE;
SET GLOBAL SUPER_READ_ONLY = OFF;
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
-
Master 上启动 MGR
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
-
Slave 加入集群
START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;