Region Merge是Range相鄰的兩個的Region合併的過程,我們把一個Region稱為Source Region,另外一個稱為Target Region,在Merge過程結束後,Target Region管理的Range會擴大到Source Region的部分,Source Region則被刪除。
在上一篇Region Split源碼解析的結尾,我們提到了與其相對的Region Merge的複雜性。
由於兩個Region屬於不一樣的Raft group,與Region Split,Raft Snapshot的相互做用,再加上網絡隔離帶來的影響,無疑有更大的複雜度。
本文接下來將會解開Region Merge的神祕面紗。
Merge的設計需求
我們但願Merge的設計可以滿足如下幾個需求:
不依靠PD在Merge期間不發起其餘的調度滿足正確性
不會因為網絡隔離或者宕機引發正確性問題
只要參與Merge的TiKV中Majority存活且能互相通訊,Merge能夠繼續或者回滾,不會被阻塞住(跟Raft保證可用性的要求一致)
不對Split/Conf Change加額外條件限制(出於效能考慮)
儘量減少搬遷數據的開銷
儘量減少Merge期間服務不可用的時間
接下來我們來看一下TiKV的Merge是怎麼一一滿足這些需求的。
Merge的觸發
與Split和Conf Change類似,PD擔任發起者。可是與Split不一樣的是,Merge的觸發徹底是由PD判斷的:
若是Region的大小大於max-merge-region-size(默認20MB)或者key數量大於max-merge-region-keys(默認200000)不會觸發Merge。
對於新Split的Region在一段時間內split-merge-interval(默認1h)不會觸發Merge。
確保Source Region與Target Region的全部Peer都存在,該資訊是通過Region Leader上報PD獲得。
還有一些其餘的觸發條件,這些屬於內部機制,超出了本文的範圍。
PD在決定某個Source Region須要Merge到相鄰的Target Region之後,之後會通過Conf Change把它們的Peer對齊到相同的TiKV上,再給該Region發送請求觸發Merge
文章來源於:
www.foreign-find.com
www.foreign-good.com
ide