
在电商平台生产环境中,数据库是核心支撑系统,既要高吞吐、高并发 ,又要高可用、零宕机 。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)