(超详细版 | 带细节注释 | 可直接落地 | 永久学习参考)
本教程无跳步、无省略、全细节,覆盖:环境初始化 → MGR 集群搭建 → KeepAlived 流量高可用 → 故障切换 → 运维巡检 → 避坑指南,完全适配企业生产环境,你日后直接照着配置即可。
结合此文升级高并发架构,满足高可用下的高并发场景
一、前置核心信息(先牢记,所有配置基于此)
1. 集群架构(3 节点 单主模式 + VIP + KeepAlived)
| 节点角色 | 主机名 | 物理 IP | 网卡名 | MGR 角色 | KeepAlived 角色 |
|---|---|---|---|---|---|
| 初始主节点 | mgr-node1 | 192.168.1.10 | eth0 | PRIMARY | MASTER (优先级 150) |
| 备节点 1 | mgr-node2 | 192.168.1.11 | eth0 | SECONDARY | BACKUP (优先级 120) |
| 备节点 2 | mgr-node3 | 192.168.1.12 | eth0 | SECONDARY | BACKUP (优先级 100) |
| 业务统一访问 VIP | - | 192.168.1.100 | eth0 | 浮动 IP | KeepAlived 管理 |
2. 生产硬性规范(细节!不满足必报错)
- 3 台服务器同机房、低延迟(网络延迟 < 1ms,MGR 禁止跨机房)
- MySQL 版本完全一致(8.0.30+ 稳定版)
- 节点数必须奇数(3/5/7,满足 Raft 协议)
- 关闭 SELinux、时间同步(Chrony)、防火墙放通指定端口
- 仅使用 InnoDB 引擎,开启 GTID
- KeepAlived 依赖VRRP 协议,必须放行
二、第一步:全节点基础环境初始化(3 台机器都执行)
1. 配置主机名 + hosts 解析(细节:避免 IP 依赖)
# 节点1执行
hostnamectl set-hostname mgr-node1
# 节点2执行
hostnamectl set-hostname mgr-node2
# 节点3执行
hostnamectl set-hostname mgr-node3
# 所有节点执行:绑定hosts(MGR/KeepAlived依赖主机名解析)
cat >> /etc/hosts << EOF
192.168.1.10 mgr-node1
192.168.1.11 mgr-node2
192.168.1.12 mgr-node3
EOF
2. 关闭 SELinux(生产必关,否则权限报错)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
getenforce # 验证:输出 Permissive 即可
3. 时间同步(MGR 强依赖时间一致,细节!)
yum install -y chrony
systemctl start chronyd && systemctl enable chronyd
chronyc tracking # 验证时间同步状态
4. 防火墙精细化放行(生产不关闭防火墙,细节!)
# 放行MySQL端口(3306)、MGR组通信端口(33061)、KeepAlived VRRP协议
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --add-port=33061/tcp --permanent
firewall-cmd --add-protocol=vrrp --permanent
firewall-cmd --reload
firewall-cmd --list-all # 验证放行规则
5. 系统内核优化(MySQL 生产基础配置)
cat >> /etc/sysctl.conf << EOF
net.core.somaxconn = 65535
net.ipv4.tcp_syncookies = 1
vm.swappiness = 1
EOF
sysctl -p # 生效
三、第二步:全节点安装 MySQL 8.0(3 台机器都执行)
1. 安装官方源 + MySQL
# 安装MySQL8.0官方源
rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el8-3.noarch.rpm
# 安装MySQL服务
yum install -y mysql-community-server --nogpgcheck
# 开机自启 + 启动
systemctl enable mysqld && systemctl start mysqld
2. 初始化 root 密码(生产强密码规范)
# 获取MySQL初始密码
grep 'temporary password' /var/log/mysqld.log
# 登录MySQL(替换为你查到的初始密码)
mysql -uroot -p
# 修改root密码(生产必须复杂密码)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MGR@Prod_8888';
FLUSH PRIVILEGES;
exit
四、第三步:生产级 MGR 配置文件(核心!细节逐行解释)
规则:3 节点配置99% 相同,仅 3 个参数唯一(server-id、本地通信地址)
修改配置文件:vi /etc/my.cnf
1. 节点 1(mgr-node1)完整配置
[mysqld]
# ========== 唯一标识(每个节点必须不同)==========
server-id = 10
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
port = 3306
pid-file = /var/run/mysqld/mysqld.pid
# ========== MySQL生产基础优化 ==========
innodb_buffer_pool_size = 2G # 物理内存50%-70%
max_connections = 2000
character-set-server = utf8mb4
default-storage-engine = INNODB
log_timestamps = SYSTEM
slow_query_log = 1
long_query_time = 1
# ========== MGR 强制核心配置(所有节点完全一致)==========
gtid_mode = ON # 开启GTID(MGR必须)
enforce_gtid_consistency = ON # 强制GTID一致性
log_bin = mysql-bin # 开启binlog
binlog_format = ROW # 行格式(MGR必须)
log_slave_updates = ON # 从库记录binlog
binlog_checksum = NONE # 关闭binlog校验(MGR必须)
master_info_repository = TABLE
relay_log_info_repository = TABLE
transaction_write_set_extraction = XXHASH64 # 事务哈希(MGR必须)
# ========== MGR组复制配置 ==========
plugin_load_add = group_replication.so # 加载MGR插件
group_replication = ON # 开启组复制
group_replication_group_name = "550e8400-e29b-41d4-a716-446655440000" # 集群UUID(全节点一致)
group_replication_local_address = "192.168.1.10:33061" # 本节点MGR通信地址(唯一)
group_replication_group_seeds = "192.168.1.10:33061,192.168.1.11:33061,192.168.1.12:33061" # 所有节点通信列表
group_replication_bootstrap_group = OFF # 禁止自动引导(仅初始化时开启)
group_replication_single_primary_mode = ON # 单主模式(生产唯一选择)
group_replication_auto_increment_increment = 7 # 自增锁优化
group_replication_member_expel_timeout = 5 # 故障节点5秒踢出
2. 节点 2(mgr-node2)仅修改 2 个参数
server-id = 11
group_replication_local_address = "192.168.1.11:33061"
3. 节点 3(mgr-node3)仅修改 2 个参数
server-id = 12
group_replication_local_address = "192.168.1.12:33061"
4. 重启 MySQL 使配置生效(所有节点执行)
systemctl restart mysqld
systemctl status mysqld # 验证启动成功
五、第四步:初始化 MGR 集群(分节点执行,细节:禁止乱操作)
1. 所有节点创建 MGR 专用账号(最小权限,生产规范)
mysql -uroot -p'MGR@Prod_8888'
# 关闭binlog(避免账号同步重复)
SET SQL_LOG_BIN=0;
# 创建MGR复制账号
CREATE USER 'mgr_repl'@'%' IDENTIFIED BY 'Repl@Prod_6666';
# 授予最小权限
GRANT REPLICATION SLAVE, BACKUP_ADMIN ON *.* TO 'mgr_repl'@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
# 绑定MGR复制通道(固定通道名:group_replication_recovery)
CHANGE MASTER TO MASTER_USER='mgr_repl', MASTER_PASSWORD='Repl@Prod_6666'
FOR CHANNEL 'group_replication_recovery';
exit
2. 仅节点 1(初始主节点)执行:引导集群(仅执行 1 次!)
mysql -uroot -p'MGR@Prod_8888'
# 开启集群引导(关键:仅第一次初始化用)
SET GLOBAL group_replication_bootstrap_group=ON;
# 启动MGR组复制
START GROUP_REPLICATION;
# 关闭引导(防止重复引导导致脑裂!)
SET GLOBAL group_replication_bootstrap_group=OFF;
exit
3. 节点 2、节点 3 执行:加入 MGR 集群
mysql -uroot -p'MGR@Prod_8888'
START GROUP_REPLICATION; # 自动加入集群,无需引导
exit
4. 验证 MGR 集群状态(任意节点执行,核心检查命令)
mysql -uroot -p'MGR@Prod_8888' -e "
SELECT MEMBER_ID,MEMBER_HOST,MEMBER_STATE,MEMBER_ROLE
FROM performance_schema.replication_group_members;
"
✅ 生产正常结果 :3 个节点 MEMBER_STATE=ONLINE,1 个 PRIMARY,2 个 SECONDARY
六、第五步:安装 + 配置 KeepAlived(流量高可用核心)
作用:MGR 负责选主,KeepAlived 负责VIP 秒级漂移,业务无感知
1. 所有节点安装 KeepAlived + 依赖
yum install -y keepalived
2. 所有节点创建 MGR 主库健康检查脚本(核心细节)
脚本作用:判断当前节点是否为 MGR 主库,不是则自动释放 VIP
# 创建脚本目录
mkdir -p /usr/local/keepalived/scripts
chmod 755 /usr/local/keepalived/scripts
# 创建检查脚本
vi /usr/local/keepalived/scripts/check_mgr_primary.sh
脚本内容(所有节点完全一致)
#!/bin/bash
# MySQL配置(生产用最小权限账号,避免root)
MYSQL_USER="root"
MYSQL_PASS="MGR@Prod_8888"
MYSQL_SOCK="/var/lib/mysql/mysql.sock"
# 查询当前节点是否为MGR主库
IS_PRIMARY=$(mysql -u$MYSQL_USER -p$MYSQL_PASS -S $MYSQL_SOCK -N -e "
SELECT MEMBER_ROLE FROM performance_schema.replication_group_members
WHERE MEMBER_HOST=@@hostname;
")
# 退出码规则:0=主库(持有VIP),1=从库(释放VIP)
if [ "$IS_PRIMARY" == "PRIMARY" ]; then
exit 0
else
exit 1
fi
3. 赋予脚本执行权限(所有节点)
chmod +x /usr/local/keepalived/scripts/check_mgr_primary.sh
# 测试脚本(返回0=主库,1=从库)
echo $?
4. 配置 KeepAlived(3 节点配置不同,细节:优先级 + 非抢占)
配置文件:vi /etc/keepalived/keepalived.conf
节点 1(MASTER,优先级 150)
global_defs {
router_id MySQL_MGR # 集群唯一标识
}
# MGR健康检查脚本
vrrp_script check_mgr {
script "/usr/local/keepalived/scripts/check_mgr_primary.sh"
interval 1 # 每秒检查1次(秒级切换)
weight -20 # 检查失败,权重-20
fall 2 # 连续2次失败判定故障
}
# VRRP实例(VIP管理)
vrrp_instance VI_1 {
state MASTER # 主节点角色
interface eth0 # 你的物理网卡名(ip a 查看)
virtual_router_id 51 # 集群唯一ID(3节点一致)
priority 150 # 优先级(主>备)
nopreempt # 【生产关键】非抢占模式(主库恢复不抢VIP)
advert_int 1 # 心跳间隔1秒
# 浮动VIP(业务统一访问)
virtual_ipaddress {
192.168.1.100/24
}
# 绑定MGR检查脚本
track_script {
check_mgr
}
}
节点 2(BACKUP,优先级 120)
# 仅修改这2行,其余完全和节点1一致
state BACKUP
priority 120
节点 3(BACKUP,优先级 100)
# 仅修改这2行,其余完全和节点1一致
state BACKUP
priority 100
5. 启动 KeepAlived(所有节点)
systemctl daemon-reload
systemctl start keepalived
systemctl enable keepalived
systemctl status keepalived # 验证启动成功
七、第六步:全流程高可用验证(生产必测)
1. 验证 VIP 绑定(仅主节点持有 VIP)
# 任意节点执行
ip a
✅ 结果:只有 mgr-node1 有 192.168.1.100
2. 测试主库宕机 → 自动切换(核心场景)
# 节点1执行:模拟主库宕机
systemctl stop mysqld
切换结果(1-3 秒内完成)
- MGR:节点 2/3 自动选举新主库
- KeepAlived:VIP秒级漂移到新主库
- 业务:连接 VIP完全无感知、不断连
3. 测试故障节点恢复
# 节点1执行:重启MySQL
systemctl start mysqld
# 启动MGR组复制
mysql -uroot -p'MGR@Prod_8888' -e "START GROUP_REPLICATION;"
✅ 结果:节点 1 自动加入集群,变为从库(SECONDARY),不抢占 VIP
4. 业务连接测试
# 业务直接连接VIP,无需修改配置
mysql -uroot -p'MGR@Prod_8888' -h 192.168.1.100
八、生产日常运维命令(永久参考)
1. MGR 集群巡检
-- 查看集群节点状态
SELECT * FROM performance_schema.replication_group_members;
-- 查看主库
SELECT MEMBER_HOST,MEMBER_ROLE FROM performance_schema.replication_group_members;
-- 启停MGR
STOP GROUP_REPLICATION;
START GROUP_REPLICATION;
2. KeepAlived 运维
# 重启KeepAlived
systemctl restart keepalived
# 查看VIP
ip a
# 查看检查脚本日志
tail -f /var/log/messages
3. 手动平滑切换主库(维护用)
-- 1. 查看节点UUID
SELECT MEMBER_ID,MEMBER_HOST FROM performance_schema.replication_group_members;
-- 2. 手动切换主库(无锁、无中断)
SELECT group_replication_set_as_primary('节点UUID');
九、生产避坑指南(细节!90% 的人都踩过)
- 禁止重复引导 MGR :
group_replication_bootstrap_group仅节点 1 初始化开 1 次 - 必须开启 nopreempt:非抢占模式,防止主库恢复后抢 VIP 导致业务抖动
- MGR 禁止跨机房:网络延迟 > 5ms 会导致集群崩溃
- 禁止大事务:大事务会触发 MGR 流控,导致集群卡顿
- VIP 仅主库持有:从库即使 KeepAlived 启动,也会因脚本检查释放 VIP
- 必须放行 VRRP 协议:否则 KeepAlived 无法通信
- 高可用≠备份:MGR 防硬件故障,必须搭配 XtraBackup 备份防误删
十、全流程总结(永久记忆)
- 分工明确 :MGR 管数据库高可用 (自动选主、强一致、防脑裂);KeepAlived 管流量高可用(VIP 漂移、业务无感知)
- 切换速度:主库宕机 → 3 秒内选举新主 → 1 秒内 VIP 漂移
- 数据安全:RPO=0(零数据丢失),天然防脑裂
- 生产标准:MySQL8.0+ 官方最优方案,大厂通用,无第三方依赖
- 全流程可复用:本教程所有配置、命令、细节,可直接用于日后所有 MGR 集群搭建