15.1 引言:中间件为何需要高可用?
在大型分布式系统中,数据库中间件承担着请求路由、读写分离、分库分表、连接池管理等核心功能,一旦宕机或异常:
-
上游服务 SQL 无法路由
-
连接池失效造成连接雪崩
-
多数据源切换不及时引发主备不一致
因此,数据库中间件的高可用架构设计和容灾机制 是保障业务连续性的关键。
15.2 高可用架构设计模式总览
bash
graph TD
A[客户端] --> B[中间件实例 1]
A --> C[中间件实例 2]
A --> D[中间件实例 3]
B & C & D --> E[数据库集群]
F[注册中心 & 配置中心] --> B
F --> C
F --> D
架构组件 | 功能说明 |
---|---|
多实例部署 | 消除单点故障 |
注册中心 | 服务发现与健康检查 |
配置中心 | 配置同步与动态热加载 |
心跳机制 | 实例状态同步,主动剔除异常节点 |
数据库高可用架构 | 支持 MySQL 主从、PXC、TiDB 等集群 |
15.3 高可用实例管理机制
✅ 服务注册与心跳机制
-
所有中间件节点注册到注册中心(如 Nacos/Zookeeper)
-
每隔 5s 上报心跳,包含自身 IP、版本、可用状态
-
异常节点标记为
DOWN
,客户端可剔除
javascript
{
"instanceId": "middleware-1",
"status": "UP",
"role": "leader",
"lastHeartbeat": 1700000000
}
实例选主机制(选举 Leader)
-
支持 Raft/Zookeeper 实现主节点选举
-
主节点负责协调全局事务、全局路由策略等
-
其他节点为从节点,提供读写服务
15.4 容灾机制设计
场景 | 容灾策略 |
---|---|
中间件节点宕机 | 使用客户端负载均衡 + 实例健康检查剔除失效节点 |
数据库主节点故障 | 中间件自动切换至从库(主备切换通知) |
配置中心不可用 | 使用本地缓存配置 + 灰度降级策略 |
网络分区/分区脑裂 | 使用 Zookeeper+Epoch 实现分布式一致性 |
SQL 路由规则异常 | 启用旧版本配置回退,自动恢复路由表 |
15.5 高可用部署方式实战建议
☁️ 部署模型推荐:
部署方式 | 优点 | 缺点 |
---|---|---|
容器部署(K8s) | 弹性伸缩、资源隔离 | 学习成本高,需要 DevOps 能力 |
VM 多节点部署 | 易于控制网络环境 | 部署复杂,维护难度略高 |
混合部署(K8s+物理) | 中间件容器化,数据库物理部署 | 网络延迟控制难,配置复杂 |
服务发现建议:
-
Nacos:轻量、支持 Spring Cloud 接入
-
Zookeeper:一致性强、适合选举类服务
-
Etcd:性能优秀,支持 gRPC 通信
15.6 多数据中心容灾方案
架构形式 | 特点 | 适用场景 |
---|---|---|
主备容灾 | 一主一备,切换速度快 | 同城多机房 |
主主互备 | 双活架构,需做好数据冲突解决机制 | 强一致性要求不高 |
三地两中心 | 两活一备,兼顾数据安全与可用性 | 金融/保险等核心业务系统 |
跨云灾备 | 多云部署,保障对公有云依赖不单点 | 监管要求、云中立部署场景 |
15.7 设计实践建议与避坑指南
实践建议 | 理由 |
---|---|
中间件本身需无状态 | 利于容器扩缩容和快速迁移 |
所有模块支持 graceful shutdown | 避免连接池、事务中断 |
注册中心支持客户端缓存 | 避免因注册中心故障导致全网不可用 |
使用统一日志追踪链路(traceId) | 便于故障排查、链路压测 |
灾备演练定期进行 | 模拟故障切换,测试中间件与客户端行为 |
15.8 总结
本篇你掌握了:
-
数据库中间件高可用架构的设计思路
-
多节点部署、服务注册与健康检查机制
-
容灾机制应对不同异常场景
-
跨机房/跨云部署的灾备架构方案
-
实际部署中的工程实践建议与注意事项