152.1。节点退役

您可以通过在特定节点上的 HBase 目录中运行以下脚本来停止单个 RegionServer:

$ ./bin/hbase-daemon.sh stop regionserver 

RegionServer 将首先关闭所有区域,然后自行关闭。关闭时,ZooKeeper 中 RegionServer 的临时节点将过期。主人会注意到 RegionServer 已经消失,并将其视为“崩溃”的服务器;它将重新分配 RegionServer 携带的节点。

在退役之前禁用负载均衡器

如果负载均衡器在节点关闭时运行,那么负载均衡器和主服务器恢复刚刚停用的 RegionServer 之间可能存在争用。首先禁用平衡器,避免任何问题。见下面的 lb

杀死节点

在 hbase-2.0 中,在 bin 目录中,我们添加了一个名为 ConsideAsDead.sh 的脚本,可用于杀死 regionserver。在 zookeeper 超时到期之前,专用监视工具可以检测到硬件问题。 _ 考虑 AsDead.sh_ 是一个将 RegionServer 标记为死的简单函数。它删除服务器的所有 znode,开始恢复过程。将脚本插入监视/故障检测工具以启动更快的故障转移。小心如何使用这种破坏性工具。如果需要在 hbase-2.0 之前的 hbase 版本中使用它,请复制脚本。

上述区域服务器停止的一个缺点是区域可能会在很长一段时间内脱机。地区按顺序关闭。如果服务器上有许多区域,则关闭的第一个区域可能不会重新联机,直到所有区域关闭并且在主站注意到 RegionServer 的 znode 消失之后。在 Apache HBase 0.90.2 中,我们添加了一个设备,让节点逐渐减少负载,然后关闭自己。 Apache HBase 0.90.2 添加了 _graceful stop.sh 脚本。这是它的用法:

$ ./bin/graceful_stop.sh
Usage: graceful_stop.sh [--config &conf-dir>] [--restart] [--reload] [--thrift] [--rest] &hostname>
 thrift      If we should stop/start thrift before/after the hbase stop/start
 rest        If we should stop/start rest before/after the hbase stop/start
 restart     If we should restart after graceful stop
 reload      Move offloaded regions back on to the stopped server
 debug       Move offloaded regions back on to the stopped server
 hostname    Hostname of server we are to stop 

要停用已加载的 RegionServer,请运行以下命令:$ ./bin/graceful_stop.sh HOSTNAME 其中HOSTNAME是承载您将停用的 RegionServer 的主机。

在'HOSTNAME 上

传递给 _graceful stop.shHOSTNAME必须与 hbase 用于识别 RegionServers 的主机名匹配。检查主 UI 中的 RegionServers 列表,了解 HBase 如何引用服务器。它通常是主机名,但也可以是 FQDN。无论 HBase 使用什么,这都应该通过 _graceful stop.sh 解除授权脚本。如果您传递 IP,则该脚本还不够智能,无法创建它的主机名(或 FQDN),因此在检查服务器当前是否正在运行时它将失败;优雅的地区卸货将无法运行。

_graceful stop.sh 脚本将一次一个地移出退役的 RegionServer 区域,以最大限度地减少区域流失。它将在移动下一个区域之前验证在新位置部署的区域,依此类推,直到退役的服务器携带零区域。此时,_graceful stop.sh 告诉 RegionServer stop。此时主服务器会注意到 RegionServer 已经消失但所有区域都已经重新部署,并且因为 RegionServer 干净利落,所以没有 WAL 日志可以拆分。

负载均衡器

假设在graceful_stop脚本运行时禁用了区域负载平衡器(否则平衡器和解除授权脚本将最终争夺区域部署)。使用 shell 禁用平衡器:

hbase(main):001:0> balance_switch false
true
0 row(s) in 0.3590 seconds 

这会关闭平衡器。要启用,请执行:

hbase(main):001:0> balance_switch true
false
0 row(s) in 0.3590 seconds 

