遷移的三個階段
在多機房數據遷移中,整個過程分為三個階段:歷史數據遷移階段、redolog遷移階段、實時複製階段。
1 歷史數據遷移
歷史數據的遷移使用一個隊列完成,這個隊列由多個線程消費。遷移模塊保存一個本dataserver的主桶有序序列,存儲引擎順序按桶掃描所有數據(對ldb引擎來講,是掃描memtable、immutable memtable和所有的SSTable),並將掃描到的數據放到隊列裡。主線程會同步等待每個桶的數據同步完成,然後在從機房上打上標籤,每次同步前都會判斷這個標籤,避免重啟後歷史數據重遷。
2 redolog遷移
由於在歷史數據同步時,client又會有新的寫入,新寫入的key可能已經被掃描過,所以如果不記錄這些操作,這部分數據可能會被丟失。
對歷史數據遷移來講,桶有三種狀態:已遷移、正在遷移、未遷移 。
redolog只記錄“正在遷移”的桶的新寫入請求。對於已遷移的桶的新寫入請求,把它放到實時遷移隊列,對於未遷移的桶的新寫入請求,不做特殊處理,因為等到遷移這些桶時,數據已經落到ldb上。
image.png
當一個桶的ldb數據遷移完成時,立即開始遷移新產生的log。遷移log時,也可能會有新的寫入,當剩餘log很大時,新的寫入會追加到log;當剩餘log小於一定閾值後,會鎖定log,新的寫入會被阻塞,直到log遷移完畢後,再將被阻塞的請求放到實時複製隊列裡。
redolog的遷移使用多個隊列,根據請求key的hash值放到不同的隊列裡,每個隊列只有一個消費線程,這樣來保證相同key的時序性。
3 實時複製
實時複製也使用多個隊列,根據請求key的hash值放到不同的隊列裡,每個隊列只有一個消費線程,來保證相同key的時序性。
如上所述,當一個桶的歷史數據、redolog遷移完畢後,新的請求就會放到實時隊列裡。
個人介紹:
高廣超:多年一線互聯網研發與架構設計經驗,擅長設計與落地高可用、高性能互聯網架構。
本文首發在 高廣超的簡書博客 轉載請註明!
閱讀更多 互聯網技術棧 的文章