1. Citus的复制功能
Citus的Shard Replication:通过将DML语句复制到多个Worker节点执行,实现对shard分片数据的复制,仅适用于append-only的负载;当某个Worker节点故障时,Coordinator节点会自动将查询请求转发到其他副本节点以实现高可用; PostgreSQL的Streaming Replication:通过将Primary节点的WAL记录持续的复制到Standby节点,实现对Primary节点的完整复制,适用于负载较重的OLTP场景;
1.1 阶段:客户端复制DML语句到多个Worker节点
客户端通知Coordinator需要导入数据到某个表; Coordinator节点分配对应的placement,并反馈连接信息给客户端; 客户端直接连接对应Shard及其副本,同时往多个副本写入数据; 客户端通知Coordinator更新元数据;
1.2 第二阶段:Coordinator复制DML语句到多个Worker节点
并发更新同一行记录,如何处理? 某个Shard副本不可用,如何处理?
1.3 第三阶段:推荐使用Streaming Replication
不同步修改其他Shard状态,可能会引发违反外键约束的一致性问题; 同步修改其他Shard都为invalid状态,系统的可用性会严重下降;
2. 云上Citus高可用备选方案
2.1 备选1:Streaming Replication
2.2 备选2:镜像卷
2.3 备选3:从日志恢复
2.4 备选方案对比
故障检测:每30秒检测一次,连续5次检测都异常则判断为故障,总计150秒; 故障倒换:高90秒完成; 业务影响时间:检测 + 倒换时间,总计240秒; 新建Standby节点时间:不超过1小时;