graceful_stop将检查平衡器,如果启用,将在其开始工作前将其关闭。如果由于错误而提前退出,则不会重置平衡器。因此,除了graceful_stop在完成 w / graceful_stop 之后重新启用平衡器之外,最好还是管理平衡器。

152.1.1。同时停用多个 Regions 服务器

如果您有一个大型群集,则可能希望通过同时正常停止多个 RegionServers 来同时停用多台计算机。为了同时优雅地排空多个区域服务器,可以将 RegionServers 置于“排空”状态。这是通过在 _hbase root / draining znode 下的 ZooKeeper 中创建一个条目,将 RegionServer 标记为引出节点来完成的。这个 znode 的格式name,port,startcode就像 _hbase root / rs znode 下的 regionserver 条目一样。

没有这种设施,退出多个节点可能是非最佳的,因为从一个区域服务器排出的区域可能被移动到也正在耗尽的其他区域服务器。将 RegionServers 标记为处于排水状态会阻止这种情况发生。有关详细信息,请参阅博客文章

152.1.2。坏或失败的磁盘

如果在磁盘普通模具的情况下每台机器有相当数量的磁盘,那么设置 dfs.datanode.failed.volumes.tolerated 就可以了。但通常磁盘会执行“John Wayne” - 即在 dmesg 中花费一段时间来减少喷射错误 - 或者由于某种原因,运行速度比他们的同伴慢得多。在这种情况下,您希望停用磁盘。你有两个选择。您可以停用 datanode ,或者破坏性较小,因为只有坏磁盘数据会被重新复制,可以停止 datanode,卸载坏卷(在 datanode 使用它时你无法卸载卷) ,然后重新启动 datanode(假设您已设置 dfs.datanode.failed.volumes.tolerated> 0)。区域服务器会在其日志中抛出一些错误,因为它会重新校准从哪里获取数据 - 它也可能会滚动其 WAL 日志 - 但总的来说,但是对于某些延迟峰值,它应该继续保持正常运行。

短路读

如果您正在进行短路读取,则必须在停止 datanode 之前将区域移出 regionserver;当短路读取时,虽然 chmod'd 区域服务器无法访问,因为它已经打开文件,即使 datanode 已关闭,它也能够继续从坏磁盘读取文件块。重新启动 datanode 后,将区域移回。

152.2。滚动重启

某些群集配置更改需要重新启动整个群集或 RegionServers 才能获取更改。此外,支持滚动重新启动以升级到次要版本或维护版本,如果可能的话,还支持主要版本。请参阅要升级到的发行版的发行说明,以了解执行滚动升级的能力限制。

根据您的具体情况,有多种方法可以重新启动群集节点。这些方法详述如下。

152.2.1。使用rolling-restart.sh脚本

HBase 附带一个脚本 bin / rolling-restart.sh ,它允许您在整个集群,仅主服务器或 RegionServers 上执行滚动重新启动。该脚本作为您自己脚本的模板提供,未经过明确测试。它需要配置无密码的 SSH 登录,并假定您已使用 tarball 进行部署。该脚本要求您在运行之前设置一些环境变量。检查脚本并根据需要进行修改。

rolling-restart.sh 一般用法

$ ./bin/rolling-restart.sh --help
Usage: rolling-restart.sh [--config <hbase-confdir>] [--rs-only] [--master-only] [--graceful] [--maxthreads xx] 

仅在 RegionServers 上滚动重新启动

要仅在 RegionServers 上执行滚动重新启动,请使用--rs-only选项。如果您需要重新启动单个 RegionServer,或者进行仅影响 RegionServers 而不影响其他 HBase 进程的配置更改,则可能需要执行此操作。

仅在 Masters 上滚动重启

要在活动和备份主站上执行滚动重新启动,请使用--master-only选项。如果您知道配置更改仅影响主服务器而不影响 RegionServers,或者您需要重新启动运行主服务器的服务器,则可以使用此方法。

优雅的重启

