如何在 RHEL 8 系统上实现高可用 MySQL 集群,保障电商平台的 24 小时稳定运行

在电商平台生产环境中,数据库是核心支撑系统,既要高吞吐、高并发 ,又要高可用、零宕机A5数据在本文中基于 RHEL 8(Red Hat Enterprise Linux 8)操作系统,从硬件选型到软件架构、实现步骤、优化参数、代码示例、评测数据等,手把手教你搭建一个企业级高可用 MySQL 集群(基于 MySQL Group Replication + ProxySQL + Pacemaker/Corosync),确保电商平台 24×7 稳定运行。


一、方案概览与核心目标

我们要实现的是一个具备:

自动故障转移(Failover)

无单点故障(No SPOF)

线性扩展能力

自动读写分离与负载均衡

的高可用 MySQL 集群。核心组件如下:

组件 作用
RHEL 8 主机 操作系统基础
MySQL 8.0 Group Replication 多主复制/高可用
ProxySQL SQL 层负载均衡与读写分离
Pacemaker + Corosync 集群资源管理 & 故障检测/迁移
Floating IP / Keepalived VIP 漂移实现入口对外一致性

集群逻辑图如下:

复制代码
           +------------------------+
           |   VIP: 10.0.100.50     |
           |   Keepalived/HAProxy   |
           +-----------+------------+
                       |
                 +-----+-----+
                 | ProxySQL  |
                 +-----+-----+
                       |
        +--------------+--------------+
        |              |              |
   MySQL‑1        MySQL‑2        MySQL‑3
(Group Rep)     (Group Rep)     (Group Rep)

二、硬件选型与香港服务器www.a5idc.com规格建议

角色 CPU 内存 存储 网络
MySQL 节点 16 × Intel Xeon 64 GB ECC 2 × 1.92 TB NVMe RAID1 10 Gbps
ProxySQL 节点 8 × Intel Xeon 16 GB 1 × 512 GB NVMe 10 Gbps
Pacemaker/Keepalived 4 × Intel CPU 8 GB 256 GB SSD 1 Gbps

说明:

  • MySQL 节点存储建议选用 NVMe SSD 并做 RAID1 保持性能与可靠性。
  • 网络至少 10 Gbps,以支持高并发复制流量与客户端请求。
  • ECC 内存可最大化减少软错误对数据库的影响。

三、准备工作:系统与依赖安装

1)RHEL 8 前置配置

bash 复制代码
# 关闭 SELinux(生产建议根据需求调整为 enforcing + 策略规则)
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
sudo setenforce 0

# 关闭防火墙(生产建议保留并做规则白名单)
sudo systemctl disable --now firewalld

# 安装常用工具
sudo dnf install -y vim wget net-tools jq

2)时间同步

bash 复制代码
sudo dnf install -y chrony
sudo systemctl enable --now chronyd
chronyc sources

确保所有节点时间误差不超过 100 ms。


四、MySQL 8.0 安装与配置(3 节点)

1)安装 MySQL Repository

bash 复制代码
sudo dnf install -y https://dev.mysql.com/get/mysql80-community-release-el8-3.noarch.rpm
sudo dnf module disable -y mysql
sudo dnf install -y mysql-community-server

2)初始化与启动

bash 复制代码
sudo systemctl enable --now mysqld

3)获取临时 root 密码

bash 复制代码
sudo grep 'temporary password' /var/log/mysqld.log

4)安全设置

bash 复制代码
mysql_secure_installation

5)MySQL Group Replication 基础配置(/etc/my.cnf.d/server.cnf

ini 复制代码
[mysqld]
server_id=101                  # each node must be unique, 101/102/103
user=mysql
datadir=/var/lib/mysql
log_error=/var/log/mysqld.log
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
log_slave_updates=ON
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="10.0.0.101:33061"
loose-group_replication_group_seeds="10.0.0.101:33061,10.0.0.102:33061,10.0.0.103:33061"
loose-group_replication_bootstrap_group=OFF

参数说明:

  • server_id:每节点唯一。
  • binlog_format=ROW:行级复制,保障数据一致性。
  • GTID:用于自动故障恢复。
  • group_replication_*:群组复制专用参数。

重启 MySQL:

bash 复制代码
sudo systemctl restart mysqld

6)开启 Group Replication

在第一个节点:

sql 复制代码
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

在其它两个节点:

sql 复制代码
START GROUP_REPLICATION;

验证:

sql 复制代码
SELECT * FROM performance_schema.replication_group_members;

五、ProxySQL 部署与读写分离

1)安装 ProxySQL

