pg_auto_failover异步复制
pg_auto_failover异步复制
异步复制的内容文档描述的不清晰,很多内容需要通过查看代码才能确定,便书写出来供大家参考。
同步复制 VS 异步复制
pg_auto_over默认采用同步模式,准确来讲是半同步模式,以达到数据安全和业务的连续性的综合需求,但是降低了数据库数据处理的性能。
异步复制通过降低数据的安全性来提高数据处理的性能,当主节点发生异常时可能会丢失最近的部分数据,在某些对数据一致性要求不高但对性能要求较高的场景中会应用到。
配置异步模式
pg_auto_failover的异步模式配置,仅需配置synchronous_commit = ‘local’到postgresql.conf中即可以。执行pg_ctl relaod $PGDATA使其生效
异步模式切换规则
默认情况
当备节点的数据落后主节点小于1个wal日志(默认16MB),主节点发送故障时,会进行自动切换。
当备节点的数据落后主节点大于1个wal日志(默认16MB),主节点发送故障时,不会进行自动故障切换,需要进行手工切换
切换规则配置
pgautofailover.promote_wal_log_threshold参数是控制是数据差异切换规则的。需在monitor节点进行设置。
将该参数设置到postgresql.conf中。执行pg_ctl reload $PGDATA 使其生效。
参数单位:字节
最大值:INT_MAX(2GB-1字节量数据)
数据延迟计算方法
- 广义的理解
延迟 = 主节点的lsn(pg_current_wal_lsn) – 备节点的lsn(pg_last_wal_receive_lsn)
此种方法不是太精准 -
主节点计算
select sync_state,pg_current_wal_lsn() - flush_lsn as wal_lag from pg_replication_slots slot join pg_stat_replication rep on rep.pid = slot.active_pid where slot_name = 'pgautofailover_standby';
主节点采用pg_current_wal_lsn – flush_lsn(已经发送至备的lsn)进行延迟的计算
- 备节点计算
SELECT latest_end_lsn - received_lsn FROM pg_stat_wal_receiver;
备节点采用latest_end_lsn(主节点每次发送wal日志的时候,主节点当前的pg_current_wal_lsn) – received_lsn(已经接收到的lsn)
延迟基准
通过上一章节,我们看到了两种计算方法。这两个数据通常会是不同的,那以哪个为准?
pg_auto_failover的node节点会定期像monitor报告wal日志的状态,monitor会以最近最近时间报告节点的延迟数据为准,来决定是否进行状态调整。
[CitusDB中国]站主,PostgreSQL粉丝,现从事Citus研发工作
愿Citus在中国发展的越来越好