OpenEuler MySQL高可用集群实战指南

OpenEuler 系统 MySQL 高可用集群超详细教程

核心说明 :本教程全程跳过 MySQL 安装步骤,默认您已将 MySQL 部署至/usr/local/mysql路径,适配 OpenEuler 20.03/22.03/24.03 LTS 全稳定版本,兼容 MySQL 8.0(推荐)/5.7 版本,提供两套企业级高可用方案,可根据业务场景选择。


通用前置环境配置(所有节点必须完成)

一、集群节点规划

方案 1(双主 + Keepalived)节点规划

表格

节点角色 主机名 内网 IP MySQL 安装路径 虚拟 VIP
主节点 1 mysql-node1 192.168.1.101 /usr/local/mysql 192.168.1.200
主节点 2 mysql-node2 192.168.1.102 /usr/local/mysql 192.168.1.200
方案 2(MGR 单主模式)节点规划

表格

节点角色 主机名 内网 IP MySQL 安装路径 虚拟 VIP
主节点(Primary) mysql-mgr1 192.168.1.101 /usr/local/mysql 192.168.1.200
从节点 1(Secondary) mysql-mgr2 192.168.1.102 /usr/local/mysql 192.168.1.200
从节点 2(Secondary) mysql-mgr3 192.168.1.103 /usr/local/mysql 192.168.1.200

二、系统基础配置(所有节点执行)

1. 主机名与内网解析配置

bash

复制代码
# 1. 设置主机名(对应节点执行,示例为node1,node2/node3同理修改)
hostnamectl set-hostname mysql-node1

# 2. 配置所有节点内网解析,所有节点统一执行
cat >> /etc/hosts <<EOF
192.168.1.101 mysql-node1
192.168.1.102 mysql-node2
# MGR方案追加 192.168.1.103 mysql-mgr3
EOF
2. SELinux 与防火墙配置

bash

复制代码
# 1. 临时关闭SELinux
setenforce 0
# 永久关闭SELinux
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

# 2. 防火墙放行端口(双主方案执行)
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --permanent --add-rich-rule='rule protocol value="vrrp" accept'
# MGR方案额外放行组通信端口
firewall-cmd --permanent --add-port=33061/tcp

# 3. 重载防火墙生效
firewall-cmd --reload
3. 集群时间同步(核心必做,误差需 < 1s)

OpenEuler 默认使用 chronyd 实现时间同步,配置如下:

bash

复制代码
# 1. 安装chrony(若未安装)
dnf install -y chrony

# 2. 配置国内NTP源,修改/etc/chrony.conf
sed -i 's/^pool/#pool/g' /etc/chrony.conf
cat >> /etc/chrony.conf <<EOF
server ntp.aliyun.com iburst
server ntp1.tencent.com iburst
EOF

# 3. 启动并设置开机自启
systemctl enable --now chronyd
# 4. 重启生效
systemctl restart chronyd
# 5. 验证同步状态
chronyc tracking
4. 系统资源与内核优化(MySQL 必备)

bash

复制代码
# 1. 配置MySQL进程资源限制
cat >> /etc/security/limits.conf <<EOF
mysql soft nproc 65535
mysql hard nproc 65535
mysql soft nofile 65535
mysql hard nofile 65535
mysql soft stack 32768
mysql hard stack 32768
EOF

# 2. 内核优化配置
cat >> /etc/sysctl.conf <<EOF
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_syn_backlog = 8192
net.core.somaxconn = 32768
net.ipv4.ip_local_port_range = 1024 65000
vm.swappiness = 10
EOF

# 3. 生效内核配置
sysctl -p
5. MySQL 基础环境校验

确保您的 MySQL 满足以下基础要求,否则高可用配置会失效:

  1. MySQL 服务可通过systemctl start/stop/restart mysqld正常管理,服务无异常
  2. 配置文件/etc/my.cnf已正确配置basedir=/usr/local/mysqldatadir=/usr/local/mysql/data
  3. 所有节点 MySQL 大版本完全一致(如均为 8.0.36),避免兼容性问题
  4. 可通过/usr/local/mysql/bin/mysql -uroot -p正常登录数据库

方案一:双主半同步复制 + Keepalived 高可用集群

适用场景:中小规模业务、运维门槛低、成熟稳定、90% 以上企业场景通用,支持秒级故障切换,业务无感知。核心架构:两台 MySQL 互为主从(双向同步),Keepalived 提供 VIP 漂移,实时检测 MySQL 存活状态,故障自动切换。

