在当前企业对系统高可用性、业务连续性和容灾能力提出越来越高的要求背景下,数据库的异地多活、跨机房部署逐渐成为必须掌握的系统架构能力。特别是当系统的稳定性和数据安全性牵涉到企业经营命脉时,容错与恢复能力的设计不能只停留在理论层面,而是需要真正落地、可操作、易维护。
本文将结合某省公司真实案例,完整剖析如何从一套传统单机房 MySQL 主备架构,逐步演进为具备容灾能力的跨机房单主多活、可切换高可用架构。内容包括架构演进思路、技术组件选型、系统改造策略、异常场景应对及相关实现细节。
一、项目背景与挑战分析
1.1 需求来源与背景说明
这是一家省级单位企业,考虑到信息安全、数据自主可控等政策要求,希望对现有 MySQL 存储架构进行改造:
- 系统需支持高可用(HA)与容灾能力;
- 所有核心服务在跨城市部署的双 IDC 之间互为备份;
- 落地周期短,对技术栈与团队能力兼容性要求高;
- 不引入过多复杂或高度定制的组件,保证后期可维护性。
1.2 原始架构(初始状态)
最初这家单位使用的是非常常见的一种模式:
- 主备模式(同 IDC);
- 借助 MHA 管理主从复制;
- DNS 域名解析控制主机访问 IP;
- 管理后台将主库 IP 写入 DNS 记录实现主备切换;
- 应用访问走的是固定域名 → 实际解析至当前主库。
1.3 存在的问题
该架构在实际运行中暴露出多个典型问题:
| 问题 | 说明 |
|---|---|
| 资源利用不均 | 主库负载过高,备库长期空转无业务承载能力 |
| DNS 缓存不可控 | 域名解析更新具有延迟,导致故障切换缓慢 |
| MHA 切换耗时长 | 故障检测 + 切换时间往往需几十秒至几分钟 |
| 单 IDC 风险高 | 机房断电或断网导致主备全部不可用 |
| 组件单点明显 | MHA、DNS、管理后台本身无高可用支持 |
这些问题在实际生产场景中一旦触发,后果非常严重,尤其是主机房不可用情况下,可能导致系统完全失效、数据不可写、业务无法响应。
二、第一阶段改造:基于注册中心与数据库代理实现读写分离与资源复用
在充分理解了上述问题后,我们提出了一套基于**“注册中心 + 数据库代理”**的第一阶段方案。
2.1 关键改进点
- 抛弃 DNS,改用配置中心(如 Nacos、Zookeeper);
- 管理后台探测主从状态写入注册中心;
- 数据库代理实现读写分离能力;
- 应用通过逻辑数据库名访问数据库,代理根据注册中心提供的主从 IP 完成流量分发。
2.2 代理选型
以下组件可以选择:
- ShardingSphere-Proxy
- ProxySQL
- MyCat2
- Cobar、Atlas、MaxScale 等等
这些代理通常支持:
- 读写分离
- 动态主从切换
- 插件扩展机制
2.3 改造效果分析
| 优势 | 问题 |
|---|---|
| 可动态读取主从状态 | 配置中心、管理后台也需高可用部署 |
| 避免 DNS 缓存问题 | 架构更复杂,组件增多 |
| 从库参与读负载 | 改造成本提升,需二次开发代理与探测脚本 |
| 有可观扩展性 | 故障恢复流程仍不够自动化 |
三、第二阶段优化:引入 Orchestrator,简化架构 + 提升高可用性
为了进一步解决“组件太多、故障转移逻辑复杂”的问题,我们引入了Orchestrator(简称 orc)。
3.1 为什么选择 Orchestrator?
Orchestrator 是一款开源的 MySQL 拓扑管理平台,具备以下特性:
- 自动发现主从拓扑结构;
- 图形界面可视化展示;
- 支持手动和自动主从切换;
- 自带 Raft 选举算法,支持自身 HA;
- 可作为配置中心提供主从信息。
Orchestrator 在 GitHub 地址:https://github.com/openark/orchestrator
3.2 新架构设计
- Orchestrator 集群替代了 MHA + 配置中心 + 拓扑监控;
- 仅需部署 3 台小规格服务器,即可实现自我高可用;
- 数据库代理维护 3 个 Orchestrator 节点 IP,任意节点失效可自动重试;
- 支持应用无感知切换。
四、异地容灾落地方案:跨机房一主多从 + 写转发 + 手动切换
接下来要解决的核心问题是——如何实现跨 IDC 的容灾能力?
4.1 架构设计目标
- 主写副读:所有写操作统一由主 IDC 承担;
- 读操作就近执行:优先选择本地可用节点;
- Orchestrator 部署双份:主集群 + 备用集群,备用集群常态不启用;
- 同步链路通过专线:确保延迟可控、网络安全。
4.2 写转发机制实现
由于跨机房写入难以保证强一致性,我们采取单点写入 + 异步复制:
-
应用位于 IDC2 时发起写请求;
-
数据库代理将写请求转发至 IDC1;
-
IDC1 主库完成写入并同步给:
- IDC1 本地从库;
- IDC2 所有从库。
4.3 手动切换机制(灾备启用)
当主 IDC 整体不可用时,切换流程如下:
- 人工介入判断故障严重性;
- 登录备用 IDC,手动启用备用 Orchestrator 集群;
- 集群探测同步状态,选出最新从库为主;
- 代理层重建连接并更新写入路径;
- 应用自动切换为本地写入;
警告:严禁自动切换,跨机房异步复制可能导致数据丢失/错乱,必须手动评估同步状态,先补救数据再做切换。
五、组件改造与实现细节
5.1 数据库代理扩展点
-
支持从 Orchestrator 获取拓扑信息
- 通过 HTTP API 拉取主从 IP 列表;
- 每分钟自动刷新,或变更时主动通知;
-
支持远程写转发机制
- 代理判断当前节点为备用机房时,自动将写请求转发;
- 保证写操作始终统一调度至主库。
-
异常重试机制
- 代理连接多个 Orchestrator IP;
- 任意节点故障自动切换连接。
5.2 跨机房同步策略
- 所有从库均挂载至主库;
- 网络由专线保证带宽和时延;
- Orchestrator 会自动监控同步状态;
- 对于同步延迟严重的节点,业务禁止读取。
六、方案总结与可扩展性分析
6.1 技术架构总结图
应用 --> 代理 --> 本地读库
\
\---> 写请求 --> 主库 --> 所有从库(含远程IDC)
6.2 方案优点
| 项目 | 描述 |
|---|---|
| 高可用性 | Orchestrator + 只读转发 + 主备监控 |
| 成本可控 | 不引入昂贵商用方案,组件轻量 |
| 跨 IDC 容灾 | 手动切换机制保证数据一致性 |
| 运维友好 | Orchestrator 提供完整拓扑图与状态接口 |
6.3 后续优化方向
- 引入 Binlog 校验机制,进一步保障数据一致;
- 建立延迟监控告警系统;
- 增强写转发失败兜底逻辑;
- 增加自动化切换辅助工具;
- 实现应用层智能路由策略。
七、结语
在这个案例中,我们从最初的“同 IDC 单主单备 + MHA + DNS”架构,逐步演进为“跨 IDC 多活 + Orchestrator + 数据库代理 + 手动切换”的完整可落地方案。整个过程中,我们关注的不仅是技术选型,更是如何兼顾成本、可控性、可维护性与容灾能力。
这套方案已在目标省公司进入落地阶段,初步运行结果良好。希望本文能为你提供切实可行的思路和实践经验,真正推动你的数据库架构走向高可用、易扩展的现代化方向。

847

被折叠的 条评论
为什么被折叠?



