HMaster的failover 流程 三

2021-09-01 08:33:17 字數 2798 閱讀 1171

繼續hmaster的failover 流程

哪兒了。首先來看如何重現。

1. master 傳送rpc請求去open region,此時zk上的節點時offline狀態。

2. rs收到請求還沒有開始處理,即zk節點仍然是offline。

3. master重啟

4. master開始failover 流程,rs繼續處理open region動作

關鍵就在第四步:

如果rs已經將region open了。

1). master先收到zk node changed時間。然後再處理failover流程

1.1 收到zk事件,檢視rit佇列該region為null,則不做任何處理。然後failover處理的時候會將該region 重新assign。如果assign的是同乙個regionserver,那麼會立刻返回,且rs此次open動作結束。即region只在該rs上分配了一次,但是master的記憶體中並沒有更新master中regions存放的資訊是不準確的,影響balance;另外region依舊在rit中,超時以後依舊會繼續分配到另外乙個region中,造成二次分配。

1.2 assign到不同rs,則顯然會二次分配。

2).master先處理failover流程,再處理zk事件。

2.1 failover中會assign 該region,rit為pendingopen,zk節點時offline。此時rs也在openregion 並更新zk節點,如果在此過程中有衝突的話會導致rs 或是master abort掉。

2.2 master的assign如果到不同rs上的話也會導致二次分配。

2.3 如果是同乙個rs的話assign 動作結束。

2.3.1 master處理zk事件,如果此時getdata是opened的話,那麼在rit中是pendingopen,符合預期,更新master記憶體這個邏輯是正確的。

2.3.2但是master getdata的資料可能已經是被修改的資料,即雖然觸發的是opened事件,但是在master 的nodedatachanged函式中去getdata得到的資料並不一定是opened,如有可能是offline(assign 動作更新的)這就導致master的記憶體又不正確,rit也沒有清空,又會二次分配。

上面所說的先處理failover還是先處理zk事件,是因為對這兩個操作都是需要對rit佇列上鎖的,是序列的。可以看到如果zk上狀態是offline時master failover會有很大可能導致集群狀態不一致,或是二次分配。

90中修正這個比較難。因為涉及到rpc通訊協議的修改。

94中如何修改呢?

將要region將要在何處open的rs資料寫入到zk中,即在zk上記錄該region將要在那個regionserver上開啟。

zk上的servername是master。這種只有當failover時有deadserver時,master會建立該region節點才會出現,即rpc請求肯定沒有傳送

zk上的servername是regionserver。且該server online,那麼將assign該region的動作重寫,不需要建立或是更新zk上面的節點。

如果region已經在rs上面分配成功了,rpc會返回alreadyopen然後會更新master記憶體。

如果region還在分配,rpc返回不做處理。當master收到rs 成功open region以後會更新

記憶體。針對上面的幾個問題

1.1 收到zk事件,檢視rit佇列該region為null,則不做任何處理。然後failover處理的時候會將該region 重新assign如果assign的是同乙個regionserver,那麼會立刻返回,且rs此次open動作結束。即region只在該rs上分配了一次,但是master的記憶體中並沒有更新master中regions存放的資訊是不準確的,影響balance;另外region依舊在rit中,超時以後依舊會繼續分配到另外乙個region中,造成二次分配。

答:收到zk時間發現rit佇列是null,此時94會有乙個判斷,如果是正在failover那麼會更新master記憶體。並將region加入乙個佇列,當failover開始執行的時候,發現該region已經被處理了,則該region的failover就不會再處理了。

1.2 master的assign如果到不同rs上的話也會導致二次分配。

答:master assign現在只會分配到同一臺rs上。

2.1 failover中會assign 該region,rit為pendingopen,zk節點時offline。此時rs也在openregion 並更新zk節點,如果在此過程中有衝突的話會導致rs 或是master abort掉。

答:修改了region failover assign的邏輯,當分配到同一臺region的話,是不會去更新或是建立zk節點的,因此也就不會有衝突。如果是zk上的servername是master的話,那麼該region的rpc尚未發出,建立節點就不會衝突

2.2 master的assign如果到不同rs上的話也會導致二次分配。

答:只會分配到同一臺rs。

2.3 如果是同乙個rs的話assign 動作結束。master處理zk事件,如果此時getdata是opened的話,那麼在rit中是pendingopen,符合預期,更新master 記憶體這個邏輯是正確的。但是master getdata的資料可能已經是被修改的資料,即雖然觸發的是opened事件,但是在master 的nodedatachanged函式中去getdata得到的資料並不一定是opened,如有可能是offline(assign 動作更新的)這就導致master的記憶體又不正確,rit也沒有清空,又會二次分配

答:更新zk節點只有乙個執行緒在操作不會存在兩個執行緒了,因此不存在getdata的資料與觸發的事件不一致的結果。

Hmaster 啟動講解

ps 發現想寫明白確實不太容易 以下會慢慢完善 hmaster啟動會先執行hmaster 建構函式,看看它都做了什麼 初始化conf rpcserver isa inetaddressserver servername zookeep rpcserver start metrics 如果應用secu...

DG之物理Standby的failover

1.檢查歸檔檔案是否連續 orclpre orclpre std startup oracle instance started.total system global area 167772160 bytes fixed size 1218316 bytes variable size 75499...

hbase啟動HMaster問題

關於啟動hbase的時候可能會出現下面的問題,我自己總結了一些解決辦法,最重要還是看日誌然後去分析,先宣告我的環境是沒有配置hadoopha。問題 cant t get master address from zookeeper znode data null 圖上的問題估計也有挺多發生,然後我看了...