一、双主模式 MySQL 配置(核心步骤)

1. Master1(192.168.1.101)配置文件修改

编辑/etc/my.cnf,在原有基础上追加 / 修改以下配置,确保basedirdatadir与您的安装路径完全匹配:

ini

复制代码
[mysqld]
# 基础路径(必须与你的安装路径一致)
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
pid-file = /usr/local/mysql/data/mysqld.pid
port = 3306
user = mysql

# 字符集与基础配置
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
lower_case_table_names = 1
default-time_zone = '+8:00'

# 双主复制核心配置
server-id = 101  # 集群内唯一,不可与其他节点重复
log_bin = mysql-bin  # 开启二进制日志,必开
binlog_format = ROW  # 行级复制,强一致性必选
binlog_row_image = FULL
expire_logs_days = 7  # binlog自动过期时间,按需调整
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1

# 双主主键冲突规避(必配)
auto_increment_increment = 2  # 自增步长=节点数量
auto_increment_offset = 1  # 起始值,Master1=1,Master2=2

# 中继日志与双向同步配置(双主必配)
relay_log = relay-bin
relay_log_recovery = ON
log_slave_updates = ON  # 从库更新写入binlog,双向同步必备
read_only = 0
super_read_only = 0

# 半同步复制配置(提升数据一致性,必开)
plugin_load_add = semisync_master.so
plugin_load_add = semisync_slave.so
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_slave_enabled = 1
rpl_semi_sync_master_timeout = 1000  # 超时1秒降级为异步

# GTID模式(强推荐,简化复制运维,避免位置偏移)
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_gtid_simple_recovery = ON

# 性能配置(按需调整,不影响集群)
innodb_buffer_pool_size = 系统内存的50%-70%  # 例:8G内存设4G,16G设10G
innodb_log_file_size = 1G
innodb_log_buffer_size = 64M
max_connections = 2000
wait_timeout = 86400
interactive_timeout = 86400

[mysql]
default-character-set = utf8mb4
socket = /tmp/mysql.sock

