MySQL MGR高可用集群搭建与优化实践

MySQL MGR高可用集群搭建与优化实践

1. MySQL MGR高可用集群概述

MySQL Group Replication(简称MGR)是MySQL官方在5.7.17版本推出的原生高可用解决方案。与传统的异步复制和半同步复制不同,MGR基于Paxos协议实现了真正的多主架构,允许所有节点同时处理写请求,并通过组通信机制保证数据一致性。我在金融行业的生产环境中使用MGR已有三年时间,处理过多次主库故障自动切换的场景,其稳定性经受住了实际考验。

MGR的核心优势在于:

  • 自动故障检测与转移:节点故障时能在秒级完成主从切换
  • 多主写入支持:所有节点均可处理写请求(需配置为多主模式)
  • 数据强一致性:基于GTID的复制确保数据不丢失
  • 冲突检测机制:自动解决不同节点间的写冲突

2. 集群规划与环境准备

2.1 硬件配置建议

根据我的经验,生产环境建议采用以下配置:

  • 服务器:至少3台(推荐奇数台,满足Paxos多数派原则)
  • CPU:8核以上(写密集型业务需要更多计算资源)
  • 内存:16GB起步(大型数据库需要按数据量比例增加)
  • 磁盘:SSD阵列,RAID10配置(保证IOPS在5000以上)
  • 网络:万兆内网互联(节点间延迟应<1ms)

重要提示:切勿在虚拟化环境或云主机上混布MGR节点,物理隔离能避免资源争抢导致的脑裂问题。

2.2 软件版本选择

当前稳定版本组合:

  • 操作系统:CentOS 7.9/8.4或Ubuntu 20.04 LTS
  • MySQL版本:8.0.28+(建议使用最新GA版本)
  • 依赖组件:libaio、numactl、openssl

安装基础依赖包:

# CentOS yum install -y libaio numactl openssl # Ubuntu apt-get install -y libaio1 libnuma1 openssl

3. MySQL安装与基础配置

3.1 二进制包安装

推荐使用官方二进制包安装,避免编译带来的环境差异:

# 下载解压 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.28-linux-glibc2.17-x86_64.tar.xz tar xvf mysql-8.0.28-linux-glibc2.17-x86_64.tar.xz -C /usr/local/ ln -s /usr/local/mysql-8.0.28-linux-glibc2.17-x86_64 /usr/local/mysql # 创建用户和数据目录 groupadd mysql useradd -r -g mysql -s /bin/false mysql mkdir -p /data/mysql/{data,logs,tmp} chown -R mysql:mysql /data/mysql

3.2 关键参数配置

/etc/my.cnf基础配置模板:

[mysqld] # 基础配置 datadir=/data/mysql/data socket=/tmp/mysql.sock log-error=/data/mysql/logs/mysqld.log pid-file=/data/mysql/mysqld.pid # 字符集设置 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci # 连接配置 max_connections=1000 thread_cache_size=100 table_open_cache=4000 # InnoDB配置 innodb_buffer_pool_size=12G # 建议为物理内存的70% innodb_log_file_size=2G innodb_flush_log_at_trx_commit=1 innodb_flush_method=O_DIRECT

4. MGR集群搭建实战

4.1 初始化数据目录

在所有节点执行:

/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/data

使用--initialize-insecure参数可以免去初始密码,但生产环境建议使用--initialize生成随机密码并妥善保存。

4.2 启动MySQL服务

创建systemd服务文件/etc/systemd/system/mysqld.service:

[Unit] Description=MySQL Server After=network.target [Service] User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf LimitNOFILE=65535 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target

启动服务:

systemctl daemon-reload systemctl start mysqld systemctl enable mysqld

4.3 配置MGR专用参数

在每个节点的my.cnf中添加MGR专属配置:

