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 满足以下基础要求,否则高可用配置会失效:
- MySQL 服务可通过
systemctl start/stop/restart mysqld正常管理,服务无异常 - 配置文件
/etc/my.cnf已正确配置basedir=/usr/local/mysql、datadir=/usr/local/mysql/data - 所有节点 MySQL 大版本完全一致(如均为 8.0.36),避免兼容性问题
- 可通过
/usr/local/mysql/bin/mysql -uroot -p正常登录数据库
方案一:双主半同步复制 + Keepalived 高可用集群
适用场景:中小规模业务、运维门槛低、成熟稳定、90% 以上企业场景通用,支持秒级故障切换,业务无感知。核心架构:两台 MySQL 互为主从(双向同步),Keepalived 提供 VIP 漂移,实时检测 MySQL 存活状态,故障自动切换。
一、双主模式 MySQL 配置(核心步骤)
1. Master1(192.168.1.101)配置文件修改
编辑/etc/my.cnf,在原有基础上追加 / 修改以下配置,确保basedir和datadir与您的安装路径完全匹配:
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: Yes和Slave_SQL_Running: Yes,且Last_IO_Error、Last_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. 生产环境优化:非抢占模式(推荐)
避免主节点恢复后自动回切导致业务闪断,两个节点均修改配置:
- 两个节点的
state均改为BACKUP - 两个节点的
vrrp_instance中新增nopreempt(非抢占核心配置) - 优先级仍保持 100 和 90 不变
- 重启两个节点的 keepalived 生效
四、双主集群生产环境最佳实践
- 业务写入控制:强烈建议业务层仅通过 VIP 写入主节点,避免双写导致锁冲突、数据不一致
- 权限最小化:复制账号、业务账号严格限制网段,避免使用 root 账号用于业务访问
- 监控告警:配置 Prometheus+Grafana 监控复制状态、VIP 绑定、MySQL 存活、延迟情况
- 定期校验:每日检查主从同步状态,每周执行一次故障切换演练
- 数据备份:配置定时全量 + 增量备份,避免同步异常导致数据丢失
方案二:MySQL 8.0 原生 MGR 单主模式高可用集群
适用场景:金融级业务、对数据强一致性要求极高、需要自动故障选主、无第三方组件依赖,基于 Paxos 协议实现,推荐 MySQL 8.0.17 以上版本。核心架构:3 节点奇数集群,1 主 2 从,内置故障检测、自动选主、数据强一致性保证,配合 MySQL Router 实现业务透明访问。
一、MGR 集群前置要求
- 所有节点已完成通用前置环境配置(hosts、防火墙、时间同步、系统优化)
- 必须使用 InnoDB 存储引擎,所有业务表必须有主键
- 必须开启 GTID 模式、ROW 格式 binlog
- 集群节点数必须为奇数(3/5/7),满足多数派选举,避免脑裂
- 节点间内网延迟 < 1ms,推荐万兆内网
二、所有节点 MySQL 配置文件修改
编辑/etc/my.cnf,每个节点仅server-id和group_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=102,loose-group_replication_local_address = "192.168.1.102:33061",loose-group_replication_member_weight = 50 - 103 节点:
server-id=103,loose-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_STATE为ONLINE,MEMBER_ROLE为PRIMARY,引导成功。
3. 从节点依次加入集群
先在 102 节点执行,加入成功后再操作 103 节点:
sql
-- 启动组复制,加入集群
START GROUP_REPLICATION;
-- 等待3-5秒,查看节点状态
SELECT * FROM performance_schema.replication_group_members;
验证标准 :可看到集群内已有 2 个节点,102 节点MEMBER_STATE为ONLINE,MEMBER_ROLE为SECONDARY,加入成功。
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 集群生产环境注意事项
- 所有业务表必须有主键,否则无法写入集群,会直接报错
- 禁止大事务执行,建议拆分大事务为 1000 行以内的小事务,避免集群阻塞
- 集群节点间网络必须稳定,延迟 < 1ms,禁止跨公网部署
- 必须配置监控,实时监控集群节点状态、延迟、事务一致性
- 集群重启时,必须先启动最后一个离线的节点,先引导集群,再启动其他节点
- 禁止手动修改从节点数据,避免数据不一致导致集群异常