[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8mb4

配置完成后,重启 MySQL 服务并验证状态:

bash

复制代码
systemctl restart mysqld
systemctl status mysqld
2. Master2(192.168.1.102)配置文件修改

与 Master1 配置99% 一致,仅修改以下 3 个核心参数,其余完全复制:

ini

复制代码
server-id = 102  # 唯一ID,不可与Master1重复
auto_increment_offset = 2  # 自增起始值,与Master1错开

配置完成后,同样重启 MySQL 服务并验证状态:

bash

复制代码
systemctl restart mysqld
systemctl status mysqld
3. 配置生效验证(两个节点均执行)

登录 MySQL 执行以下命令,验证核心配置生效:

sql

复制代码
-- 登录MySQL
/usr/local/mysql/bin/mysql -uroot -p

-- 验证半同步插件是否激活
show plugins;
-- 结果中需看到 semisync_master、semisync_slave 状态为 ACTIVE

-- 验证GTID是否开启
show variables like '%gtid_mode%';
-- 结果需为 ON

-- 验证server-id是否正确
show variables like 'server_id';

前置要求:若已有业务数据,需先将 Master1 全量备份恢复至 Master2,确保两个节点初始数据完全一致;全新库可直接配置。

1. 两个节点创建复制专用账号

Master1 和 Master2 均执行以下 SQL,创建双向同步专用账号:

sql

复制代码
-- 创建复制用户,替换为你的强密码,网段与你的内网一致
CREATE USER 'repl'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY 'Repl@123456';
-- 授予复制权限
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'192.168.1.%';
-- 刷新权限
FLUSH PRIVILEGES;
2. 配置 Master2 -> Master1 的复制链路(Master2 作为从库)

登录 Master2 的 MySQL 执行,配置同步源为 Master1:

sql

复制代码
-- 停止原有slave服务(若有)
STOP SLAVE;
RESET SLAVE ALL;

-- 配置GTID模式主从复制,无需手动指定binlog位置
CHANGE MASTER TO
MASTER_HOST='192.168.1.101',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='Repl@123456',
MASTER_AUTO_POSITION=1,
MASTER_CONNECT_RETRY=10,
GET_MASTER_PUBLIC_KEY=1;

-- 启动slave服务
START SLAVE;

-- 核心验证:复制状态必须两个YES
SHOW SLAVE STATUS\G

验证标准 :执行后必须确保Slave_IO_Running: YesSlave_SQL_Running: Yes,且Last_IO_ErrorLast_SQL_Error无任何报错,否则需先排查问题。

3. 配置 Master1 -> Master2 的复制链路(Master1 作为从库)

登录 Master1 的 MySQL 执行,配置同步源为 Master2,形成双向同步闭环:

sql

复制代码
STOP SLAVE;
RESET SLAVE ALL;

CHANGE MASTER TO
MASTER_HOST='192.168.1.102',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='Repl@123456',
MASTER_AUTO_POSITION=1,
MASTER_CONNECT_RETRY=10,
GET_MASTER_PUBLIC_KEY=1;

START SLAVE;

-- 同样验证复制状态,必须两个YES
SHOW SLAVE STATUS\G
4. 双主同步功能验证

sql

复制代码
-- 测试1:Master1写入数据,验证Master2同步
-- Master1执行
CREATE DATABASE test_repl;
USE test_repl;
CREATE TABLE t1 (id int auto_increment primary key, name varchar(20));
INSERT INTO t1 (name) VALUES ('node1_test');

-- Master2执行,验证数据已同步
SELECT * FROM test_repl.t1;

-- 测试2:Master2写入数据,验证Master1同步
-- Master2执行
INSERT INTO test_repl.t1 (name) VALUES ('node2_test');

-- Master1执行,验证数据已同步,且自增ID无冲突
SELECT * FROM test_repl.t1;

三、Keepalived 部署与 VIP 漂移配置

实现业务统一 VIP 入口,故障时自动切换节点,无需业务修改配置。

1. 两个节点安装 Keepalived

bash

复制代码
# OpenEuler使用dnf安装
dnf install -y keepalived
# 设置开机自启
systemctl enable keepalived
2. 编写 MySQL 健康检测脚本(两个节点均配置)

Keepalived 通过该脚本检测 MySQL 存活状态,故障时触发 VIP 漂移:

bash

复制代码
# 创建脚本文件
cat > /usr/local/bin/check_mysql.sh <<EOF
#!/bin/bash
# MySQL健康检测脚本
MYSQL_USER="root"
MYSQL_PASSWORD="你的MySQL root密码"  # 替换为你的root实际密码
MYSQL_HOST="127.0.0.1"
MYSQL_PORT="3306"
MYSQL_BIN="/usr/local/mysql/bin/mysql"

# 检测MySQL是否可正常连接
\$MYSQL_BIN -u\$MYSQL_USER -p\$MYSQL_PASSWORD -h\$MYSQL_HOST -P\$MYSQL_PORT -e "SELECT 1;" > /dev/null 2>&1

# 故障判断逻辑
if [ $? -ne 0 ]; then
    # 首次检测失败,尝试重启MySQL
    systemctl restart mysqld
    sleep 3
    # 再次检测
    \$MYSQL_BIN -u\$MYSQL_USER -p\$MYSQL_PASSWORD -h\$MYSQL_HOST -P\$MYSQL_PORT -e "SELECT 1;" > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        # 重启后仍失败,停止keepalived,触发VIP漂移
        systemctl stop keepalived
    fi
fi
EOF

# 给脚本执行权限(必做)
chmod +x /usr/local/bin/check_mysql.sh

# 手动测试脚本,无报错、不自动停止keepalived即为正常
sh /usr/local/bin/check_mysql.sh
3. Master1(主节点)Keepalived 配置

先备份原有配置,再写入新配置:

bash

复制代码
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
# 全局配置
global_defs {
   router_id MYSQL_HA_NODE1  # 节点唯一标识
}

# MySQL健康检测脚本调用
vrrp_script check_mysql {
    script "/usr/local/bin/check_mysql.sh"
    interval 2  # 每2秒检测一次
    weight -20  # 检测失败,优先级减20
    fall 3      # 连续3次失败判定为故障
    rise 2      # 连续2次成功判定为恢复
}

# VRRP实例核心配置
vrrp_instance VI_1 {
    state MASTER  # 主节点设MASTER,备节点设BACKUP
    interface ens33  # 你的服务器网卡名,通过ip addr查看,如ens192/eth0
    virtual_router_id 51  # 集群内唯一,两个节点必须一致
    priority 100  # 优先级,主节点必须高于备节点
    advert_int 1  # 心跳间隔1秒
    # 认证配置,两个节点必须一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟VIP地址,与内网同网段
    virtual_ipaddress {
        192.168.1.200/24
    }
    # 绑定健康检测脚本
    track_script {
        check_mysql
    }
}
EOF
4. Master2(备节点)Keepalived 配置

与主节点配置仅 3 处差异,其余完全一致:

bash

复制代码
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
   router_id MYSQL_HA_NODE2
}

