歡迎關注本人公衆號
概述
在我們修改了regionserver的配置後,需要對某個或所有的regionserver進行重啓。
或者在集羣升級到新的版本時進行滾動升級。
以上都需要儘可能的不影響業務,集羣保持存活可用。
對於hbase regionserver重啓,不要直接kill
進程,這樣會造成在zookeeper.session.timeout
這個時間長的中斷,也不要通過 bin/hbase-daemon.sh stop regionserver
去重啓,如果運氣不太好,-ROOT-或者.META.
表在上面的話,所有的請求會全部失敗。
當然最簡單的方法是停止整個集羣,修改完後再重啓,但是顯然不適用。下面看看如何使用rolling-restart
和graceful_stop
來實現集羣優雅滾動重啓。
Rolling Restart
先看看rolling-restart.sh的參數:
[root@node1 bin]# ./rolling-restart.sh --help
Usage: rolling-restart.sh [--config <hbase-confdir>] [--autostart-window-size <window size in hours>] [--autostart-window-retry-limit <retry count limit for autostart>] [--autostart] [--rs-only] [--master-only] [--graceful] [--maxthreads xx] [--noack] [--movetimeout]]
我們僅對master進行重啓:
[root@node1 bin]# ./rolling-restart.sh --master-only
running master, logging to /data/program/hbase-2.1.5/bin/../logs/hbase-root-master-node1.out
stopping master.
node2: running master, logging to /data/program/hbase-2.1.5/bin/../logs/hbase-root-master-node2.out
node2: stopping master.
Waiting for Master ZNode /hbase/master to expire
Node does not exist: /hbase/master
running master, logging to /data/program/hbase-2.1.5/bin/../logs/hbase-root-master-node1.out
node2: running master, logging to /data/program/hbase-2.1.5/bin/../logs/hbase-root-master-node2.out
Wait a minute for master to come up join cluster
Znode /hbase/region-in-transition does not exist
主備HMaster都會重啓。期間會有短暫時間集羣不可用。
我們僅對rs進行重啓:
[root@node1 bin]# ./rolling-restart.sh --rs-only
node3: running regionserver, logging to /data/program/hbase-2.1.5/bin/../logs/hbase-root-regionserver-node3.out
node3: running regionserver, logging to /data/program/hbase-2.1.5/bin/../logs/hbase-root-regionserver-node3.out
node3: stopping regionserver..
node3: running regionserver, logging to /data/program/hbase-2.1.5/bin/../logs/hbase-root-regionserver-node3.out
node4: running regionserver, logging to /data/program/hbase-2.1.5/bin/../logs/hbase-root-regionserver-node4.out
node4: running regionserver, logging to /data/program/hbase-2.1.5/bin/../logs/hbase-root-regionserver-node4.out
node4: stopping regionserver...
node4: running regionserver, logging to /data/program/hbase-2.1.5/bin/../logs/hbase-root-regionserver-node4.out
上面這種方式我測試的結果是必須在重啓一次master纔行,而且會影響HBASE集羣使用,比較尷尬。
如果指定–graceful選項,則使用bin / graceful_stop.sh腳本重新啓動RegionServer,該腳本會將區域移出RegionServer,然後再重新啓動。 這樣比較安全,但是會延遲重新啓動。
要將滾動重啓限制爲僅使用特定數量的線程,請使用–maxthreads選項。
手動滾動重啓(推薦)
手動滾動重啓的原理就是使用graceful_stop
命令逐個重啓regionserver,該命令會首先將region移動到其他regionserver上,重啓完後再將region移動回來,比較平滑。
- 重啓master
./bin/hbase-daemon.sh stop master
./bin/hbase-daemon.sh start master
- 使用graceful-stop.sh命令逐個對regionserver進行重啓。編寫shell腳本,重啓所有regionserver:
#!/usr/bin/env bash
for i in `cat ../conf/regionservers|sort`
do
echo $i
./graceful_stop.sh --restart --reload $i
done
上述腳本會將regionservers中配置的RS服務逐個重啓,並恢復。hbase擴容 縮容 一文中也有介紹graceful_stop
- 限速
重新啓動多個RegionServer時,限制速度很重要。緩慢重啓regionserver,緩慢遷移region。
否則由於速度過快,可能會對生產hbase集羣造成嚴重影響。
我們這裏通過在RegionServer重新啓動之間等待5分鐘來解決上述問題,添加sleep 5m
來實現:
#!/usr/bin/env bash
for i in `cat ../conf/regionservers|sort`
do
echo $i
./graceful_stop.sh --restart --reload $i & sleep 5m
done
- 再次重新啓動主服務器,以清除失效的服務器列表並重新啓用負載均衡器。