文章目录
- 每日一句正能量
- 两地三中心网络拓扑
- 1. 背景与问题
- 2. 环境与数据
- 3. 复现过程
- 4. 方案实施
- 4.1 异地切换演练详细步骤
- 5. 结果对比
- 6. 风险与复盘
- 6.1 网络抖动对复制延迟的量化分析
- 6.2 网络抖动排查与处理
每日一句正能量
“人生有三把钥匙,接受、改变、放下。”
与生活共舞——接受无法控制的,改变能够影响的,放下消耗能量的。
两地三中心网络拓扑
下图展示了本文涉及的两地三中心架构:主中心与同城中心通过同城专线互联,主中心与异地中心通过异地专线互联,同城中心与异地中心之间也建立专线连接,并标注了各链路的带宽与 RTT。
数据复制路径与故障切换优先级:
正常情况下,主中心数据库主节点通过同城专线将 WAL 日志实时同步到同城备节点,同时通过异地专线将 WAL 日志异步复制到异地备节点。同城专线 RTT 仅 2ms,用于承载高频、低延迟的同步复制流量,保证 RPO 尽可能趋近于 0;异地专线 RTT 为 12ms,用于承载异步归档与容灾复制,在保证数据不丢失的前提下降低跨地域传输成本。
当主中心发生故障时,切换优先级遵循「先同城、后异地」的原则:
- 同城中心优先接管:由于同城专线延迟低、数据同步程度高,同城备节点可在秒级内提升为主库,满足 RTO≤30 分钟、RPO≤5 分钟的目标,业务影响最小。
- 异地中心兜底接管:当同城中心同时不可用(如区域性灾难)时,才将异地备节点提升为主库。异地链路 RTT 较高,切换后复制延迟会有所上升,但能保证业务在更大范围灾难下继续可用。
同城专线与异地专线在 RTO/RPO 目标下作用不同:同城专线负责「快」,以低延迟同步复制保障 RPO;异地专线负责「稳」,以跨地域冗余保障极端场景下的业务连续性。两者互为补充,共同构成两地三中心的容灾体系。
1. 背景与问题
两地三中心架构能够提升业务连续性,但跨机房复制会受到网络带宽、往返时延(RTT)和链路稳定性的影响。如果评估不足,数据库同步延迟可能持续增大,最终影响RPO甚至切换成功率。本文结合TB级数据库异地灾备演练,介绍网络与延迟评估方法。
2. 环境与数据
- PostgreSQL 16
- 主中心+同城中心+异地中心
- 数据规模:2TB
- 专线带宽:1Gbps
- 平均RTT:12ms
目标:
- RTO≤30分钟
- RPO≤5分钟
压测工具:
- iperf3
- ping
- pg_basebackup
- WAL归档
3. 复现过程
部署流程:
- 建立主备复制。
- 测试带宽与RTT。
- 持续写入业务数据。
- 记录复制延迟。
故障注入:
- 断开主中心网络。
- 模拟链路抖动。
- 验证异地切换。
带宽测试:
iperf3-cstandby.example.com-t604. 方案实施
优化措施:
- 提升专线带宽至2Gbps。
- 启用WAL压缩。
- 调整归档策略。
- 演练自动切换流程。
验证SQL:
SELECTpg_is_in_recovery();SELECTnow()-pg_last_xact_replay_timestamp();检查项:
- RTT
- WAL传输速率
- 同步延迟
- RTO/RPO
- 业务健康检查
4.1 异地切换演练详细步骤
以下按时间顺序列出从故障注入到业务恢复的完整操作步骤,每一步均包含预期结果与验证命令。
下面是异地切换演练的完整流程图,覆盖从故障注入到业务恢复的 7 个步骤及关键判断节点:
步骤 1:故障注入
在主中心执行网络断连,模拟生产故障。
# 在主中心执行,断开与同城/异地中心的专线iptables-AOUTPUT-dstandby.example.com-jDROP预期结果:主中心与备节点心跳中断,主库进入降级状态。
验证命令:
ping-c3standby.example.com步骤 2:确认主库故障
在备节点确认主库不可达,并检查复制状态。
SELECT*FROMpg_stat_replication;预期结果:pg_stat_replication中无活跃 WAL 发送进程,主备连接已断开。
步骤 3:提升异地备节点为主库
在异地中心执行提升操作,将异地备节点切换为新主库。
pg_ctl promote-D/var/lib/postgresql/16/main预期结果:异地备节点退出恢复模式,开始接受读写请求。
验证命令:
SELECTpg_is_in_recovery();预期结果:返回f,表示已不再是备库。
步骤 4:业务流量切换
将应用连接串指向异地新主库,恢复业务写入。
# 更新应用配置并重载exportPGHOST=dr-center.example.com pg_isready-hdr-center.example.com-p5432预期结果:应用可正常连接新主库,业务写入恢复。
步骤 5:验证数据完整性
对比切换前后的数据量,确认无丢失。
SELECTcount(*)FROMorders;SELECTpg_last_wal_replay_lsn();预期结果:数据量与故障前一致,WAL 回放位置与主库故障前一致。
步骤 6:恢复原主中心并回切
修复主中心网络后,将原主中心作为新备库重新接入。
# 在原主中心执行pg_basebackup-hdr-center.example.com-D/var/lib/postgresql/16/main-Rsystemctl start postgresql预期结果:原主中心以备库身份重新加入复制,延迟逐步收敛。
验证命令:
SELECTnow()-pg_last_xact_replay_timestamp();预期结果:回放延迟持续下降,最终趋近于 0。
步骤 7:业务健康检查
确认整体链路与业务状态恢复正常。
iperf3-cdr-center.example.com-t60预期结果:带宽与 RTT 达到优化后基线,业务健康检查全部通过。
5. 结果对比
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 平均RTT | 12ms | 8ms |
| WAL延迟 | 18s | 6s |
| RTO | 31分钟 | 24分钟 |
| RPO | 6分钟 | 2分钟 |
| 带宽利用率 | 58% | 81% |
压测与恢复演练显示,链路优化后复制延迟明显降低,异地切换满足既定恢复目标。
6. 风险与复盘
6.1 网络抖动对复制延迟的量化分析
网络抖动(Jitter)是影响跨机房数据库复制延迟的关键因素之一。抖动会导致 WAL 数据包在传输过程中出现排队、重传或乱序,进而放大端到端的同步延迟。以下通过实测数据说明抖动幅度与延迟增大的关系。
抖动幅度与延迟增大的关系示例:
| 抖动幅度 | 平均RTT | WAL传输延迟 | 复制延迟增量 |
|---|---|---|---|
| 0ms(基线) | 12ms | 18s | 0s |
| ±5ms | 14ms | 24s | +6s |
| ±10ms | 18ms | 35s | +17s |
| ±20ms | 26ms | 52s | +34s |
| ±50ms | 41ms | 78s | +60s |
从上表可以看出,抖动幅度与复制延迟增量并非线性关系:当抖动超过 ±10ms 后,延迟增量呈加速放大趋势。这是因为抖动加剧了 TCP 拥塞窗口的频繁收缩,触发 WAL 数据包重传,同时备节点的回放进程因数据到达不连续而频繁等待,进一步拉高了端到端延迟。
监控建议:
- 使用
ping -i 0.2或iperf3 -u持续监测 RTT 抖动,关注抖动超过 ±10ms 的时段。 - 在 PostgreSQL 侧监控
pg_stat_replication中的write_lag、flush_lag和replay_lag,设置告警阈值(如 replay_lag > 30s)。 - 结合网络设备 SNMP 指标,关联分析抖动峰值与复制延迟尖峰的对应关系。
缓解建议:
- 对抖动敏感的业务流量启用 QoS 队列,优先保障 WAL 复制流量。
- 启用 TCP BBR 拥塞控制算法,提升高抖动链路上的吞吐稳定性。
- 适当调大
wal_sender_timeout与max_wal_senders,避免瞬时抖动导致复制会话被误判中断。 - 在抖动持续超过阈值时,主动降级为异步提交并告警,避免主库阻塞。
风险:
- 网络抖动会放大同步延迟。
- 带宽不足可能导致WAL积压。
- 未开展切换演练时,脚本和流程容易失效。
复盘建议:
- 定期执行带宽与时延压测。
- 每季度开展异地切换演练并记录RTO、RPO。
- 建立检查清单,包括链路、归档、恢复、业务验证。
- 持续监控复制延迟、WAL积压和网络质量。
本文围绕部署流程、故障注入、网络评估、RTO/RPO验证及检查清单,总结了跨机房灾备网络评估实践。
6.2 网络抖动排查与处理
当复制延迟持续偏高或出现周期性尖峰时,应优先排查链路抖动。以下给出具体的检测命令、输出分析示例,以及抖动超过 ±10ms 时的处理步骤与验证方法。
检测抖动:使用 ping 高频探测
ping -i 0.2以 200ms 间隔连续发包,可快速暴露 RTT 的波动情况:
# 在主中心执行,高频探测到异地中心的 RTT 抖动ping-i0.2-c100dr-center.example.com输出示例:
64 bytes from dr-center.example.com: icmp_seq=1 ttl=52 time=11.8 ms 64 bytes from dr-center.example.com: icmp_seq=2 ttl=52 time=12.1 ms 64 bytes from dr-center.example.com: icmp_seq=3 ttl=52 time=18.6 ms 64 bytes from dr-center.example.com: icmp_seq=4 ttl=52 time=12.0 ms 64 bytes from dr-center.example.com: icmp_seq=5 ttl=52 time=24.3 ms ... --- dr-center.example.com ping statistics --- 100 packets transmitted, 100 received, 0% packet loss rtt min/avg/max/mdev = 11.2/14.7/26.8/4.31 ms分析要点:mdev(平均偏差)超过 2ms 即存在明显抖动;当max - min超过 20ms 或mdev持续大于 3ms 时,通常对应抖动超过 ±10ms,需要介入处理。
检测抖动:使用 iperf3 UDP 模式
iperf3 -u通过 UDP 流量测量丢包与抖动(Jitter),更贴近 WAL 复制流量的真实传输特征:
# 在主中心执行,向异地中心发送 100Mbps 的 UDP 测试流iperf3-cdr-center.example.com-u-b100M-t30输出示例:
[ ID] Interval Transfer Bitrate Jitter Lost/Total Datagrams [ 5] 0.00-30.00 sec 358 MBytes 100 Mbits/sec 8.432 ms 152/26214 (0.58%)分析要点:Jitter字段即为抖动值,超过 10ms 即达到需要处理的阈值;Lost/Total丢包率超过 0.1% 时,说明链路已出现拥塞或队列溢出,会直接放大 WAL 传输延迟。
抖动超过 ±10ms 时的处理步骤
启用 QoS 队列,优先保障 WAL 复制流量
在两端核心交换机上为 PostgreSQL 复制端口(默认 5432)配置高优先级队列,确保抖动发生时 WAL 流量不被业务突发流量挤占:
# 以华为交换机为例,将 5432 端口流量标记为 EF 队列traffic classifier wal-cs operator and if-match tcp destination-port5432traffic behavior wal-ef queue ef bandwidth30启用 TCP BBR 拥塞控制算法
BBR 能更好地适应高抖动链路,减少因拥塞窗口频繁收缩导致的吞吐波动:
# 在主中心与异地中心的所有 PostgreSQL 节点上执行sysctl-wnet.core.default_qdisc=fqsysctl-wnet.ipv4.tcp_congestion_control=bbr# 持久化配置echo"net.core.default_qdisc=fq">>/etc/sysctl.confecho"net.ipv4.tcp_congestion_control=bbr">>/etc/sysctl.conf调大 wal_sender_timeout 与 max_wal_senders
避免瞬时抖动导致复制会话被误判中断,同时允许更多 WAL 发送进程并行传输:
-- 在主库执行,将超时从默认 60s 调大到 120sALTERSYSTEMSETwal_sender_timeout='120s';-- 适当增加发送进程数量ALTERSYSTEMSETmax_wal_senders=10;SELECTpg_reload_conf();抖动持续时主动降级为异步提交
当抖动持续超过阈值且无法快速恢复时,临时降级为异步提交,避免主库事务被复制延迟阻塞:
-- 在主库执行,临时降级ALTERSYSTEMSETsynchronous_commit=off;SELECTpg_reload_conf();
验证效果
处理完成后,重新执行抖动检测与复制延迟监控,确认指标回落:
# 复测抖动ping-i0.2-c100dr-center.example.com iperf3-cdr-center.example.com-u-b100M-t30-- 确认复制延迟回落SELECTnow()-pg_last_xact_replay_timestamp()ASreplay_lag;预期结果:mdev回落到 2ms 以内,iperf3的 Jitter 低于 10ms,丢包率趋近于 0,replay_lag从抖动期间的数十秒回落到秒级以内,复制延迟恢复稳定。
转载自:https://blog.csdn.net/u014727709/article/details/164125248
欢迎 👍点赞✍评论⭐收藏,欢迎指正