天天看點

Cassandra 資料一緻性修複 repair 來龍去脈

Cassandra repair 流程

文章分3塊:1.為什麼需要repair?;2.repair大概流程?;3.repair可能的問題。

為什麼需要repair

cassandra 如何修複副本資料

我們知道Cassandra是一個強調最終一緻性的系統,副本間的資料并不能保證強一緻(但是從用戶端角度,通過QUORUM等級别讀寫還是可以保證用戶端視角的強一緻[1])。因為副本間資料是最終一緻,是以Cassandra通過hinted-handoff、read-repair、repair 進行副本間資料補齊;這三個方式各有優缺點:

  • hinted-handoff 用來補齊節點挂掉期間的資料,但是挂掉時間太久這個特性會失效且hint機制存在資料可靠性風險;
  • read-repair:隻有被讀到的不一緻資料才會被修複,那麼如果沒有被讀到的資料很多怎麼辦?
  • repair:全量的修複方案,保證做多個副本在某個時間點(觸發repair時刻)前的資料全量修複一緻。

從上述描述看出,repair是一個兜底修複副本資料的方案,那麼既然上面說了,通過quorum可以保證用戶端視角的強一緻,我們還需要通過repair來修複全量副本資料麼?答案是:必須要,而且官方也建議在一定周期(gc_grace_seconds)内必須要做一次[2],才能保證系統的正确性。

如果不做repair會怎麼樣?
Cassandra 資料一緻性修複 repair 來龍去脈

假設3個副本(A/B/C),quorum級别的讀寫删資料,時刻t1使用者最初以quorum級别成功寫入資料1,假設A/B/C都寫入成功;時刻t2使用者quorum級别删除1資料,假設這裡C副本删除失敗,但是客戶依舊顯示删除成功;時刻t3(這裡假設t3-t2 > gc_grace_seconds,且使用者沒有做repair 且期間)。那麼A/B副本會compaction把1資料合并删除掉,但是c副本沒有删除mark。

最終結果一條被使用者認為删除成功的key ,”死灰複燃“的讀到了。

是以:repair必須要做。

repair大概流程

Cassandra 資料一緻性修複 repair 來龍去脈

全量資料repair需要人為手工通過節點nodetool送出外圍任務,具體的nodetool 指令行參數 可以下次介紹,這裡大概分享下一輪repair在副本節點之間進行的流程。假設開始做A 節點負責的資料,對應副本涉及B/C節點,那麼一次執行的修複鍊路是:

  • 計算A/B/C三個相關副本資料的全量merkle-tree[3],這是一個二分hash樹;從底往上計算hash、葉子節點是小range範圍的資料的sha2 hash值,内部節點是其左右子節點的hash值(xor);
  • 通過兩兩對比merkle-tree,可以知道具體節點間不一緻的資料範圍;
  • 兩兩走内部stream 拖資料流程補齊相關資料。

repair可能的問題

  • 運維複雜:
    • 節點資料量如果較大,整個執行過程可能會耗時很久,時間越久出現問題的可能性就越大;
    • 為了避免repair對叢集影響較大,repair需要針對節點差異化執行,那麼對運維複雜性會帶來挑戰;
    • 需要表級别gc_grace_seconds 内做一次,如果表過多,會造成運維差異化難度較大;
  • 資源消耗較大:
    • 一般cassandra被用于線上服務場景,但是做repair會帶來瞬時資源較大開銷:cpu、io、網絡,影響服務穩定性;

現在社群解決方案有:incremental repair、schedule repair等方案[4],此外datastax公司也有nodesync[5],scylladb 公司有row-level repair。對應我們也有相關的定制功能。目的是降低運維複雜度,降低repair時候對線上服務的影響。

入群邀約

為了營造一個開放的 Cassandra 技術交流環境,社群建立了微信群公衆号和釘釘群,為廣大使用者提供專業的技術分享及問答,定期開展專家技術直播,歡迎大家加入。

另外阿裡雲提供商業化Cassandra使用,中國站和國際站都支援:

https://www.aliyun.com/product/cds
Cassandra 資料一緻性修複 repair 來龍去脈

引用:

[1]

https://www.allthingsdistributed.com/2008/12/eventually_consistent.html

[2]

https://cassandra.apache.org/doc/latest/operating/repair.html

[3]

https://en.wikipedia.org/wiki/Merkle_tree

[4]

https://issues.apache.org/jira/browse/CASSANDRA-14346

[5]

https://docs.datastax.com/en/dse/6.0/dse-dev/datastax_enterprise/config/aboutNodesync.html

[6]

https://docs.scylladb.com/operating-scylla/procedures/maintenance/repair/