尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MySQL MGR高可用集群部署与优化实战

MySQL MGR高可用集群部署与优化实战 1. MySQL MGR高可用集群概述MySQL Group Replication简称MGR是MySQL官方在5.7版本推出的原生高可用解决方案。与传统的基于binlog的主从复制不同MGR采用Paxos协议实现多主节点间的数据一致性提供了自动故障检测、成员管理、冲突解决等核心功能。我在实际生产环境中部署过多个MGR集群最大的一个集群支撑了日均上亿级别的交易量稳定运行超过两年。MGR的核心优势在于多主写入所有节点均可读写不像传统主从架构存在单点写入瓶颈自动故障转移节点故障时无需人工干预集群自动重新配置数据强一致基于组通信协议保证所有节点数据最终一致冲突检测内置机制解决多主写入时的冲突问题重要提示虽然MGR支持多主模式但在实际生产环境中除非有明确的分布式写入需求否则建议使用单主模式以获得更好的性能表现。2. 环境准备与基础配置2.1 服务器规划建议一个标准的MGR集群至少需要3个节点才能保证高可用性。以下是推荐的服务器配置组件最低配置生产环境推荐配置CPU2核16核以上内存4GB64GB磁盘100GB SSDNVMe SSD (RAID10)网络1Gbps10Gbps节点间专用网络操作系统CentOS 7/Ubuntu 18.04RHEL 8我在某金融项目中的实际配置是3台物理服务器每台配备2颗Intel Xeon Gold 6248R处理器48核/96线程、384GB内存、2块1.6TB NVMe SSDRAID1节点间通过40Gbps光纤网络互联。2.2 MySQL安装与基础配置在所有节点上安装相同版本的MySQL建议使用5.7.17或8.0。以CentOS为例# 添加MySQL官方YUM源 sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm # 安装MySQL Server sudo yum install -y mysql-community-server # 启动MySQL服务 sudo systemctl start mysqld sudo systemctl enable mysqld获取临时密码并修改root密码# 获取临时密码 grep temporary password /var/log/mysqld.log # 登录MySQL mysql -uroot -p # 修改密码MySQL 8.0 ALTER USER rootlocalhost IDENTIFIED BY YourNewStrongPassword!;基础配置文件/etc/my.cnf需要包含以下MGR相关参数[mysqld] # 通用配置 server_id1 # 每个节点必须唯一 gtid_modeON enforce_gtid_consistencyON binlog_checksumNONE # MGR专用配置 plugin_load_addgroup_replication.so transaction_write_set_extractionXXHASH64 group_replication_group_nameaaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa # 集群UUID group_replication_start_on_bootOFF group_replication_local_addressnode1:33061 # 当前节点地址 group_replication_group_seedsnode1:33061,node2:33061,node3:33061 # 所有节点地址特别注意group_replication_group_name必须在所有节点保持一致可以使用SELECT UUID()生成。3. MGR集群初始化与节点加入3.1 第一个节点的引导在第一个节点上执行以下SQL命令初始化集群-- 创建复制专用用户 CREATE USER repl% IDENTIFIED BY ReplPassword123!; GRANT REPLICATION SLAVE ON *.* TO repl%; GRANT BACKUP_ADMIN ON *.* TO repl%; FLUSH PRIVILEGES; -- 设置组复制引导 SET GLOBAL group_replication_bootstrap_groupON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_groupOFF; -- 验证集群状态 SELECT * FROM performance_schema.replication_group_members;正常输出应显示一个ONLINE状态的成员------------------------------------------------------------------------------ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | ------------------------------------------------------------------------------ | group_replication_applier | ... | node1 | 3306 | ONLINE | ------------------------------------------------------------------------------3.2 添加其他节点在其他节点上执行加入集群操作-- 同样先创建复制用户密码需一致 CREATE USER repl% IDENTIFIED BY ReplPassword123!; GRANT REPLICATION SLAVE ON *.* TO repl%; GRANT BACKUP_ADMIN ON *.* TO repl%; FLUSH PRIVILEGES; -- 加入集群不需要bootstrap START GROUP_REPLICATION USERrepl, PASSWORDReplPassword123!; -- 验证状态 SELECT * FROM performance_schema.replication_group_members;成功加入后输出应显示所有节点均为ONLINE状态。我在实际部署中发现新节点加入时如果数据量很大可能需要较长时间同步。此时可以通过观察replication_group_members表中新节点的MEMBER_STATE字段值来跟踪进度RECOVERING正在从donor节点同步数据ONLINE已成功加入集群ERROR加入过程中出现错误4. 生产环境优化与监控4.1 关键性能参数调优根据我的调优经验以下参数对MGR性能影响最大# InnoDB配置 innodb_buffer_pool_size12G # 建议为物理内存的50-70% innodb_log_file_size2G # 大事务场景可增大到4G innodb_flush_log_at_trx_commit1 innodb_io_capacity2000 # SSD建议值 innodb_io_capacity_max4000 # 组复制优化 group_replication_flow_control_modeQUOTA group_replication_flow_control_applier_threshold25000 group_replication_flow_control_certifier_threshold25000 group_replication_transaction_size_limit20971520 # 20MB group_replication_compression_threshold1000000 # 1MB以上启用压缩4.2 监控方案实施完善的监控是保障MGR集群稳定运行的关键。我通常部署以下监控项基础指标监控节点存活状态CPU/内存/磁盘使用率网络流量和延迟MySQL专用监控-- 集群状态 SELECT * FROM performance_schema.replication_group_members; -- 复制延迟 SELECT MEMBER_ID, COUNT_TRANSACTIONS_IN_QUEUE AS tx_in_queue, COUNT_TRANSACTIONS_CHECKED AS tx_checked, COUNT_TRANSACTIONS_REMOTE_IN_APPLIER_QUEUE AS remote_tx_in_queue FROM performance_schema.replication_group_member_stats; -- 冲突检测 SELECT * FROM performance_schema.replication_group_member_stats WHERE COUNT_CONFLICTS_DETECTED 0;告警规则配置任何节点状态非ONLINE超过30秒复制延迟超过5秒检测到写冲突流控被激活4.3 常见故障处理经验场景1脑裂问题当网络分区发生时可能出现多个子组各自认为自己是主组的情况。我的处理步骤确认网络连通性恢复选择数据最完整的子组作为主组在其他子组上执行STOP GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_groupON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_groupOFF;剩余节点重新加入场景2大事务导致复制卡住MGR对大事务支持有限建议将大事务拆分为多个小事务调整group_replication_transaction_size_limit监控replication_group_member_stats中的事务队列场景3新节点加入失败常见原因包括网络不通或防火墙阻止33061端口GTID不一致复制用户权限不足 排查步骤检查错误日志/var/log/mysqld.log验证网络连通性telnet donor_node 33061确认SHOW SLAVE STATUS输出5. 高级主题与最佳实践5.1 读写分离实现虽然MGR所有节点均可读写但生产环境通常配置读写分离减轻主节点压力。我常用的方案使用ProxySQL实现自动路由-- ProxySQL配置示例 INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (10,node1,3306),(10,node2,3306),(10,node3,3306), (20,node1,3306); # 写组只包含主节点 -- 路由规则 INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply) VALUES (1,1,^SELECT.*FOR UPDATE,20,1), # 写操作路由到写组 (2,1,^SELECT,10,1); # 读操作路由到读组应用层分离 在代码中区分读写数据源写操作连接主节点读操作随机选择从节点。5.2 备份策略MGR虽然提供高可用但仍需定期备份。我的备份方案组合物理备份# 使用MySQL Enterprise Backup或Percona XtraBackup xtrabackup --backup --target-dir/backups/full --slave-info \ --userbackup_user --passwordbackup_password逻辑备份mysqldump --single-transaction --master-data2 --routines \ --triggers --all-databases full_backup.sql备份验证定期进行恢复演练校验备份文件完整性监控备份耗时与存储空间5.3 版本升级策略升级MGR集群需要谨慎操作我的标准流程在一个从节点上测试新版本兼容性滚动升级从节点停止组复制STOP GROUP_REPLICATION;升级MySQL软件包重启MySQL服务重新加入集群START GROUP_REPLICATION;最后升级主节点手动切换主节点SELECT group_replication_set_as_primary(new_primary_member_id);重复从节点升级步骤关键经验升级前务必在测试环境验证并确保有完整的备份。我曾遇到过一个案例从5.7升级到8.0时因为字符集设置不一致导致数据不一致最后不得不从备份恢复。6. 生产环境踩坑实录6.1 网络抖动导致集群不稳定在某次部署中集群频繁出现节点失联经排查发现根本原因云服务器之间的网络延迟偶尔超过组复制超时时间默认5秒解决方案调整参数group_replication_member_expel_timeout10延长超时配置专用网络通道避免与其他业务流量竞争启用网络QoS保证复制流量优先级6.2 磁盘IO瓶颈引发流控一个高负载系统经常出现写入变慢分析发现replication_group_member_stats显示流控频繁激活磁盘监控显示IOPS经常达到上限优化措施升级为NVMe SSD调整InnoDB IO相关参数增加group_replication_flow_control_*阈值6.3 大表DDL操作导致集群阻塞执行ALTER TABLE添加索引时整个集群变慢原因MGR需要同步DDL并在所有节点执行改进方案使用pt-online-schema-change工具在业务低峰期操作设置group_replication_transaction_size_limit限制大事务经过这些优化后该集群成功支撑了双十一期间比平日高5倍的交易量平均延迟保持在20ms以下。
返回列表