MySQL MGR 集群
MGR (MySQL Group Replication) 提供了多节点状态同步,支持自动成员管理与故障检测,建议作为生产环境的首选高可用方案。
本指南介绍如何在三个节点上构建基于原生 Group Replication 的单主模式集群,并配置 MySQL Router 实现透明访问。
集群节点规划
| 服务器IP | 主机角色 | 部署服务 |
|---|---|---|
| 10.206.0.2 | Primary (引导节点) | MySQL、MySQL Router、MySQL Shell |
| 10.206.0.3 | Secondary | MySQL、MySQL Router、MySQL Shell |
| 10.206.0.4 | Secondary | MySQL、MySQL Router、MySQL Shell |
MySQL 服务部署
本章节涵盖了二进制环境部署 MySQL 的步骤。为确保集群基础一致性,以下步骤需在集群内的 每一个节点 上分别完整执行。
-
下载安装包
wget https://pdpublic.mingdao.com/private-deployment/offline/common/mysql-8.0.45-linux-glibc2.17-x86_64.tar.xz -
解压安装包并移动至安装路径
tar -xvf mysql-8.0.45-linux-glibc2.17-x86_64.tar.xzmv mysql-8.0.45-linux-glibc2.17-x86_64 /usr/local/mysql -
添加 mysql 到
PATH环境变量echo 'export PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.shsource /etc/profile.d/mysql.sh -
创建系统用户与相关目录
useradd -U -r -s /sbin/nologin mysqlmkdir -p /data/mysqlmkdir -p /data/logs/mysqlchown -R mysql:mysql /data/mysql /data/logs/mysql /usr/local/mysql/ -
创建
/etc/my.cnf配置文件配置文件修改要点在将以下内容写入服务器之前,请务必根据当前节点的实际环境修改以下参数:
server-id:每个节点必须唯一,建议按顺序递增(如 1, 2, 3)。report_host:填写当前服务器的真实内网 IP 地址。group_replication_local_address:填写当前服务器的真实内网 IP(端口默认为 33061)。group_replication_group_seeds:填写集群内所有 3 个节点的 IP 及端口列表。
cat > /etc/my.cnf <<'EOF'[mysqld]user = mysqlbasedir = /usr/local/mysqldatadir = /data/mysqlsocket = /usr/local/mysql/mysqld.sockpid-file = /usr/local/mysql/mysqld.pidlog-error = /data/logs/mysql/mysqld.logserver-id = 1bind-address = 0.0.0.0port = 3306mysqlx_port = 33060skip-name-resolve = ONmax_connections = 5000default_storage_engine = InnoDBinnodb_buffer_pool_size = 2Gcharacter_set_server = utf8mb4collation_server = utf8mb4_0900_ai_cislow_query_log = 1slow_query_log_file = /data/logs/mysql/mysql-slow.loglong_query_time = 1log_bin = /data/mysql/mysql-binbinlog_format = ROWsync_binlog = 1binlog_expire_logs_seconds = 2592000# --- GTID & Replication ---gtid_mode = ONenforce_gtid_consistency = ONlog_slave_updates = ONmaster_info_repository = TABLErelay_log_info_repository = TABLEtransaction_write_set_extraction = XXHASH64binlog_transaction_dependency_tracking = WRITESETreplica_parallel_type = LOGICAL_CLOCKreplica_parallel_workers = 4replica_preserve_commit_order = ON# --- Group Replication (MGR) ---report_host = 10.206.0.2report_port = 3306plugin_load_add = 'group_replication.so'group_replication_group_name = "c9f6d3f2-7b21-4e5a-9c87-3a0e9f0a43d2"group_replication_start_on_boot = OFFgroup_replication_local_address = "10.206.0.2:33061"group_replication_group_seeds = "10.206.0.2:33061,10.206.0.3:33061,10.206.0.4:33061"group_replication_single_primary_mode = ONgroup_replication_enforce_update_everywhere_checks = OFFgroup_replication_recovery_get_public_key = ON[client]port = 3306socket = /usr/local/mysql/mysqld.sock[mysql]default-character-set = utf8mb4EOF -
配置 systemd 管理文件
cat > /etc/systemd/system/mysql.service <<'EOF'[Unit]Description=MySQL Database ServerDocumentation=man:mysqld(8) http://dev.mysql.com/doc/After=network.targetWants=network-online.targetAfter=network-online.target[Service]Environment=MYSQLD_PARENT_PID=1User=mysqlGroup=mysqlType=forkingPIDFile=/usr/local/mysql/mysqld.pidExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --daemonizeExecStop=/bin/kill -s SIGTERM $MAINPIDLimitNOFILE=102400LimitMEMLOCK=infinityRestart=on-failureOOMScoreAdjust=-500TimeoutSec=0[Install]WantedBy=multi-user.targetEOF -
初始化 mysql
mysqld --no-defaults --initialize --datadir=/data/mysql/ --user=mysql --log-error=/data/logs/mysql/mysqld.log -
启动 mysql
systemctl daemon-reloadsystemctl enable mysqlsystemctl start mysql -
登录 mysql 修改初始密码
使用初始化生成的临时密码登录:
mysql -uroot -p$(grep 'temporary password' /data/logs/mysql/mysqld.log | awk '{print $NF}')登录后在 MySQL 内依次执行以下命令:
-- 修改当前 root 用户密码ALTER USER USER() IDENTIFIED BY '123456';RESET MASTER;-- 创建允许远程连接的 root 用户SET SQL_LOG_BIN=0;CREATE USER 'root'@'%' IDENTIFIED BY '123456';GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;SET SQL_LOG_BIN=1;- 命令中设置的 root 用户密码为
123456,实际部署必须修改为强口令 - 若密码中包含特殊字符,仅允许
-或_,禁止使用@ ! # &等字符,以避免兼容性问题
- 命令中设置的 root 用户密码为
构建 MGR 集群
- 全节点准备:同步用户创建、通道凭证设置等基础配置需在 所有节点 执行。
- 引导与成组:初始化集群引导(Bootstrap)仅在 第一个节点 执行,其余节点只需执行加入操作。
-
创建主从复制同步用户
在每个节点上执行以下命令,创建用于组复制同步的账户:
SET SQL_LOG_BIN=0;CREATE USER 'repl'@'%' IDENTIFIED BY '123456';GRANT REPLICATION SLAVE, CONNECTION_ADMIN, BACKUP_ADMIN, GROUP_REPLICATION_STREAM ON *.* TO 'repl'@'%';SET SQL_LOG_BIN=1;- 命令中设置的组复制同步帐号 repl 密码为
123456,实际部署必须修改为强口令 - 若密码中包含特殊字符,仅允许
-或_,禁止使用@ ! # &等字符,以避免兼容性问题
- 命令中设置的组复制同步帐号 repl 密码为
-
配置组复制恢复通道
在每个节点上执行以下命令,完成组复制恢复通道凭证配置。注意将密码替换为实际的同步账号 repl 密码:
CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery'; -
启动并初始化 MGR 组
MGR 集群必须由一个节点发起“引导”,其它节点方可加入。请务必按以下顺序执行:
-
A. 第一台节点 (引导初始化) 执行以下命令,开启引导模式并初始化集群:
SET GLOBAL group_replication_bootstrap_group=ON;START GROUP_REPLICATION;SET GLOBAL group_replication_bootstrap_group=OFF; -
B. 其它节点 (加入现有集群) 在第一台节点初始化成功后,在其余节点执行以下命令加入组:
START GROUP_REPLICATION;
-
-
检查组成员信息
SELECT * FROM performance_schema.replication_group_members;正常状态应看到所有节点
MEMBER_STATE = ONLINE,并且只有一个PRIMARY节点,其余为SECONDARY。 -
修改
/etc/my.cnf文件中group_replication_start_on_boot参数值为ON在每个节点上执 行。初始化阶段为防止引导冲突将该参数设为了
OFF,集群建立成功后需将其开启,以确保节点重启后能自动重新加入 MGR 复制组:sed -ri 's|group_replication_start_on_boot.*|group_replication_start_on_boot = ON|g' /etc/my.cnfgrep group_replication_start_on_boot /etc/my.cnf -
滚动重启并验证节点状态
在每个节点上依次执行,重启一个节点后务必确认其状态恢复为
ONLINE,再操作下一个节点:# 1. 重启服务systemctl restart mysql# 2. 检查节点状态 (确保当前所有活跃节点 MEMBER_STATE 均为 ONLINE)mysql -uroot -p123456 -e 'SELECT * FROM performance_schema.replication_group_members;'
开启 InnoDB Cluster
-
全节点操作:需在所有节点下载并安装 MySQL Shell (
mysqlsh) 软件包。 -
单节点操作:InnoDB Cluster 的初始化配置仅需在 第一个节点 (Primary) 上执行一次即可。
-
下载 mysqlsh 安装包
wget https://pdpublic.mingdao.com/private-deployment/offline/common/mysql-shell-8.0.45-linux-glibc2.17-x86-64bit.tar.gz -
解压安装包并移动至安装路径
tar -xvf mysql-shell-8.0.45-linux-glibc2.17-x86-64bit.tar.gzmv mysql-shell-8.0.45-linux-glibc2.17-x86-64bit /usr/local/mysql-shell -
添加 mysqlsh 到 PATH 环境变量
echo 'export PATH=/usr/local/mysql-shell/bin:$PATH' > /etc/profile.d/mysql-shell.shsource /etc/profile.d/mysql-shell.sh -
连接 PRIMARY 节点 (仅首个节点执行)
mysqlsh --uri root@10.206.0.2:3306 -p123456 -
初始化创建 InnoDB Cluster
var cluster = dba.createCluster('hap-mysql') -
查看集群状态
cluster.status()- 重新登录后需要先
var cluster = dba.getCluster()才可以使用cluster.status()
- 重新登录后需要先