HBase 如何減少升級時重啓rs節點造成的影響

最近被問到這個問題,一時沒有很好的回答,事後仔細思考了下,整理如下。

rs節點重啓對於應用的影響可分爲如下2個階段:

  1. region不可用
  2. region讀取慢

不可用的優化

從rs停止到各個region重新上線前都處於不可用階段,其中包含了master感知到有rs退出,進而調度執行scp的過程,詳細的過程可以參考我的另外一篇文章《HBase2.0 regionServer退出處理流程》,尤其是末尾鏈接中的詳細流程圖;

而不可用階段最爲耗時的部分應該是scp的執行階段,其核心部分僞代碼如下:

if(carryingMeta)
{
    split meta log;
    assign meta region;
    wait meta loaded;
}

split log;
assign reigons;

因此減少不可用的時間主要就是簡化上述過程,可用的手段有如下3個:

  1. 重啓rs前先執行flush,從而減少split log以及後續replay log所需的時間;
  2. 重啓rs前先把region move到其它節點去,這個方法需要獲取region信息並且要自己指定目標節點,稍微麻煩一些,但是效果更徹底,因爲完全不受scp執行時間影響,不可用時間縮減到1個ap的時間;
  3. 還有就是利用region replica特性,在主region不可用階段,也能夠利用副本提供讀服務,這個方法的缺點,1是副本要消耗額外的io和內存資源,2是寫請求依然不可用;

讀取慢的優化

讀取慢的原因,1是在新的rs上region的locality很可能會降低,2是blockcache是空的;

locality的問題,正常情況下在rs重啓完成後,balancer會基於locality的考慮將region遷移回原rs,但由於balance的過程還受其它因素影響,所以也並不必然,因此還是主動move更好一些;

如果已將自動balance關閉, 那主動move回原節點就是自然而然的了;

blockcache的問題,可以考慮在rs停止前將其保存在本地磁盤上,重新啓動時進行加載,印象中之前看過一篇分享文章中提到過這個優化;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章