`
punishzhou
  • 浏览: 142681 次
社区版块
存档分类
最新评论

HBase的RS关闭过程和Region重分配(一)

阅读更多

Hbase的一个很大的优点就是可扩展性比较强,可以线性扩展,加机器就行,而且机器的配置也不需要太好,就是用大量廉价的机器来替代昂贵的小型机,但是由于大量的相对廉价的机器,由于网络硬盘等各种各样的原因,机器不可避免的会挂掉,那么HBase在面对这种问题时如何处理呢?

 

首先来看HBase的RS在哪几种情况下会down掉:

1. 集群关闭;

2. stop regionserver 关闭当前RS,当然也可启动当前RS

3. 线程kill掉,包括kill + 线程号 and kill -9 + 线程号

4. RS在运行过程中产生自身难以解决的problem,此时它会自己abort自己。

 

而按照HBase对这几种down掉的处理情况又可以吧上述分为3类:

 

第一种是kill -9 类型的此时rs直接退出,直接中断任何运行中的线程,从日志中我们也可以发现没有任何日志记录

 

第二种是abortRequested类型的,这种是由于RS运行期间出错导致RS自己abort自己,这个过程会做很多收尾工作,关闭线程,关闭storefile的reader对象,关闭hlog等等

 

第三种就是stop类型的,包括kill 线程和stop regionserver和集群关闭,与第二种比较相似,而且会把此时内存的数据刷新到磁盘以后,并把hlog移到.oldlogs

 

在0.90版本上,第三种的关闭存在一个bug会造成数据丢失。

 

我们来看看第三中是如何处理的:

 this.leases.closeAfterLeasesExpire();//释放所有的Lease后,关闭Leases线程
    this.server.stop();//close socket和handler
    if (this.splitLogWorker != null) {
      splitLogWorker.stop();//close splitlog 线程
    }
    if (this.infoServer != null) {
      LOG.info("Stopping infoServer");
      try {
        this.infoServer.stop();//close http端的接口,主要是REST应用
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    // Send cache a shutdown.
    LruBlockCache c = (LruBlockCache) StoreFile.getBlockCache(this.conf);
    if (c != null) {
      c.shutdown();// close 每5分钟一次的blockcache信息
    }

    // Send interrupts to wake up threads if sleeping so they notice shutdown.
    // TODO: Should we check they are alive? If OOME could have exited already
    if (this.cacheFlusher != null) this.cacheFlusher.interruptIfNecessary();//关闭memstoreflusher线程,默认是超过64M会刷一次磁盘
    if (this.compactSplitThread != null) this.compactSplitThread.interruptIfNecessary();//关闭split与compact线程
    if (this.hlogRoller != null) this.hlogRoller.interruptIfNecessary();//close hlogRoller,每24小时清理一次
    if (this.majorCompactionChecker != null) this.majorCompactionChecker.interrupt();//close majoreCompactorChecker,默认24小时做一次major compact

    if (this.killed) {//kill - 9
      // Just skip out w/o closing regions.
    } else if (abortRequested) {RS自己abort
      if (this.fsOk) {
        closeAllRegions(abortRequested); // Don't leave any open file handles
        closeWAL(false);
      }
      LOG.info("aborting server at: " + this.serverInfo.getServerName());
    } else {//stop
      closeAllRegions(abortRequested);
      closeWAL(true);
      closeAllScanners();
      LOG.info("stopping server at: " + this.serverInfo.getServerName());
    }
    // Interrupt catalog tracker here in case any regions being opened out in
    // handlers are stuck waiting on meta or root.
    if (this.catalogTracker != null) this.catalogTracker.stop();
    if (this.fsOk) waitOnAllRegionsToClose();

    // Make sure the proxy is down.
    if (this.hbaseMaster != null) {
      HBaseRPC.stopProxy(this.hbaseMaster);
      this.hbaseMaster = null;
    }
    this.leases.close();
    HConnectionManager.deleteConnection(conf, true);
    this.zooKeeper.close();
    if (!killed) {
      join();
    }
    LOG.info(Thread.currentThread().getName() + " exiting");

 

在stop reginserver的过程当中会

else {//stop
      closeAllRegions(abortRequested);
      closeWAL(true);
      closeAllScanners();
      LOG.info("stopping server at: " + this.serverInfo.getServerName());
    }

 首先关闭所有的Region,这里的关闭Region是启动新的线程去关闭Region,正常好像是3个?,若存在meta或是root则分别另启一个线程处理。

然后closeWAL,close Hlog的writer,并把.logs移动到.oldlogs目录下,然后删除.logs的目录

最后关闭所有的scanners,防止下一次打开的时候出错

 

在上述过程中,由于close region是另起线程进行处理的,那么就有可能存在这样的情况,region还未关闭结束如正在flush,而此时closeWal已经结束并且把logs目录删除了,这就可能会造成data loss ,应为在flush的时候比如kill -9了那此时memstore的数据丢失了,而logs也没有数据 ,故无法恢复从而造成data loss

 

解决方案是 等到所有的region close 以后再做close Wal操作

 

 

RS在启动的时候会在ZK下的RS目录注册自己的节点,而master会监听到这个节点,当RS挂掉以后,ZK上的该节点delete掉,而Master会捕捉到这个事件调用nodedeleted来处理

 

 下一篇介绍一下master观察到zk上rs节点delete以后的操作

 

 

分享到:
评论

相关推荐

    HBASERegion数量增多问题描述及解决方案.docx

    HBase的表由一个或多个Region组成,Region是表数据的逻辑分区。新表创建时,默认只有一个Region,随着数据增加,Region会自动Split,以保持数据的分散存储。关注Region数量的主要原因是避免对集群稳定性和性能产生...

    hbase负载均衡算法分析

    HBase 负载均衡算法的实现主要是通过 Region 的分配和负载均衡来实现的。 Region 的初始分配策略是 Master 负责对 Region 的分配,而集群负载均衡算法主要是集中在文件 LoadBalancer.java 文件中,方法 ...

    hbase用于查询客户端工具

    6. **HBase Console**:这是HBase提供的一个简单的Web界面,用于查看表的信息、region分布和集群状态。它不支持复杂的查询,但对于快速检查和监控HBase实例非常有用。 7. **HBase MapReduce**:MapReduce是Hadoop...

    HBase架构简介.pdf

    HBase的主节点(HMaster)负责region的分配和负载均衡。当HBase启动时,HMaster会将`.ROOT.`和`.META.`表的region分配给HRegionServer(RS)。每个RS管理多个region,并为每个region创建一个HRegion对象。每个...

    hbase性能调优.pdf

    然而,HBase的性能调优是一件非常复杂和挑战性的任务,这需要深入了解HBase的架构和机理,以及相关的配置项和调优策略。 在HBase中, Zookeeper 是一个核心组件,负责维护集群的状态和配置信息。Zookeeper 的 ...

    HBase运维实践-聊聊RIT的那点事

    3. RegionServer收到命令后,执行关闭Region的操作,同时在Zookeeper的/hbase/region-in-transition节点下创建一个子节点,表示Region正在关闭;4. RegionServer完成关闭操作后,向Zookeeper发送RS_ZK_REGION_...

    HBase优化-系统架构

    HBase作为一个分布式、列族式的NoSQL数据库,性能优化至关重要,尤其是对于大数据处理场景。 首先,关注到配置优化中的`zookeeper.session.timeout`,这是RegionServer与Zookeeper之间的会话超时时间。默认设置为3...

    Hadoop之Hbase从入门到精通.docx

    HBase性能调优是一个非常复杂的过程,需要根据实际应用场景进行调整。通过调整RegionServer与Zookeeper的连接超时时间、RegionServer的请求处理IO线程数、Region的最大存储空间等参数,可以提高HBase的性能和稳定性...

    HBase性能调优

    总的来说,HBase的性能调优涉及到多个层面,包括Zookeeper的稳定性、RegionServer的并发处理能力和Region的大小管理。每项参数的调整都需要根据实际应用的负载、资源限制和业务需求来进行,通过持续监控和压力测试,...

    hbase性能调优[借鉴].pdf

    当RegionServer与Zookeeper间的连接超时,RegionServer会被从RS集群中移除,引发HMaster进行region的重新分配。调优时需谨慎,降低超时时间可以缩短RegionServer故障后的failover时间,但也可能因过于敏感的超时设置...

    2013中国大数据技术大会PPT——360超大规模HBASE集群的改进

    在2013年的大数据技术大会上,奇虎360的技术经理赵健博发表了题为《360超大规模HBASE集群的改进》的演讲,详细介绍了当时360内部使用的超大规模HBase集群以及他们对HBase所做出的一系列改进措施。 首先,赵健博介绍...

    基于HadoopHBase的一淘搜索离线系统PPT课件.pptx

    总结来说,一淘搜索系统利用Hadoop和HBase的强大能力,构建了一个高可用、高性能的分布式存储和计算平台,实现了对海量电子商务数据的高效处理和检索,为用户提供优质的搜索体验。其核心在于利用HBase的分布式存储...

    基于hadoop监控的grafana模板

    HMaster (HM) 负责区域服务器管理和表的元数据,RegionServer (RS) 存储实际数据。Grafana模板可以展示HBase的读写请求、Region分布、内存使用情况等。 4. Hive: 是一个数据仓库工具,用于查询和管理大规模数据集。...

Global site tag (gtag.js) - Google Analytics