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. 禁止手动修改从节点数据,避免数据不一致导致集群异常
相关推荐
阮胜昌16 小时前
MySQL 9.7.0 LTS 现已发布:扩展了社区功能,并为企业级应用增加了动态数据脱敏功能
数据库·mysql
码域空间17 小时前
锁住了检查,锁不住延迟——MySQL 读写分离架构下双重检查模式失效实录
数据库·mysql·架构
数据库小学妹18 小时前
MySQL 8.4还是9.7 LTS?8.0 EOL后升级怎么选
数据库·mysql·dba·版本升级·数据库运维
m0_5474866618 小时前
《数据库原理及应用教程MySQL 8.0》全套PPT课件2026
数据库·mysql
程序员夏洛18 小时前
MySQL 中的事务隔离级别有哪些?
数据库·mysql
冰暮流星19 小时前
mysql之字符串函数
数据库·mysql
梦想不只是梦与想20 小时前
MySQL 不同操作系统的安装方式
数据库·mysql·mysql安装
码农颜20 小时前
6.4.1 监听连接
java·数据库·mysql
菀亓2 天前
ubuntu系统mysql安装
mysql
程序员贺加贝2 天前
别被 saveBatch 骗了:一次 MyBatis-Plus 批量插入性能排查
mysql