問題描述
在運維Hbase集羣的時候,經常遇到RS進程宕掉的情況,連接zk客戶端的超時時間sessionTimeout設置爲180秒,查看FGC時間只有40s,爲什麼進程會被Kill?
其實只這麼設置根本沒有任何作用,因爲客戶端將sessionTimeout的值傳給zk時,zk還會根據minSessionTimeout與maxSessionTimeout兩個參數重新調整最後的超時值
Java代碼
- public int getMinSessionTimeout() {
- return minSessionTimeout == -1 ? tickTime * 2 : minSessionTimeout;
- }
- public int getMaxSessionTimeout() {
- return maxSessionTimeout == -1 ? tickTime * 20 : maxSessionTimeout;
- }
就是說這兩個值,默認分別爲tickTime 的2倍和20倍,而tickTime的默認值是3秒,即最後生效的超時時間,一定是6s<timeout<60s,原因如下:
Java代碼
- int minSessionTimeout = zk.getMinSessionTimeout();
- if (sessionTimeout < minSessionTimeout) {
- sessionTimeout = minSessionTimeout;
- }
- int maxSessionTimeout = zk.getMaxSessionTimeout();
- if (sessionTimeout > maxSessionTimeout) {
- sessionTimeout = maxSessionTimeout;
- }
就是這麼簡單,至於之前說40s超時,是因爲把tickTime設置成2s了,如果想設置爲180s超時,將tickTime設置成9s(9000)即可。