十七、MYSQL MGR高可用1.MGR概念1.1 MGR 定义MGR 全称MySQL Group Replication它是 MySQL 提供的一种基于组通信和事务一致性机制的高可用复制方案。1.2 核心特征多节点组成复制组支持故障自动检测支持成员自动加入和退出支持自动选举主节点支持单主模式和多主模式1.3 MGR 架构组成MGR 典型由以下部分组成主节点Primary处理写请求向组内广播事务从节点Secondary接收并应用事务通常只提供只读服务组通信层用于节点之间交换状态维护组成员视图实现事务分发与确认一致性控制机制检测事务冲突保证事务有序提交1.4 MGR 模式介绍1. 单主模式Single-Primary Mode⭐组内只有一个主节点可写其他节点只读最常见结构清晰冲突少2. 多主模式Multi-Primary Mode多个节点都可写可能发生冲突管理复杂对业务要求高1.5 事务执行流程在单主模式下事务执行过程如下客户端把写请求发送给主节点主节点接收事务并生成写集信息主节点把事务广播给组内其他成员其他成员进行冲突检测和确认达到组内确认条件后事务提交成功事务再被应用到其他节点核心主节点不是“自己写完就算成功”提交前需要组内成员参与确认这提高了一致性也增强了故障切换时的数据可靠性2.高可用机制与生产架构2.1 故障检测与自动切换如果主节点异常组内检测到主节点失联更新成员视图在剩余可用节点中重新选举主节点新主节点接管写服务2.2 多数派机制1.多数派定义MGR 集群要继续正常工作必须满足多数节点在线。例如3 个节点时至少 2 个节点在线5 个节点时至少 3 个节点在线2. 为什么需要多数派为了避免脑裂问题。3. 脑裂解释如果网络分区后两个子集群都认为自己是“合法主集群” 就可能产生双主写入导致数据严重不一致。4. 多数派的价值保证集群中只有一边能继续提供写服务防止多个节点同时对外写入提高一致性安全性2.3 MGR 高可用原理总结多节点组成复制组节点间持续交换状态事务在组内传播并确认主节点故障后自动重新选主多数派保证集群一致性和防脑裂2.4 MGR 与传统主从复制对比对比项传统主从复制MGR节点关系主从结构组成员结构故障切换通常依赖人工或外部工具支持自动选主一致性保障较弱常为异步更强组内确认防脑裂能力较弱有多数派机制高可用能力需要额外组件原生支持较强2.5 MGR 与代理层的关系MGR负责的是数据复制主节点选举高可用机制但 MGR不负责读写分离SQL 路由客户端连接切换这些通常由ProxySQLHAProxyMySQL RouterKeepalived VIP来完成。3.具体实验案例3.1 环境准备三台机器分别为192.168.202.135 mysql1192.168.202.136 mysql2192.168.202.137 mysql3MGR 端口MySQL 端口3306Group Replication 端口33061# 三台都执行关闭防火墙并永久关闭 systemctl stop firewalld systemctl disable firewalld # 关闭 SELinux setenforce 0 # 修改主机名并互相解析 hostnamectl set-hostname mysql1 hostnamectl set-hostname mysql2 hostnamectl set-hostname mysql3 vi /etc/hosts 192.168.202.135 mysql1 192.168.202.136 mysql2 192.168.202.137 mysql3# 下载依赖工具 yum install -y yum-utils # 上传并解压mysql5.7 依赖环境的rpm包: yum install -y unzip unzip mysql5720_rpms.zip # 切换到存放所有 MySQL 及依赖 RPM 包的文件夹 cd mysql5720_rpms # yum 会自动识别当前目录下所有 .rpm 文件并处理依赖关系若本地包已包含所有依赖会直接安装若缺依赖会提示 yum localinstall -y *.rpm3.2 修改配置文件和初始密码# 启动数据库 systemctl start mysqld # 修改配置文件 vim /etc/my.cnf [mysqld] # 其他原有配置如datadir、socket等保持不变新增以下两行 validate_password_policyLOW # 降低强度策略仅检查长度 validate_password_length6 # 最小密码长度设为6位 skip-ssl # 关闭ssl访问 # 重启mysqld并设置开机自启动 systemctl restart mysqld systemctl enable mysqld # 查看mysql数据库初始密码 grep password /var/log/mysqld.logPS如果密码内容有特殊字符需要转义 \ # 进入数据库 mysql -uroot -p # 修改密码 alter user rootlocalhost identified by abc123; # 验证 show databases; # 验证2: exit 退出 mysql -uroot -pabc1233.3 修改 MySQL 配置mysql1 配置server-id1 log-binmysql-bin binlog_formatROW gtid_modeON enforce_gtid_consistencyON log_slave_updatesON master_info_repositoryTABLE relay_log_info_repositoryTABLE transaction_write_set_extractionXXHASH64 binlog_checksumNONE loose-group_replication_group_nameaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee loose-group_replication_start_on_bootoff loose-group_replication_local_address192.168.202.135:33061 loose-group_replication_group_seeds192.168.202.135:33061,192.168.202.136:33061,192.168.202.137:33061 loose-group_replication_bootstrap_groupoff loose-group_replication_single_primary_modeON loose-group_replication_enforce_update_everywhere_checksOFFmysql2 配置server-id2 log-binmysql-bin binlog_formatROW gtid_modeON enforce_gtid_consistencyON log_slave_updatesON master_info_repositoryTABLE relay_log_info_repositoryTABLE transaction_write_set_extractionXXHASH64 binlog_checksumNONE loose-group_replication_group_nameaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee loose-group_replication_start_on_bootoff loose-group_replication_local_address192.168.202.136:33061 loose-group_replication_group_seeds192.168.202.135:33061,192.168.202.136:33061,192.168.202.137:33061 loose-group_replication_bootstrap_groupoff loose-group_replication_single_primary_modeON loose-group_replication_enforce_update_everywhere_checksOFFmysql3 配置server-id3 log-binmysql-bin binlog_formatROW gtid_modeON enforce_gtid_consistencyON log_slave_updatesON master_info_repositoryTABLE relay_log_info_repositoryTABLE transaction_write_set_extractionXXHASH64 binlog_checksumNONE loose-group_replication_group_nameaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee loose-group_replication_start_on_bootoff loose-group_replication_local_address192.168.202.137:33061 loose-group_replication_group_seeds192.168.202.135:33061,192.168.202.136:33061,192.168.202.137:33061 loose-group_replication_bootstrap_groupoff loose-group_replication_single_primary_modeON loose-group_replication_enforce_update_everywhere_checksOFF# 配置完后重启 systemctl restart mysqld3.4 创建 MGR 用户# 先在 主节点 执行后同步到其他节点,登录 MySQL mysql -uroot -p # 创建复制用户 create user repl% identified by Repl123456; # 给后面安装的插件授权 grant replication slave on *.* to repl%; # 刷新 flush privileges;安装 Group Replication 插件3.5 安装 Group Replication 插件# 三台都执行 install plugin group_replication soname group_replication.so; # 确认状态是 ACTIVE。 show plugins;3.6 配置复制通道# 三台都执行 change master to master_userrepl,master_passwordRepl123456 for channel group_replication_recovery;3.7 启动节点# 启动第一个节点,先在 mysql1 上执行 set global group_replication_bootstrap_groupON; start group_replication; set global group_replication_bootstrap_groupOFF; # 查看状态 select * from performance_schema.replication_group_members; # 此时应该只有 mysql1 一个节点状态是 ONLINE。# 启动另外两个节点 # 在 mysql2 上执行 start group_replication; # 在 mysql3 上执行 start group_replication; # 然后回到任意节点查看 select * from performance_schema.replication_group_members; # 应该看到 3 个节点都在状态都是 ONLINE。3.8 测试主节点写入# 查看当前主节点 select variable_value from performance_schema.global_status where variable_namegroup_replication_primary_member;测试主节点写入单主模式下只有一个节点可以写入# 插入测试表 create database testmgr; use testmgr; create table t1 ( id int primary key auto_increment, name varchar(50) ); insert into t1(name) values(abc); # 然后到另外两个节点查询 select * from testmgr.t1;如果都能查到说明同步正常。3.9 测试高可用切换一模拟主节点故障# 当前主节点是 mysql1你执行 systemctl stop mysqld # 在另外两个节点执行 select * from performance_schema.replication_group_members;# 查看当前主节点 select variable_value from performance_schema.global_status where variable_namegroup_replication_primary_member;(二验证写入# 在新的主节点上执行 insert into testmgr.t1(name) values(def);# 然后其他节点查询看数据是否同步。 select * from testmgr.t1;4.常见问题1. 节点启动失败重点检查server-id是否唯一gtid_modeONbinlog_formatROWtransaction_write_set_extractionXXHASH6433061 端口是否放行hostname / hosts 是否解析正常2. 节点进不来组看日志tail -f /var/log/mysqld.log3. 不能写入单主模式下只有主节点能写其他节点默认只读这是正常的。