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(两台)#

# 以CentOS为例
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切换与读写分离#

# 客户端连接VIP
mysql -h10.0.0.100 -P6033 -uapp -papp_pass -e "SELECT @@hostname;"

# 停止主ProxySQL测试切换
systemctl stop proxysql
ip a | grep 10.0.0.100   # 预期VIP漂移至备机

命令解释要点#

  • LOAD ... TO RUNTIME:将配置写入内存生效。
  • SAVE ... TO DISK:持久化配置,防止重启丢失。
  • destination_hostgroup:读写路由目标组。
  • default_hostgroup:写库默认组。

常见风险与排错#

1. VIP不漂移#

# 查看keepalived日志
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多活,读写就近,写入统一主库。

练习#

  1. 搭建双ProxySQL + Keepalived VIP,模拟主机宕机验证VIP漂移与业务连续性。
  2. 添加一台读库,调整mysql_servers权重并观察读流量分布。
  3. 编写脚本定期检查runtime_mysql_servers状态并告警。