vrrp_script check_mysql {
    script "/usr/local/bin/check_mysql.sh"
    interval 2
    weight -20
    fall 3
    rise 2
}

vrrp_instance VI_1 {
    state BACKUP  # 备节点设为BACKUP
    interface ens33  # 与主节点网卡名一致
    virtual_router_id 51  # 与主节点完全一致
    priority 90  # 优先级低于主节点
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.200/24
    }
    track_script {
        check_mysql
    }
}
EOF
5. 启动 Keepalived 并验证 VIP 绑定

bash

复制代码
# 1. 先启动Master1的keepalived
systemctl start keepalived
# 验证服务状态
systemctl status keepalived

# 2. 验证VIP是否绑定到Master1
ip addr show ens33  # 你的网卡名
# 结果中需看到 192.168.1.200/24 地址,绑定成功

# 3. 再启动Master2的keepalived
systemctl start keepalived
systemctl status keepalived
6. 高可用故障切换验证

bash

复制代码
# 测试1:VIP连通性与数据库访问
# 任意机器执行,ping VIP通,且可通过VIP正常登录MySQL
ping 192.168.1.200
/usr/local/mysql/bin/mysql -uroot -p -h192.168.1.200 -P3306

# 测试2:主节点故障自动切换
# Master1执行,停止MySQL服务,模拟故障
systemctl stop mysqld

# 验证1:Master1的keepalived会被检测脚本自动停止
systemctl status keepalived
# 验证2:Master1上VIP已消失
ip addr show ens33
# 验证3:VIP已漂移至Master2
ip addr show ens33  # Master2执行
# 验证4:通过VIP仍可正常登录MySQL,读写正常,切换成功

# 测试3:故障恢复
# Master1执行,恢复MySQL和keepalived
systemctl start mysqld
systemctl start keepalived
# VIP会自动回切至Master1(默认抢占模式),生产环境推荐配置非抢占模式
7. 生产环境优化:非抢占模式(推荐)

避免主节点恢复后自动回切导致业务闪断,两个节点均修改配置:

  1. 两个节点的state均改为BACKUP
  2. 两个节点的vrrp_instance中新增nopreempt(非抢占核心配置)
  3. 优先级仍保持 100 和 90 不变
  4. 重启两个节点的 keepalived 生效

四、双主集群生产环境最佳实践

  1. 业务写入控制:强烈建议业务层仅通过 VIP 写入主节点,避免双写导致锁冲突、数据不一致
  2. 权限最小化:复制账号、业务账号严格限制网段,避免使用 root 账号用于业务访问
  3. 监控告警:配置 Prometheus+Grafana 监控复制状态、VIP 绑定、MySQL 存活、延迟情况
  4. 定期校验:每日检查主从同步状态,每周执行一次故障切换演练
  5. 数据备份:配置定时全量 + 增量备份,避免同步异常导致数据丢失

方案二:MySQL 8.0 原生 MGR 单主模式高可用集群

适用场景:金融级业务、对数据强一致性要求极高、需要自动故障选主、无第三方组件依赖,基于 Paxos 协议实现,推荐 MySQL 8.0.17 以上版本。核心架构:3 节点奇数集群,1 主 2 从,内置故障检测、自动选主、数据强一致性保证,配合 MySQL Router 实现业务透明访问。

一、MGR 集群前置要求

  1. 所有节点已完成通用前置环境配置(hosts、防火墙、时间同步、系统优化)
  2. 必须使用 InnoDB 存储引擎,所有业务表必须有主键
  3. 必须开启 GTID 模式、ROW 格式 binlog
  4. 集群节点数必须为奇数(3/5/7),满足多数派选举,避免脑裂
  5. 节点间内网延迟 < 1ms,推荐万兆内网

二、所有节点 MySQL 配置文件修改

编辑/etc/my.cnf,每个节点仅server-idgroup_replication_local_address需修改,其余参数完全一致。

主节点 101 配置示例

ini

复制代码
[mysqld]
# 基础路径配置
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
pid-file = /usr/local/mysql/data/mysqld.pid
port = 3306
user = mysql

# 字符集配置
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
lower_case_table_names = 1
default-time_zone = '+8:00'

