1. 项目概述
MySQL作为最流行的开源关系型数据库之一,在企业级应用中扮演着重要角色。当业务规模扩大、数据量增长时,单机MySQL往往难以满足高并发、高可用的需求。这时,搭建MySQL集群并实现多数据源管理就成为数据库架构设计的核心课题。
我在过去五年中为多家企业设计过MySQL集群方案,从简单的读写分离到复杂的多机房部署都实践过。今天要分享的这套方案,是基于Galera Cluster和ProxySQL的成熟架构,已经在生产环境稳定运行三年,支撑着日均千万级的查询请求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 架构设计与选型
2.1 为什么选择Galera Cluster
Galera Cluster是基于同步复制的多主架构方案,相比传统的MySQL主从复制有几个显著优势:
- 真正的多主架构:所有节点都可读写,没有单点故障
- 同步复制:数据强一致性保证,不会出现主从延迟
- 自动成员管理:节点故障自动检测和恢复
- 对应用透明:连接任意节点操作体验一致
我们曾经对比过MGR(MySQL Group Replication)和Galera,最终选择Galera的原因是:
- 对老版本MySQL兼容更好(我们当时还在用5.7)
- 社区版功能已经足够完善
- 周边工具链更成熟
2.2 ProxySQL的核心价值
单纯的Galera集群虽然解决了数据同步问题,但缺乏以下能力:
- 读写分离
- 连接池管理
- 负载均衡
- 故障自动转移
ProxySQL作为高性能中间件完美补足了这些能力。它的几个杀手级特性:
- 规则引擎:可以基于SQL模式、用户、schema等维度定义路由规则
- 查询缓存:对重复查询可以缓存结果
- 监控模块:实时检测后端节点健康状态
- 动态配置:绝大多数参数可以热加载
3. 环境准备与安装
3.1 服务器规划建议
对于生产环境,我建议至少3台服务器组成集群,配置参考:
| 角色 | CPU | 内存 | 磁盘 | 网络 |
|---|---|---|---|---|
| Galera节点 | 8核+ | 32G+ | SSD RAID10 | 万兆内网 |
| ProxySQL | 4核 | 16G | 普通SSD | 千兆 |
重要提示:Galera节点间的网络延迟必须控制在1ms以内,否则会严重影响集群性能
3.2 软件安装步骤
- 安装Galera Cluster(以CentOS 7为例):
bash复制# 添加Percona仓库
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
# 安装Percona XtraDB Cluster
yum install Percona-XtraDB-Cluster-57
- 配置Galera参数(/etc/my.cnf关键部分):
ini复制[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_name=my_galera_cluster
wsrep_cluster_address=gcomm://node1_ip,node2_ip,node3_ip
wsrep_node_name=node1
wsrep_node_address=current_node_ip
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
- 初始化集群(在第一台节点执行):
bash复制systemctl start mysql@bootstrap.service
4. ProxySQL配置详解
4.1 基础配置流程
- 安装ProxySQL:
bash复制yum install proxysql
- 登录管理接口:
bash复制mysql -u admin -padmin -h 127.0.0.1 -P 6032 --prompt='ProxySQL> '
- 添加后端服务器:
sql复制INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES
(10,'galera_node1_ip',3306),
(10,'galera_node2_ip',3306),
(10,'galera_node3_ip',3306);
4.2 读写分离规则配置
sql复制-- 定义读写hostgroup
INSERT INTO mysql_replication_hostgroups VALUES (10,20,'read_only','cluster1');
-- 设置用户映射
INSERT INTO mysql_users(username,password,default_hostgroup) VALUES
('app_user','password',10);
-- 配置读写分离规则
INSERT INTO mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) VALUES
(1,1,'^SELECT.*FOR UPDATE',10,1),
(2,1,'^SELECT',20,1),
(3,1,'^INSERT',10,1),
(4,1,'^UPDATE',10,1),
(5,1,'^DELETE',10,1);
-- 加载配置到运行时
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL USERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;
-- 持久化配置
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL USERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;
5. 多数据源管理方案
5.1 业务分库场景
当业务需要访问多个独立MySQL实例时(如分库分表、多租户),可以通过ProxySQL的hostgroup机制实现:
- 定义不同业务的hostgroup:
sql复制INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES
(30,'order_db_ip',3306), -- 订单库
(40,'user_db_ip',3306); -- 用户库
- 配置基于schema的路由规则:
sql复制INSERT INTO mysql_query_rules(rule_id,active,schemaname,destination_hostgroup,apply) VALUES
(10,1,'order_db',30,1),
(11,1,'user_db',40,1);
5.2 读写分离+分库组合方案
对于更复杂的场景,可以组合使用多种规则:
sql复制-- 订单库读写分离
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES
(30,'order_master_ip',3306),
(31,'order_slave1_ip',3306),
(31,'order_slave2_ip',3306);
-- 用户库读写分离
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES
(40,'user_master_ip',3306),
(41,'user_slave1_ip',3306);
-- 复合路由规则
INSERT INTO mysql_query_rules(rule_id,active,schemaname,match_pattern,destination_hostgroup,apply) VALUES
(20,1,'order_db','^SELECT',31,1),
(21,1,'order_db',NULL,30,1),
(22,1,'user_db','^SELECT',41,1),
(23,1,'user_db',NULL,40,1);
6. 监控与运维要点
6.1 关键监控指标
- Galera集群状态监控:
sql复制SHOW STATUS LIKE 'wsrep%';
重点关注:
- wsrep_ready:节点是否准备好接收查询
- wsrep_connected:节点是否连接到集群
- wsrep_cluster_size:健康节点数量
- wsrep_flow_control_paused:复制是否出现延迟
- ProxySQL监控:
sql复制SELECT * FROM stats_mysql_connection_pool;
SELECT * FROM stats_mysql_query_rules;
6.2 常见故障处理
场景1:脑裂问题
当网络分区发生时,可能出现多个子集群各自为政。处理步骤:
- 确认多数派节点(wsrep_cluster_size最大的子集群)
- 在少数派节点执行:
sql复制SET GLOBAL wsrep_provider_options='pc.bootstrap=YES';
场景2:ProxySQL规则不生效
排查流程:
- 检查规则是否加载到运行时:
sql复制SELECT * FROM runtime_mysql_query_rules;
- 查看查询匹配情况:
sql复制SELECT hostgroup, digest, count_star FROM stats_mysql_query_digest;
7. 性能优化实践
7.1 Galera参数调优
ini复制# 优化写入性能
wsrep_slave_threads = 16
innodb_flush_log_at_trx_commit = 2
# 避免流控
gcs.fc_limit = 256
gcs.fc_factor = 0.9
# 大事务处理
wsrep_max_ws_size = 2G
7.2 ProxySQL连接池配置
sql复制UPDATE global_variables SET variable_value='1000' WHERE variable_name='mysql-max_connections';
UPDATE global_variables SET variable_value='300' WHERE variable_name='mysql-default_query_delay';
UPDATE global_variables SET variable_value='300' WHERE variable_name='mysql-default_query_timeout';
8. 生产环境踩坑记录
- 大事务导致集群阻塞
现象:一个百万级UPDATE导致整个集群卡死
解决:拆分为小批次更新,每批1000条,增加wsrep_max_ws_size
- ProxySQL内存泄漏
现象:运行一个月后OOM
解决:定期重启ProxySQL(通过cron每周重启)
- 跨机房延迟问题
现象:异地机房节点频繁流控
解决:改为同机房部署,使用专线网络
这套架构经过多次迭代,目前支撑着我们核心业务的数据库访问,QPS峰值能达到3万+。最关键的经验是:监控要全面,变更要谨慎,任何参数调整都要先在测试环境验证。