如果指定--graceful选项,则使用 _bin / graceful stop.sh 脚本重新启动 RegionServers,该脚本会在重新启动 RegionServer 之前将区域移出 RegionServer。这样更安全,但可以延迟重启。

限制线程数

要将滚动重启限制为仅使用特定数量的线程,请使用--maxthreads选项。

152.2.2。手动滚动重启

要保留对流程的更多控制,您可能希望在群集中手动执行滚动重新启动。这使用graceful-stop.sh命令退役。在此方法中,您可以单独重新启动每个 RegionServer,然后将其旧区域移回原位,保留位置。如果还需要重新启动主服务器,则需要单独执行此操作,并在使用此方法重新启动 RegionServers 之前重新启动主服务器。以下是此类命令的示例。您可能需要根据您的环境进行定制。此脚本仅对 RegionServers 进行滚动重新启动。它在移动区域之前禁用负载平衡器。

$ for i in `cat conf/regionservers|sort`; do ./bin/graceful_stop.sh --restart --reload --debug $i; done &> /tmp/log.txt &; 

监视 /tmp/log.txt 文件的输出以跟踪脚本的进度。

152.2.3。制作自己的滚动重启脚本的逻辑

如果要创建自己的滚动重新启动脚本,请使用以下准则。

  1. 解压缩新版本,验证其配置,并使用rsyncscp或其他安全同步机制将其同步到群集的所有节点。

  2. 首先重启 master。如果新的 HBase 目录与旧的 HBase 目录不同,则可能需要修改这些命令,例如升级。

    $ ./bin/hbase-daemon.sh stop master; ./bin/hbase-daemon.sh start master 
    
  3. 从 Master 中使用以下脚本正常重新启动每个 RegionServer。

    $ for i in `cat conf/regionservers|sort`; do ./bin/graceful_stop.sh --restart --reload --debug $i; done &&gt; /tmp/log.txt & 
    

    如果您正在运行 Thrift 或 REST 服务器,请传递--thrift 或--rest 选项。对于其他可用选项,请运行bin/graceful-stop.sh --help命令。

    重启多个 RegionServers 时,重要的是要慢慢耗尽 HBase 区域。否则,多个区域同时脱机,必须重新分配给其他节点,这些节点也可能很快脱机。这可能会对性能产生负面影响。您可以在上面的脚本中注入延迟,例如,通过添加 Shell 命令,例如sleep。要在每次 RegionServer 重新启动之间等待 5 分钟,请将以上脚本修改为以下内容:

    $ for i in `cat conf/regionservers|sort`; do ./bin/graceful_stop.sh --restart --reload --debug $i & sleep 5m; done &&gt; /tmp/log.txt & 
    
  4. 再次重新启动 Master,清除死服务器列表并重新启用负载均衡器。

152.3。添加新节点

在 HBase 中添加一个新的 regionserver 基本上是免费的,你只需这样启动:$ ./bin/hbase-daemon.sh start regionserver它将自己注册到 master。理想情况下,您还在同一台计算机上启动了 DataNode,以便 RS 最终可以开始拥有本地文件。如果您依靠 ssh 来启动守护进程,请不要忘记在主服务器上的 conf / regionservers 中添加新主机名。

此时,区域服务器不提供数据,因为还没有区域移动到它。如果启用了平衡器,它将开始将区域移动到新 RS。在小型/中型群集上,这会对延迟产生非常不利的影响,因为许多区域将同时脱机。因此,建议在停用节点并手动移动区域时使用相同的方式禁用平衡器(或者更好,使用逐个移动它们的脚本)。

移动的区域都将具有 0%的位置,并且缓存中不会有任何块,因此区域服务器必须使用网络来处理请求。除了导致更高的延迟,它还可以使用您的所有网卡容量。出于实际目的,请考虑标准的 1GigE NIC 不能读取比 100MB / s 更多的内容。在这种情况下,或者如果您处于 OLAP 环境中并且需要具有位置,则建议主要压缩移动的区域。