# MGR基础核心配置(必配)
server-id = 101  # 每个节点唯一,102节点设102,103设103
gtid_mode = ON
enforce_gtid_consistency = ON
binlog_format = ROW
binlog_row_image = FULL
log_bin = mysql-bin
log_slave_updates = ON
binlog_checksum = NONE  # MGR必须关闭
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log = relay-bin
relay_log_recovery = ON
transaction_isolation = READ-COMMITTED  # MGR推荐隔离级别

# MGR插件与专属配置
plugin_load_add = group_replication.so
transaction_write_set_extraction = XXHASH64
# 集群UUID,所有节点必须一致,可通过select uuid()生成
loose-group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot = OFF  # 开机不自动启动,避免脑裂
# 本节点组通信地址,每个节点填自己的IP+33061端口
loose-group_replication_local_address = "192.168.1.101:33061"
# 所有集群节点的通信地址,所有节点完全一致
loose-group_replication_group_seeds = "192.168.1.101:33061,192.168.1.102:33061,192.168.1.103:33061"
loose-group_replication_bootstrap_group = OFF  # 仅首次引导临时开启
loose-group_replication_single_primary_mode = ON  # 单主模式,关闭则为多主
loose-group_replication_enforce_update_everywhere_checks = OFF  # 单主模式必须关闭
loose-group_replication_member_weight = 100  # 选主权重,主节点设100,从节点设50
loose-group_replication_ip_whitelist = "192.168.1.0/24"  # 集群白名单
loose-group_replication_recovery_get_public_key = ON

# 性能配置
performance_schema = ON  # 必须开启
innodb_buffer_pool_size = 系统内存的50%-70%
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
innodb_log_file_size = 1G
max_connections = 2000

[mysql]
default-character-set = utf8mb4
socket = /tmp/mysql.sock

