3. 主从架构基础:数据库主从复制原理、读写分离架构、切换对业务的影响

在数据库高可用架构中,主从复制与读写分离是最基础且应用最广泛的模式。理解其底层原理、架构设计以及切换时的业务影响,是后续进行 Terraform 驱动主从切换移植适配的前提。本章将拆解这三个核心知识点,并配合架构图与流程表进行说明。

3.1 数据库主从复制原理

主从复制(Master-Slave Replication)的核心机制是:主库(Master)将数据变更记录到二进制日志(Binlog),从库(Slave)通过 I/O 线程拉取日志并写入中继日志(Relay Log),再由 SQL 线程重放日志以保持数据同步。常见的复制模式包括异步复制、半同步复制和全同步复制。

复制模式 数据一致性 性能影响 典型场景
异步复制 最终一致,主库故障可能丢数据 主库无等待,性能最高 日志、报表、非关键业务
半同步复制 至少一个从库确认收到日志后才提交 主库有轻微延迟,性能折中 金融交易、订单系统
全同步复制 所有从库确认后才提交,强一致 主库等待所有从库,性能最低 分布式数据库、强一致性要求
实践提示:在变更窗口的主从切换场景中,半同步复制是推荐的最低配置。它能在保证数据不丢失的前提下,维持可接受的写入性能,避免异步复制带来的数据丢失风险。

3.2 读写分离架构

读写分离架构将写流量(INSERT/UPDATE/DELETE)路由到主库,将读流量(SELECT)分发到多个从库,从而降低主库负载、提升系统吞吐量。常见的实现方式包括:应用层代码路由、中间件代理(如 ProxySQL、MaxScale)以及数据库原生读写分离。

  • 应用层路由:开发人员在代码中显式指定数据源,灵活性高但耦合度强。
  • 中间件代理:通过透明代理层自动解析 SQL 并分发流量,对应用透明,便于统一管理。
  • 数据库原生:部分云数据库或分布式数据库内置读写分离能力,配置简单。
架构要点:读写分离的核心挑战在于数据一致性延迟。从库复制存在天然延迟,可能导致刚写入的数据无法立即被读到。常见解决方案包括:强制读主库(写后读一致性)、延迟阈值控制、以及使用缓存中间件。
主从复制与读写分离架构 主从复制与读写分离架构 主库 (Master) 写流量 (INSERT/UPDATE/DELETE) 从库 1 (Slave) 读流量 (SELECT) 从库 2 (Slave) 读流量 (SELECT) 从库 3 (Slave) 读流量 (SELECT) Binlog 拉取 Relay Log 重放 Binlog 拉取 读写分离代理 应用层 / 中间件 说明: 主库负责写,从库负责读。 代理层自动分发流量, 对应用透明。

3.3 主从切换对业务的影响

主从切换(Failover / Switchover)是指将主库角色转移给一个从库,原主库降级为从库或下线。切换操作对业务的影响主要体现在连接中断、数据一致性和性能抖动三个方面。

关键风险:切换过程中,如果从库复制延迟较大,未同步的数据可能丢失,导致业务数据不一致。因此,切换前必须检查复制延迟(Seconds_Behind_Master),并确保延迟在可接受范围内。

3.3.1 切换流程与影响分析

阶段 操作内容 对业务的影响 持续时间
1. 前置检查 检查复制延迟、主从状态、磁盘空间 无影响,只读操作 秒级
2. 阻塞写入 关闭主库写入权限或设置只读 写操作失败或排队,读正常 秒级到分钟级
3. 等待同步 等待从库追上主库最后一条日志 写操作持续阻塞 取决于延迟大小
4. 角色切换 将从库提升为新主库,原主库降级 连接短暂中断(秒级) 秒级
5. 恢复写入 应用重新连接新主库,恢复写流量 业务恢复,可能有少量重试 秒级

3.3.2 切换对业务的具体影响

  • 连接中断:切换瞬间,数据库连接池中的连接会失效,应用需要重新建立连接。如果连接池配置不当(如超时时间过短),可能导致大量请求失败。
  • 数据不一致:异步复制模式下,主库故障时未同步的 Binlog 会丢失,导致新主库缺少部分数据。半同步复制可大幅降低此风险。
  • 性能抖动:切换后,新主库需要重新建立复制关系、加载缓存,短时间内性能可能低于正常水平。同时,应用层的重试风暴可能加剧负载。
  • 读写分离失效:如果切换后未及时更新读写分离代理的路由规则,部分读流量可能仍指向旧主库,导致数据读取错误。
主从切换流程与影响时间线 主从切换流程与影响时间线 1 2 3 4 5 前置检查 阻塞写入 等待同步 角色切换 恢复写入 无影响 写失败/排队 写持续阻塞 连接中断 业务恢复 秒级 秒~分钟 取决于延迟 秒级 秒级 关键影响总结: 1. 写操作在阶段 2-3 持续阻塞,是业务影响最大的窗口。 2. 阶段 4 连接中断时间最短,但需要应用层做好重试和连接池管理。

3.4 切换对 Terraform 驱动适配的启示

在 Terraform 驱动的自动化切换方案中,需要重点关注以下适配点:

  • 复制状态检测:Terraform 资源或外部数据源需要能够读取 Seconds_Behind_Master 等指标,作为切换前置条件。
  • 连接池管理:切换后,Terraform 需要触发应用层的连接池刷新或 DNS 更新,避免旧连接残留。
  • 读写分离路由更新:如果使用中间件代理,Terraform 需要调用 API 更新路由规则,将写流量指向新主库。
  • 回滚能力:切换失败时,Terraform 应能自动触发回滚流程,将角色恢复至切换前状态。
最佳实践:在 Terraform 中定义主从切换的状态机,将前置检查、阻塞写入、等待同步、角色切换、恢复写入、回滚等步骤抽象为独立的模块或资源,便于复用和测试。