AntDB 提供了 hot-standby 的能力,功能与 Oracle 11g 的active standby 类似。并且通过流复制的方式,大大地缩短了备份库与主库的事务间隔。
传统流复制分为同步和异步两种模式。同步复制,即主机的事务要等到备机提交成功后才会提交并结束事务,缺点是备机故障时,主机会一直宕机;异步复制,即指主机的事务完全不受备机的影响,缺点是主备机之间在高并发场景下数据会存在时延,无法做到实时强一致性。很多时候,数据安全、持续高可用和处理性能之间需要取得平衡。AntDB 在同步异步流复制基础上新增一种自适应流复制模式:采用同步模式时,当备机故障后,主备机之间自动切换成异步流复制模式不会造成主节点宕机。
AntDB 如何做到满足金融行业需要,达到 RTO 为 14 秒左右所做的系统设计,主要有如下几个方面。
1.流复制机制
AntDB 内核在流复制基础上实现了分布式跨平台内存级的流复制协议,以进行异构计算,通过流式事务处理机制可实现在高并发极限压力下主从节点间数据毫秒级同步延时,为业务的持续可用创造了底层有利条件,如图 3-10 所示。
流复制执行流程如下:
(1)启动主备机数据库服务。
(2)在备机上启动 startup 进程。
(3)备机启动 walreceiver 进程。
(4)walreceiver 进程向主节点发送连接请求,如果主节点没有运行,该进程会定期不断地尝试建立连接。
(5)主节点接收到连接请求后,启动 walsender 进程。walsender 进程和
walreceiver 进程建立物理连接。
(6)walreceiver 进程向主节点发送自己保存的最新 LSN 号。
(7)如果备节点的 LSN 号小于主节点的 LSN 号,walsender 进程向备机发送两个 LSN 之间产生变化的事务日志到备节点。备节点收到事务日志后开始进行回放(replay),直到追平主节点。
(8)后续主节点的变化会通过实时流的方式发送到备节点。一旦 commit
成功,postgres 进程会通知 walsender 进程从 walbuffers 中读取最新变化的数据发送到备节点。
除了支持流式数据复制之外,还支持多种数据同步模式,如同步、异步、半同步和多数派提交协议,且可以多种同步模式组合实现层层级联复制,满足远程和本地等多样的数据同步需求,如图 3-11 所示。
AntDB 内置了流复制的一些管理工具和系统视图,方便对流复制过程进行管理和监控,比如通过 pg_stat_replication 系统视图可以查看当前流复制的状态, 如图 3-12 所示。
2.自适应切换
在 AntDB 内核实现中,当同步 slave 节点出现异常后,主节点接收不到备机的确认消息会导致主节点无响应,一直不返回消息,造成客户端无法为业务继续提供写服务,不符合业务连续性保障的设计。参考 Oracle 最大保护、最大性能、最大可用之间的自适应切换设计,AntDB 也提供了类似的内核实现,解决了备节点异常后业务依然可持续,如图 3-13 所示。