Tair數據遷移三步走

遷移的三個階段

在多機房數據遷移中,整個過程分為三個階段:歷史數據遷移階段、redolog遷移階段、實時複製階段。

1 歷史數據遷移

歷史數據的遷移使用一個隊列完成,這個隊列由多個線程消費。遷移模塊保存一個本dataserver的主桶有序序列,存儲引擎順序按桶掃描所有數據(對ldb引擎來講,是掃描memtable、immutable memtable和所有的SSTable),並將掃描到的數據放到隊列裡。主線程會同步等待每個桶的數據同步完成,然後在從機房上打上標籤,每次同步前都會判斷這個標籤,避免重啟後歷史數據重遷。

2 redolog遷移

由於在歷史數據同步時,client又會有新的寫入,新寫入的key可能已經被掃描過,所以如果不記錄這些操作,這部分數據可能會被丟失。

對歷史數據遷移來講,桶有三種狀態:已遷移、正在遷移、未遷移 。

redolog只記錄“正在遷移”的桶的新寫入請求。對於已遷移的桶的新寫入請求,把它放到實時遷移隊列,對於未遷移的桶的新寫入請求,不做特殊處理,因為等到遷移這些桶時,數據已經落到ldb上。

Tair數據遷移三步走

image.png

當一個桶的ldb數據遷移完成時,立即開始遷移新產生的log。遷移log時,也可能會有新的寫入,當剩餘log很大時,新的寫入會追加到log;當剩餘log小於一定閾值後,會鎖定log,新的寫入會被阻塞,直到log遷移完畢後,再將被阻塞的請求放到實時複製隊列裡。

redolog的遷移使用多個隊列,根據請求key的hash值放到不同的隊列裡,每個隊列只有一個消費線程,這樣來保證相同key的時序性。

3 實時複製

實時複製也使用多個隊列,根據請求key的hash值放到不同的隊列裡,每個隊列只有一個消費線程,來保證相同key的時序性。

如上所述,當一個桶的歷史數據、redolog遷移完畢後,新的請求就會放到實時隊列裡。


個人介紹:

高廣超:多年一線互聯網研發與架構設計經驗,擅長設計與落地高可用、高性能互聯網架構。

本文首發在 高廣超的簡書博客 轉載請註明!


分享到:


相關文章: