把查询分流到海外副本,不等于自动获得更快、更可靠的数据库。跨地域复制存在延迟,主库故障后副本也未必包含最新提交。制定海外业务数据库读写分离部署策略,应先回答两个问题:哪些请求可以读到稍旧的数据,故障时允许丢失多少已确认写入?
先画清读写边界
读写分离通常由应用或数据库代理将写请求发往主库,将符合条件的查询发往只读副本。以 PostgreSQL 流复制为例,备用节点接收并重放主节点的 WAL;在网络或负载影响下,重放进度可能落后。副本可用于报表、目录浏览等容忍短暂延迟的场景,但不能默认适用于所有读取。
- 必须读到刚写入的内容:登录后读取新建资料、提交后查询订单状态等请求,应继续读主库,或在确认副本追平后再切换。
- 可接受短暂旧值:分析查询、内容浏览等可读副本,但要确认产品逻辑能够容忍延迟。
- 涉及余额、权限或库存:评估并发更新和事务约束,不能仅靠把查询改发副本来保证正确性。
同步复制可以减少特定故障下已确认事务的丢失风险,但跨洲等待确认可能增加写入时延;异步复制通常不必等待远端副本确认,却可能在主库突然失效时丢失尚未复制的数据。两者都需要结合业务目标和网络条件选择。
把故障切换条件写成规则
故障切换不是简单地“主库连不上就提升副本”。网络分区可能让旧主库仍在部分客户端看来可用;若新旧节点同时接受写入,就会出现双主风险。应明确故障判定、唯一提升权限、客户端重连方式,以及旧主库恢复后如何重新加入集群。
先定可接受的损失与恢复时间
RPO表示可接受的数据丢失窗口,RTO表示恢复服务所需时间。它们是目标,不是系统保证值:实际结果受复制方式、故障检测、人工审批、数据量及网络状况影响。若业务不能接受已确认交易丢失,就必须评估同步确认范围和故障时的写入可用性;若优先快速恢复,则要明确异步复制下的风险。
部署前按顺序验证
- 列出数据库写入、读后写请求和可延迟查询,给每类流量标注允许的延迟与一致性要求。
- 测量主库到候选副本的网络稳定性和复制延迟,在正常负载及高峰负载下分别观察;不要把单次测量当作长期保证。
- 选择同步或异步复制,并设定副本落后时的处理方式:暂停分流、回退主库,或让请求失败并提示重试。
- 定义提升副本的授权和防止旧主继续写入的措施,检查连接池、代理和应用重试是否会放大故障。
- 演练主库不可用、链路中断和副本落后三类情况,记录数据核对、切换、回切及恢复写入的步骤。
若副本延迟超过业务阈值,读请求应有明确回退路径;盲目继续分流可能把旧数据展示给用户。日志与告警至少应覆盖复制状态、延迟变化、主从角色和切换事件,并由值班人员定期验证告警是否可操作。
按读者需求决定部署形态
单一主库加远端只读副本,结构较简单,适合以读扩展和就近查询为主、能够容忍异步延迟的系统;代价是远端写入仍需经过主库,主库故障时需要受控提升。多地同时写入则需要处理冲突、全局约束与网络分区,复杂度显著更高,不应仅为缩短读路径而采用。
因此,海外业务数据库读写分离部署策略的核心不是副本数量,而是把一致性边界、写入权和恢复责任落实到应用与运维流程。先定义哪些数据允许稍旧,再演练故障切换,才能判断读写分离是否适合当前业务。
常见问题
副本延迟时,能否继续提供查询?
取决于该查询允许多旧的数据。超过业务设定阈值后,应回退主库或暂缓请求,不要默认展示过期结果。
所有查询都应该发往副本吗?
不应该。读后写、权限校验及强一致性要求较高的查询,通常应读主库,或采用经过验证的追平机制。
异步复制故障切换一定会丢数据吗?
不一定,但主库突然失效时,尚未到达副本的事务可能丢失。实际风险取决于复制延迟和故障发生时机。
主库恢复后可以直接接回流量吗?
不宜直接切回。应先确认旧主已停止写入、数据已与当前主库协调,并按既定流程重新加入,避免出现两个写入源。