Citus 總結:高可用
- Citus 的複製功能
前面有提到,Citus 支持兩種數據複製方案:
-
Citus 的 Shard Replication:通過將 DML 語句複製到多個 Worker 節點執行,實現對 shard 分片數據的複製,僅適用於 append-only 的負載;當某個 Worker 節點故障時,Coordinator 節點會自動將查詢請求轉發到其他副本節點以實現高可用;
-
PostgreSQL 的 Streaming Replication:通過將 Primary 節點的 WAL 記錄持續的複製到 Standby 節點,實現對 Primary 節點的完整複製,適用於負載較重的 OLTP 場景;
爲什麼會同時存在兩種方案呢?可以看看 Citus 複製功能的演進過程。
1.1 第一階段:客戶端複製 DML 語句到多個 Worker 節點
在早期的版本中,Citus 的主要應用場景是實時數據分析場景,用戶批量的導入數據,並通過 Citus 進行實時數據查詢分析,數據不需要修改,是完全 Append-only 的場景。
Append-Only 的場景,各分片數據只需要在完成導入後是一致的就行,爲了最大化導入性能,可以從客戶端直接並行導入。
這個階段,Citus 導入數據的流程如下:
-
客戶端通知 Coordinator 需要導入數據到某個表;
-
Coordinator 節點分配對應的 placement,並反饋連接信息給客戶端;
-
客戶端直接連接對應 Shard 及其副本,同時往多個副本寫入數據;
-
客戶端通知 Coordinator 更新元數據;
1.2 第二階段:Coordinator 複製 DML 語句到多個 Worker 節點
隨着使用 Citus 的人越來越多,對於提供數據更新能力的需求也越來越多。爲了提供數據更新能力,Citus 需要解決兩個主要的問題:
-
併發更新同一行記錄,如何處理?
-
某個 Shard 副本不可用,如何處理?
爲了解決引入數據更新能力的問題,Citus 將更新操作集中到了 Coordinator 節點,由集中的 Coordinator 節點處理併發衝突和故障處理。
此時,數據的多副本複製,改成了由 Coordinator 節點複製 DML 語句到多個 Worker 節點執行。
1.3 第三階段:推薦使用 Streaming Replication
隨着使用 Citus 的場景增加,例如多租戶的場景,Citus 引入了 Co-located 親和性共存能力,可以把相同租戶的數據親和性存儲在同一個 Worker 節點,方便支持 Join 查詢,Rollup、外鍵約束等特性。
此時,前面基於複製 Statment 的複製方案就會碰到問題,當某個 Shard 因爲短時故障被標記爲 invalid 時,應該如何處理處於同一個 Co-located 親和組的其他 Shard?
-
不同步修改其他 Shard 狀態,可能會引發違反外鍵約束的一致性問題;
-
同步修改其他 Shard 都爲 invalid 狀態,系統的可用性會嚴重下降;
這是一個兩難的問題,爲了安全起見,Citus 在 6.0 版本中把複製因子的默認值從 2 改爲了 1,就是因爲多租戶場景下可能會產生違反外鍵約束的問題。
現在,Citus 推薦的是使用 PostgreSQL 的 Streaming Replication,如下圖所示,Streaming Replication 是 primary-based replication,由主節點解決併發控制問題。
- 雲上 Citus 高可用備選方案
2.1 備選 1:Streaming Replication
如前面描述,Streaming Replication 是 PostgreSQL 的內置特性,通過將 WAL 記錄持續複製到 Standby 節點,建立 Hot Standby 備份節點。
2.2 備選 2:鏡像卷
在雲上,也可以使用雲提供商的鏡像卷能力,當 Primary 節點故障時,在對應備份卷的主機上拉起數據庫進程接管業務。
2.3 備選 3:從日誌恢復
如果對 RTO 業務恢復時間不太敏感,也可以採用將 WAL 日誌增量備份到對象存儲的方式,本方案的成本更低,故障後,拉起對應計算節點,從對象存儲恢復日誌並重放數據即可。
2.4 備選方案對比
2.5 Azure Hyperscale(Citus) 的高可用方案
Coordinator 節點和 Worker 節點都使用 Streaming Replication 方案將數據同步複製到位於另一個 AZ 的 Standby 節點,支持 AZ 級的容災。主要技術指標有:
-
故障檢測:每 30 秒檢測一次,連續 5 次檢測都異常則判斷爲故障,總計 150 秒;
-
故障倒換:最高 90 秒完成;
-
業務影響時間:檢測 + 倒換時間,總計 240 秒;
-
新建 Standby 節點時間:不超過 1 小時;
參考
https://www.citusdata.com/blog/2016/12/15/citus-replication-model-today-and-tomorrow/
https://github.com/citusdata/citus/issues/998
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/a_ctXHVwNtTQ0qG4cAaM8g