一、为什么需要流复制高可用?

想象一下医院的急诊系统——哪怕停电一秒钟,都可能影响患者的生命数据。数据库的高可用(High Availability)就像这个系统的备用电源,而流复制(Streaming Replication)则是其中最关键的技术之一。openGauss作为国产数据库的明星产品,通过流复制实现数据的实时同步,当主库宕机时,备库能在秒级接管业务,保障服务连续性。

经典应用场景

  1. 金融交易核心系统(不允许订单丢失)
  2. 政务平台(7×24小时服务要求)
  3. 物联网实时数据采集(TB级数据容灾)
  4. 电商大促期间(突发流量下的故障熔断)

二、流复制原理揭秘:数据如何"跑"起来?

openGauss的流复制基于WAL(Write-Ahead Logging)机制,其工作流程可简化为三个步骤:

  1. 主库写日志:用户提交事务时,主库先将变更写入WAL文件
  2. 异步传输:通过TCP连接将WAL记录流式传输到备库
  3. 备库重放:备库按照顺序解析并应用这些日志记录

关键参数解析(postgresql.conf):

synchronous_commit = on           # 同步提交模式(数据强一致)
wal_level = logical               # WAL日志级别(影响复制功能)
max_wal_senders = 8               # 最大WAL发送进程数

注:生产环境中建议max_wal_senders至少配置为备库数量+2,避免复制进程阻塞。


三、手把手搭建流复制环境(技术栈:openGauss 3.0 + CentOS 7.6)

3.1 初始化主库配置
port = 5432
listen_addresses = '*'
wal_level = hot_standby
archive_mode = on
archive_command = 'cp %p /archive/%f'
max_wal_senders = 5

# 主库pg_hba.conf添加备库访问权限
host    replication     gaussdb     192.168.1.2/32     sha256
3.2 备库全量同步
# 通过基备份初始化备库
gs_basebackup -D /opt/data/standby -h 192.168.1.1 -p 5432 -U gaussdb -W

# 备库配置recovery.conf
standby_mode = on
primary_conninfo = 'host=192.168.1.1 port=5432 user=gaussdb password=xxx'
recovery_target_timeline = 'latest'

操作口诀:"一配二备三启"——主库配置→备库基备→启动同步验证。


四、故障转移实战:gs_ctl的十八般武艺

4.1 主库健康检查
# 检查主库WAL发送状态
gs_ctl query -D /opt/data/master

# 输出样例
PID     | STATE      | SENT_LSN   | WRITE_LSN  
-----------------------------------------------
11234   | streaming  | 0/18000000 | 0/180000FF
4.2 计划内切换
# 在主库执行优雅切换
gs_ctl switchover -D /opt/data/master

# 在备库提升为主库
gs_ctl promote -D /opt/data/standby

注:switchover需要主备网络连通,promote用于强制提升(主库已不可用时)

4.3 网络中断模拟测试
# 阻断主备网络(测试故障场景)
iptables -A INPUT -s 192.168.1.2 -j DROP

# 观察复制延迟
SELECT * FROM pg_stat_replication;

五、调优三板斧:让复制飞起来

5.1 WAL传输优化
# 调整发送缓冲区(默认8MB,大流量场景可调至32MB)
wal_sender_timeout = 60s
wal_receiver_timeout = 60s
max_replication_slots = 10
5.2 并行重放加速
# 备库配置(提升重放速度)
max_worker_processes = 16
parallel_workers = 8
hot_standby_feedback = on
5.3 监控指标看什么?
-- 关键监控SQL
SELECT 
    application_name,
    state,
    write_lag,
    flush_lag 
FROM pg_stat_replication;

六、技术方案选型:你的业务适合吗?

优势清单
✅ 数据零丢失(同步模式)
✅ 切换秒级完成
✅ 开源可控(无商业授权风险)
⚠️ 潜在风险点

  1. 跨地域部署时需评估网络延迟
  2. 同步模式可能影响写入性能
  3. 主备硬件差异导致性能瓶颈

典型案例对比

方案类型 RPO RTO 适用场景
流复制 0-1秒 <30秒 金融/政务核心系统
逻辑复制 分钟级 分钟级 报表分离/跨版本升级

七、血泪经验:那些年我们踩过的坑

  1. WAL文件堆积
    故障现象:pg_wal目录暴涨至磁盘占满
    根治方案:定期检查归档任务,设置wal_keep_segments

  2. 脑裂危机
    触发场景:主备网络闪断后同时提供服务
    规避方法:部署第三方仲裁(如ETCD)

  3. 配置不一致
    典型报错:参数max_connections不一致导致复制中断
    处理流程:统一主备库参数模板


八、终极总结:怎么玩转这套方案?

经过十余个项目的实战验证,我们提炼出黄金法则:

  1. 容量规划先行:备库至少保留主库80%性能
  2. 监控不能停:重点盯住replay_lagwal_sender状态
  3. 演练常态化:每季度至少做一次真实切换演练
  4. 版本管控:严格保持主备版本一致

未来可探索与Kubernetes的结合,实现故障转移的完全自动化。但无论如何演化,理解WAL工作机制和gs_ctl工具链仍然是运维人员的必修课。