Hbase RegionServerGroup配置重启后失效问题排查

Posted 疯狂哈丘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hbase RegionServerGroup配置重启后失效问题排查相关的知识,希望对你有一定的参考价值。

文章目录


使用Hbase 版本:2.1.1

一、问题描述

RegionServer group是2.x后引入的隔离机制,可以用于业务的隔离。我们通过hbase shell的相关命令配置完group后,group信息如下:

后面滚动重启所有RegionServer,发现原先配置到gid_group_test的两台RS跑到default组了,同时gid_group_test组出现了两台Dead server:

通过hbase shell的list_rsgroups发现:

同时gid_group_test组的yjbtest表状态变为RIT,无法正常提供服务:

二、问题定位

查看HMaster日志,发现有相关日志输出,原先default组应该只有3台RegionServer,却变成发现了5台:

找到代码对应的行为是在org.apache.hadoop.hbase.rsgroup.RSGroupInfoManagerImpl$ServerEventsListenerThread.run类中,后面一路跟代码和不断复现,发现这是一段更新default组的RegionServer的代码,更新逻辑大概如下:

// Called by ServerEventsListenerThread. Presume it has lock on this manager when it runs.
private SortedSet<Address> getDefaultServers() throws IOException 
  SortedSet<Address> defaultServers = Sets.newTreeSet();
  for (ServerName serverName : getOnlineRS()) 
    Address server =
        Address.fromParts(serverName.getHostname(), serverName.getPort());
    boolean found = false;
    for(RSGroupInfo rsgi: listRSGroups()) 
      if(!RSGroupInfo.DEFAULT_GROUP.equals(rsgi.getName()) &&
         //对比Address,RSGI里面存的Address都是小写的,如果这里取出来的server的address.host是大写,就会误判为不在这个组中
          rsgi.containsServer(server)) 
        found = true;
        break;
      
    
    if (!found) 
      defaultServers.add(server);
    
  
  return defaultServers;

1、获取现有的所有RegionServer(从ServerManager实例的onlineServers变量中)

2、遍历这些RegionServer,然后判断这些RegionServer是否在其他组的RS列表表,不在的则就是default组的RS了

问题就在于RegionServer在重启后,原先应该是gid_group_test的RS被判断不在gid_group_test组中,因此被分到了default组(根因是因为hostname大小写的原因,因此导致误判)

先看一下onlineServers,它是一个ConcurrentNavigableMap<ServerName, ServerMetrics>,其中ServerName有两个关键字段:

//ServerName.java
private final String servername;
private transient Address address;
 
 
//Address.java
private HostAndPort hostAndPort;
 
 
//HostAndPort.java
private final String host;
private final int port;

后面我们使用arthas查看了onlineServers的相关数据,发现serverName字段有经过处理,全是小写字段,但是Address中的host却有时是小写有时是大写。当address的host是大写时,因为RS Group中存的host都是小写,因此会导致误判,认为此Regionserver不属于该Rs group,因此将其分到default组。

后面发现这种问题可以通过重启HMaster恢复,当重启HMaster后,RS的配置就会恢复成正常。结合代码应该是以下情况:

1、HMaster重启后,RegionServer的相关信息从zk加载,zk存储的hostname都是小写的,应该构造的ServerName的Address#host字段也是小写,此时RS group是正常的

2、RegionServer 重启后,RegionServer 上报的ServerName相关信息,是根据本机的hostname来决定的(有些机器是全小写,有些机器大小写混杂),因此这时上报到HMaster后构造的ServerName的Address#host字段就可能变成大写,导致RS group问题

三、解决方案

Hmaster的Regionserver的抽象是ServerName,因此可以在构造ServerName实例时,将所有的host都转成小写存储。因此修改ServerName的相关构造函数即可

四、网上相关patch

由于ServerName在大小写敏感的处理不一致还会引发许多问题,可以详见:
https://issues.apache.org/jira/browse/HBASE-24395

https://issues.apache.org/jira/browse/HBASE-13995

以上是关于Hbase RegionServerGroup配置重启后失效问题排查的主要内容,如果未能解决你的问题,请参考以下文章

Hbase数据结构和shell操作

CDH6.3.1 hue 配置hbase

HUE配置HBase

Hbase记录-Hbase配置项

HBase配置(伪分布式模式)

HBase安装配置