MySQL 8.0 MGR + KeepAlived 生产级全流程搭建手册

(超详细版 | 带细节注释 | 可直接落地 | 永久学习参考)

本教程无跳步、无省略、全细节,覆盖:环境初始化 → MGR 集群搭建 → KeepAlived 流量高可用 → 故障切换 → 运维巡检 → 避坑指南,完全适配企业生产环境,你日后直接照着配置即可。

结合此文升级高并发架构,满足高可用下的高并发场景

https://blog.csdn.net/L162476/article/details/159467793?fromshare=blogdetail&sharetype=blogdetail&sharerId=159467793&sharerefer=PC&sharesource=L162476&sharefrom=from_link


一、前置核心信息(先牢记,所有配置基于此)

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. 生产硬性规范(细节!不满足必报错)

  1. 3 台服务器同机房、低延迟(网络延迟 < 1ms,MGR 禁止跨机房)
  2. MySQL 版本完全一致(8.0.30+ 稳定版)
  3. 节点数必须奇数(3/5/7,满足 Raft 协议)
  4. 关闭 SELinux、时间同步(Chrony)、防火墙放通指定端口
  5. 仅使用 InnoDB 引擎,开启 GTID
  6. 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-node1192.168.1.100

2. 测试主库宕机 → 自动切换(核心场景)

复制代码
# 节点1执行:模拟主库宕机
systemctl stop mysqld

切换结果(1-3 秒内完成)

  1. MGR:节点 2/3 自动选举新主库
  2. KeepAlived:VIP秒级漂移到新主库
  3. 业务:连接 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% 的人都踩过)

  1. 禁止重复引导 MGRgroup_replication_bootstrap_group 仅节点 1 初始化开 1 次
  2. 必须开启 nopreempt:非抢占模式,防止主库恢复后抢 VIP 导致业务抖动
  3. MGR 禁止跨机房:网络延迟 > 5ms 会导致集群崩溃
  4. 禁止大事务:大事务会触发 MGR 流控,导致集群卡顿
  5. VIP 仅主库持有:从库即使 KeepAlived 启动,也会因脚本检查释放 VIP
  6. 必须放行 VRRP 协议:否则 KeepAlived 无法通信
  7. 高可用≠备份:MGR 防硬件故障,必须搭配 XtraBackup 备份防误删

十、全流程总结(永久记忆)

  1. 分工明确 :MGR 管数据库高可用 (自动选主、强一致、防脑裂);KeepAlived 管流量高可用(VIP 漂移、业务无感知)
  2. 切换速度:主库宕机 → 3 秒内选举新主 → 1 秒内 VIP 漂移
  3. 数据安全:RPO=0(零数据丢失),天然防脑裂
  4. 生产标准:MySQL8.0+ 官方最优方案,大厂通用,无第三方依赖
  5. 全流程可复用:本教程所有配置、命令、细节,可直接用于日后所有 MGR 集群搭建
相关推荐
Rust语言中文社区2 小时前
【Rust日报】用 Rust 重写的 Turso 是一个更好的 SQLite 吗?
开发语言·数据库·后端·rust·sqlite
Dontla2 小时前
VScode插件SQLite Viewer介绍(允许开发者不离开编辑器,直接打开、浏览和查询SQLite数据库文件)(ChromaDB、向量库插件、数据库插件、.sqlite3)DBeaver
数据库·vscode
星辰徐哥2 小时前
易语言数据库操作初步:内置Ado引擎与SQLite3快速上手
数据库·oracle·sqlite·易语言
守候秋林辉2 小时前
JFinal+SQLite 解决Date类型与DATETIME类型转换异常
jvm·数据库·sqlite
qq_416018722 小时前
用Python批量处理Excel和CSV文件
jvm·数据库·python
逐鹿艾缇3 小时前
【达梦数据库】锁超时
数据库
F1FJJ3 小时前
只是想查个数据,不想装 phpMyAdmin
数据库·网络协议·容器·开源软件
spencer_tseng3 小时前
java.sql.SQLException: Unknown system variable ‘query_cache_size‘
mysql