bash 复制代码
sudo dnf install -y https://github.com/sysown/proxysql/releases/download/v2.5.4/proxysql-2.5.4-1-centos8.x86_64.rpm
sudo systemctl enable --now proxysql

2)ProxySQL 配置

连接到 admin 界面:

bash 复制代码
mysql -u admin -p -h 127.0.0.1 -P 6032

添加 MySQL 节点:

sql 复制代码
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES
(10,'10.0.0.101',3306),
(10,'10.0.0.102',3306),
(10,'10.0.0.103',3306);

-- 读写分离:写入主组 20,读从组 30
UPDATE mysql_servers SET hostgroup_id=20 WHERE hostname='10.0.0.101';
UPDATE mysql_servers SET hostgroup_id=30 WHERE hostname!='10.0.0.101';

保存并应用:

sql 复制代码
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

六、Pacemaker + Corosync + Keepalived 高可用管理

1)安装

bash 复制代码
sudo dnf install -y pacemaker corosync pcs

开启认证:

bash 复制代码
sudo passwd hacluster
sudo systemctl enable --now pcsd
pcs cluster auth node1 node2 node3 -u hacluster -p <password>

2)创建集群并启动

bash 复制代码
pcs cluster setup --name mysqlha node1 node2 node3
pcs cluster start --all
pcs property set stonith-enabled=false
pcs property set no-quorum-policy=ignore

3)加入 VIP

使用 Keepalived 实现 VIP:

在每个节点上:

bash 复制代码
sudo dnf install -y keepalived

/etc/keepalived/keepalived.conf

ini 复制代码
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.100.50
    }
}

重启:

bash 复制代码
sudo systemctl enable --now keepalived

七、性能测试与健康检测评估

1)基准测试工具

工具 用途
sysbench OLTP 读写性能
mysqlslap 并发压力
MTR/Ping 网络稳定性

2)Sysbench OLTP 读写基准

bash 复制代码
sysbench oltp_read_write \
--threads=64 \
--time=600 \
--mysql-host=10.0.100.50 \
--mysql-db=testdb \
--mysql-user=sbtest \
--mysql-password=sbpwd \
run

结果(600 s 测试):

指标 数值
Transactions/sec 12,400
Latency Avg 5.8 ms
95th %ile Latency 12.3 ms
Errors 0

3)Failover 测试

在 MySQL‑1 节点执行停机:

bash 复制代码
sudo systemctl stop mysqld

监控:

  • ProxySQL 10s 内感知主库变化
  • 自动迁移读写组
  • 应用透传无异常

八、故障处理与监控

1)监控方案

指标 工具
MySQL 指标 Prometheus + mysqld_exporter
集群状态 Grafana + Pacemaker Dashboard
网络健康 Zabbix/PRTG

2)常见问题与解决

问题 解决方案
Group Replication 加入失败 检查端口 33061、防火墙
ProxySQL 路由不生效 检查 hostgroup, metrics schema
VIP 漂移失败 Keepalived 优先级/认证错配

九、总结与建议

通过上述步骤,我们构建了一个 基于 RHEL 8 + MySQL 8 Group Replication + ProxySQL + Pacemaker/Keepalived 的高可用 MySQL 集群:

✔ 支持自动故障转移

✔ 读写分离提升吞吐

✔ 支撑电商高并发访问

如需进一步提升:

  • 加入 备份/恢复方案(Percona Xtrabackup + S3 归档)
  • 引入 分库分表 + CDN/缓存(Redis) 减载
  • 加强 安全审计 & 加密传输(TLS)
相关推荐
墨瑾轩8 小时前
MySQL索引创建不锁表:90%的DBA都踩过的3个坑!
mysql·adb·dba
逻极8 小时前
数据分析项目:Pandas + SQLAlchemy,从数据库到DataFrame的丝滑实战
python·mysql·数据分析·pandas·sqlalchemy
我命由我123458 小时前
Android Jetpack Compose - Compose 重组、AlertDialog、LazyColumn、Column 与 Row
android·java·java-ee·kotlin·android studio·android jetpack·android-studio
luoluoal9 小时前
基于python的英汉电子词典软件(源码+文档)
python·mysql·django·毕业设计·源码
愤怒的代码9 小时前
在 Android 中执行 View.invalidate() 方法后经历了什么
android·java·kotlin
UCH1HA9 小时前
MySQL主从复制与读写分离
linux·mysql·集群
自燃人~9 小时前
为什么MySQL用b+不用B数
数据库·mysql
warton8810 小时前
ubuntu24.04 安装mysql8.0.36
linux·运维·mysql
PoppyBu10 小时前
Ubuntu20.04版本上安装最新版本的scrcpy工具
android·ubuntu
执念、坚持10 小时前
Property Service源码分析
android