# MGR基础配置 server_id=1 # 每个节点必须唯一 gtid_mode=ON enforce_gtid_consistency=ON binlog_checksum=NONE log_bin=binlog binlog_format=ROW master_info_repository=TABLE relay_log_info_repository=TABLE transaction_write_set_extraction=XXHASH64 # MGR插件配置 plugin_load_add='group_replication.so' group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" # 集群UUID group_replication_start_on_boot=OFF group_replication_local_address="192.168.1.101:33061" # 当前节点内网IP group_replication_group_seeds="192.168.1.101:33061,192.168.1.102:33061,192.168.1.103:33061" group_replication_bootstrap_group=OFF

4.4 创建复制专用账户

在主节点执行:

CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@1234'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; GRANT BACKUP_ADMIN ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES;

4.5 启动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; -- 检查集群状态 SELECT * FROM performance_schema.replication_group_members;

在其他节点加入集群:

-- 设置复制通道 CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='Repl@1234' FOR CHANNEL 'group_replication_recovery'; -- 启动组复制 START GROUP_REPLICATION;

5. 集群管理与监控

5.1 常用管理命令

查看集群状态:

SELECT * FROM performance_schema.replication_group_members; SELECT * FROM performance_schema.replication_group_member_stats;

手动切换主节点:

-- 在要提升为主节点的服务器上执行 STOP GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF;

5.2 监控指标配置

建议配置以下监控项:

  • 集群节点状态:group_replication_member_state
  • 事务冲突计数:count_transactions_remote_in_applier_queue
  • 网络延迟:group_replication_communication_information
  • 事务认证信息:count_transactions_in_queue

Prometheus监控示例配置:

- job_name: 'mysql_mgr' static_configs: - targets: ['192.168.1.101:9104', '192.168.1.102:9104', '192.168.1.103:9104'] metrics_path: /metrics params: collect[]: - global_status - group_replication

6. 故障处理与优化

6.1 常见问题排查

节点无法加入集群:

  1. 检查防火墙规则:iptables -L -n | grep 33061
  2. 验证网络连通性:telnet 192.168.1.102 33061
  3. 查看错误日志:tail -f /data/mysql/logs/mysqld.log

事务冲突处理:

-- 查看冲突事务 SELECT * FROM performance_schema.replication_group_member_stats WHERE member_id = @@server_uuid\G -- 临时提高冲突检测超时(秒) SET GLOBAL group_replication_transaction_size_limit=1000000;

6.2 性能优化建议

  1. 网络优化:

    • 使用专用网络接口用于MGR通信
    • 设置group_replication_compression_threshold=1000000启用压缩
  2. 参数调优:

    group_replication_flow_control_mode=QUOTA group_replication_flow_control_applier_threshold=25000 group_replication_flow_control_certifier_threshold=25000
  3. 硬件优化:

    • 为MGR流量配置QoS保证带宽
    • 使用支持RDMA的高速网卡

7. 生产环境最佳实践

7.1 安全加固措施

  1. 网络隔离:

    • 为MGR通信配置单独的VLAN
    • 使用TLS加密组通信:
      SET GLOBAL group_replication_ssl_mode='REQUIRED';
  2. 权限控制:

    REVOKE ALL PRIVILEGES ON *.* FROM 'repl'@'%'; GRANT REPLICATION SLAVE, BACKUP_ADMIN ON *.* TO 'repl'@'10.%.%.%';

7.2 备份策略

推荐采用Percona XtraBackup进行物理备份:

# 全量备份 xtrabackup --backup --target-dir=/backups/full --user=backup --password=Backup@1234 # 准备备份 xtrabackup --prepare --target-dir=/backups/full # 流式备份到远程 xtrabackup --backup --stream=xbstream --target-dir=./ | ssh backup01 "xbstream -x -C /backups/incr/"

7.3 版本升级方案

滚动升级步骤:

  1. 从最后一个加入的节点开始升级
  2. 执行STOP GROUP_REPLICATION停止组复制
  3. 升级MySQL软件包
  4. 启动新版本MySQL并加入集群
  5. 验证节点状态正常后,继续升级下一个节点

我在实际运维中发现,8.0.23+版本对大型事务的支持有明显改进,建议生产环境至少升级到此版本。