[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8mb4
其他节点配置修改
  • 102 节点:server-id=102loose-group_replication_local_address = "192.168.1.102:33061"loose-group_replication_member_weight = 50
  • 103 节点:server-id=103loose-group_replication_local_address = "192.168.1.103:33061"loose-group_replication_member_weight = 50

所有节点配置完成后,重启 MySQL 服务

bash

复制代码
systemctl restart mysqld
systemctl status mysqld

三、MGR 集群初始化与启动(严格按顺序执行)

1. 所有节点创建 MGR 专用复制账号

三个节点均登录 MySQL 执行以下 SQL:

sql

复制代码
-- 登录MySQL
/usr/local/mysql/bin/mysql -uroot -p

-- 临时关闭binlog记录,避免同步冲突
SET SQL_LOG_BIN=0;
-- 创建MGR复制用户
CREATE USER 'mgr_repl'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY 'Mgr@123456';
-- 授予所需权限
GRANT REPLICATION SLAVE ON *.* TO 'mgr_repl'@'192.168.1.%';
GRANT BACKUP_ADMIN, CLONE_ADMIN ON *.* TO 'mgr_repl'@'192.168.1.%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;

-- 配置MGR恢复通道,通道名固定不可修改
CHANGE MASTER TO MASTER_USER='mgr_repl', MASTER_PASSWORD='Mgr@123456' FOR CHANNEL 'group_replication_recovery';
2. 主节点(101)引导启动 MGR 集群

仅在主节点 101 执行,引导集群初始化:

sql

复制代码
-- 开启引导模式(仅首次启动执行,严禁其他节点开启)
SET GLOBAL group_replication_bootstrap_group=ON;
-- 启动组复制
START GROUP_REPLICATION;
-- 立即关闭引导模式,避免脑裂
SET GLOBAL group_replication_bootstrap_group=OFF;

-- 验证集群引导成功
SELECT * FROM performance_schema.replication_group_members;

验证标准 :结果中可看到 101 节点,MEMBER_STATEONLINEMEMBER_ROLEPRIMARY,引导成功。

3. 从节点依次加入集群

先在 102 节点执行,加入成功后再操作 103 节点

sql

复制代码
-- 启动组复制,加入集群
START GROUP_REPLICATION;

-- 等待3-5秒,查看节点状态
SELECT * FROM performance_schema.replication_group_members;

验证标准 :可看到集群内已有 2 个节点,102 节点MEMBER_STATEONLINEMEMBER_ROLESECONDARY,加入成功。

103 节点执行相同操作,最终三个节点均为ONLINE状态,集群搭建完成。

四、MGR 集群功能与故障切换验证

1. 数据同步验证

sql

复制代码
-- 主节点101写入数据(必须带主键)
CREATE DATABASE test_mgr;
USE test_mgr;
CREATE TABLE t1 (id int primary key auto_increment, name varchar(20));
INSERT INTO t1 (name) VALUES ('mgr_test1');
SELECT * FROM t1;

-- 102和103从节点执行,验证数据同步成功
SELECT * FROM test_mgr.t1;

-- 验证从节点只读限制,102节点执行写入会报错,符合预期
INSERT INTO test_mgr.t1 (name) VALUES ('test_write');
2. 自动故障切换验证

sql

复制代码
-- 1. 查看当前主节点
SELECT MEMBER_HOST,MEMBER_ROLE FROM performance_schema.replication_group_members;

-- 2. 模拟主节点故障,101节点停止MySQL
systemctl stop mysqld

-- 3. 102/103节点查看集群状态,验证自动选主
SELECT MEMBER_HOST,MEMBER_ROLE FROM performance_schema.replication_group_members;

验证标准 :101 节点变为OFFLINE,集群自动从 102/103 中选举出新的PRIMARY主节点,写入功能正常,切换完成。

3. 故障节点恢复

bash

复制代码
# 101节点启动MySQL
systemctl start mysqld

# 登录101的MySQL,重新加入集群
START GROUP_REPLICATION;

# 查看集群状态,101节点重新ONLINE,作为SECONDARY从节点,数据自动同步
SELECT * FROM performance_schema.replication_group_members;

五、MySQL Router 配置(业务统一入口)

MGR 集群主节点切换后 IP 会变化,通过 MySQL Router 实现读写分离与自动路由,业务无需修改配置。

1. 所有节点安装 MySQL Router

bash

复制代码
dnf install -y mysql-router
2. 引导配置 Router(任意节点执行一次即可)

bash

复制代码
# 引导配置,自动识别集群拓扑
mysqlrouter --bootstrap root@192.168.1.101:3306 --user=mysqlrouter --directory=/usr/local/mysql-router

执行后输入 MySQL root 密码,自动生成配置文件。

3. 启动 Router 服务

bash

复制代码
cd /usr/local/mysql-router
./start.sh
# 设置开机自启,可将启动命令加入/etc/rc.local
4. Router 使用说明
  • 读写端口 6446:连接此端口会自动转发到当前主节点(PRIMARY),用于业务写入
  • 只读端口 6447:连接此端口会自动负载均衡到从节点(SECONDARY),用于业务查询
  • 主节点故障切换后,Router 会自动更新转发规则,业务完全无感知

六、MGR 集群生产环境注意事项

  1. 所有业务表必须有主键,否则无法写入集群,会直接报错
  2. 禁止大事务执行,建议拆分大事务为 1000 行以内的小事务,避免集群阻塞
  3. 集群节点间网络必须稳定,延迟 < 1ms,禁止跨公网部署
  4. 必须配置监控,实时监控集群节点状态、延迟、事务一致性
  5. 集群重启时,必须先启动最后一个离线的节点,先引导集群,再启动其他节点
  6. 禁止手动修改从节点数据,避免数据不一致导致集群异常
相关推荐
€8113 小时前
Java入门级教程29——Spring Cloud:Eureka 注册发现 + MySQL 数据交互 + 负载均衡
java·开发语言·mysql·spring cloud·eureka·负载均衡
宁小法3 小时前
MySQL- ORDINAL_POSITION 详解
mysql·表结构·字段顺序
羊小蜜.3 小时前
Mysql 04: 子查询——5 大核心用法
数据库·mysql·算法·子查询
数据库小组11 小时前
2026 年,MySQL 到 SelectDB 同步为何更关注实时、可观测与可校验?
数据库·mysql·数据库管理工具·数据同步·ninedata·selectdb·迁移工具
SHoM SSER12 小时前
MySQL 数据库连接池爆满问题排查与解决
android·数据库·mysql
qq_2837200513 小时前
MySQL技巧(十四): 连接数过多 (Too many connections):原因 + 排查 + 终极解决方案
mysql·连接池·性能·异常
lifewange13 小时前
java连接Mysql数据库
java·数据库·mysql
不写八个14 小时前
PHP教程004:php链接mysql数据库
数据库·mysql·php
计算机学姐15 小时前
基于SpringBoot的咖啡店管理系统【个性化推荐+数据可视化统计+配送信息】
java·vue.js·spring boot·后端·mysql·信息可视化·tomcat