14.8.1 高可用架构设计与拓扑选型
高可用架构设计与拓扑选型#
目标与设计原则#
- 高可用目标:业务连续性、低故障切换时间(RTO)、可接受的数据丢失范围(RPO)。
- 扩展性目标:横向扩展、弹性扩缩容、读写压力分担。
- 可靠性原则:去单点、最小化故障域、分层隔离、自动化恢复。
- 一致性取舍:根据业务读写特性选择强一致或最终一致路径。
原理草图与典型拓扑#
1. 单ProxySQL + 后端主从#
2. 双ProxySQL主备 + Keepalived VIP#
3. 多ProxySQL + 负载均衡#
4. ProxySQL集群 + MySQL MGR/GTID#
拓扑选型维度#
- 业务读写比例:读多写少优先多ProxySQL分担读压力。
- SLA要求:高SLA选择多ProxySQL+自动切换。
- 成本与复杂度:成本敏感选择单/双ProxySQL。
- 网络与机房布局:跨机房部署需考虑延迟与一致性。
- 自动化能力:成熟运维体系适合复杂拓扑。
关键设计要点#
- ProxySQL层高可用:避免单点,配置同步与健康检查必备。
- 后端MySQL高可用:主从切换机制与延迟控制。
- 路由与权限隔离:读写分离、用户分级路由。
- 故障域隔离:ProxySQL与MySQL分布在不同物理/可用区。
- 扩展策略:通过增加ProxySQL节点与读库扩容。
安装与基础拓扑示例(双ProxySQL + VIP)#
1. 安装ProxySQL(两台)#
yum install -y proxysql
systemctl enable --now proxysql
systemctl status proxysql
2. 配置ProxySQL后端与读写分离(在主ProxySQL执行)#
# 连接管理端
mysql -h127.0.0.1 -P6032 -uadmin -padmin
# 添加后端节点
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight) VALUES(10,'10.0.0.11',3306,100);
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight) VALUES(20,'10.0.0.12',3306,100);
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight) VALUES(20,'10.0.0.13',3306,100);
# 读写分离规则
INSERT INTO mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply)
VALUES(1,1,'^SELECT.*',20,1);
# 用户与默认写组
INSERT INTO mysql_users(username,password,default_hostgroup,active)
VALUES('app','app_pass',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;
# 验证运行时
SELECT hostgroup_id,hostname,port,status FROM runtime_mysql_servers;
3. Keepalived提供VIP(两台)#
# 安装
yum install -y keepalived
# /etc/keepalived/keepalived.conf(主)
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.0.0.100/24
}
}
# /etc/keepalived/keepalived.conf(备)
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.0.0.100/24
}
}
systemctl enable --now keepalived
4. 验证VIP切换与读写分离#
mysql -h10.0.0.100 -P6033 -uapp -papp_pass -e "SELECT @@hostname;"
systemctl stop proxysql
ip a | grep 10.0.0.100
命令解释要点#
LOAD ... TO RUNTIME:将配置写入内存生效。
SAVE ... TO DISK:持久化配置,防止重启丢失。
destination_hostgroup:读写路由目标组。
default_hostgroup:写库默认组。
常见风险与排错#
1. VIP不漂移#
journalctl -u keepalived -n 100
ip link show
2. 读写未分离#
SELECT rule_id,match_pattern,destination_hostgroup,active
FROM runtime_mysql_query_rules;
SELECT username,default_hostgroup FROM runtime_mysql_users;
3. 后端不可用导致连接失败#
SELECT hostgroup_id,hostname,port,status
FROM runtime_mysql_servers;
-- status 非 ONLINE 需检查后端MySQL与网络
推荐实践#
- 中等规模:双ProxySQL主备 + MySQL主从。
- 高并发:多ProxySQL + HAProxy + MySQL多从。
- 高一致性:ProxySQL集群 + MySQL MGR/GTID。
- 跨机房:多ProxySQL多活,读写就近,写入统一主库。
- 搭建双ProxySQL + Keepalived VIP,模拟主机宕机验证VIP漂移与业务连续性。
- 添加一台读库,调整
mysql_servers权重并观察读流量分布。
- 编写脚本定期检查
runtime_mysql_servers状态并告警。