上一篇blog谈到了rs挂掉的几种情况。
HBase作为nosql的一种产品,应用于大规模分布式的海量数据,其中有一个优点就是其对于机器down掉的容错性。
客户端不需要关注机器是否挂掉或者怎么样,server会自动处理down的server,处理器上的region并分配到其他server从而最大限度地提高系统可用性
今天来看看当rs挂掉以后的处理情况。
前面我们说过rs启动以后会在zk上的rs目录下注册自己的节点,而master监听了这一节点的变化包括delete,changed,created等动作。此时master监听到了node deleted事件会按如下处理:
this.deadservers.add(serverName);
this.onlineServers.remove(serverName);
this.serverConnections.remove(serverName); CatalogTracker ct = this.master.getCatalogTracker();
// Was this server carrying root?
boolean carryingRoot;
try {
HServerAddress address = ct.getRootLocation();
carryingRoot = address != null &&
hsi.getServerAddress().equals(address);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
LOG.info("Interrupted");
return;
}
HServerAddress address = ct.getMetaLocation();
boolean carryingMeta =
address != null && hsi.getServerAddress().equals(address);
if (carryingRoot || carryingMeta) {
this.services.getExecutorService().submit(new MetaServerShutdownHandler(this.master,
this.services, this.deadservers, info, carryingRoot, carryingMeta));
} else {
this.services.getExecutorService().submit(new ServerShutdownHandler(this.master,
this.services, this.deadservers, info));
}
逻辑也比较简单,从master内存中删除该rs,删除connection,判断是否有root或是meta在其上
然后起线程servershutdown来处理,servershutdown的处理如下:
首先把该rs的log split掉,按region分别放到每个region目录下的recovered.edits 目录下,一个线程读3个线程写
splitLog(serverName)
清除所有到该rs的regionplan,清楚master内存上的该rs的region,找到online的处于rit队列中的该rs的region
List<RegionState> regionsInTransition =
this.services.getAssignmentManager().processServerShutdown(this.hsi);
若包含root或是meta则需assign
if (isCarryingRoot()) { // -ROOT-
try {
this.services.getAssignmentManager().assignRoot();
} catch (KeeperException e) {
this.server.abort("In server shutdown processing, assigning root", e);
throw new IOException("Aborting", e);
}
}
// Carrying meta?
if (isCarryingMeta())this.services.getAssignmentManager().assignMeta();
等待meta表上线,扫描meta表,寻找需要重新assign的region,其中为处于RIT队列中的会重新分配,处于RIT中且状态是PENDINGCLOSE或是CLOSING的将重新assign,而RIT中的其他状态不许重新分配,因为RIT超时后会自动reassign这些region
for (RegionState rit : regionsInTransition) {
if (!rit.isClosing() && !rit.isPendingClose()) {
LOG.debug("Removed " + rit.getRegion().getRegionNameAsString() +
" from list of regions to assign because in RIT");
hris.remove(rit.getRegion());
}
}
for (Map.Entry<HRegionInfo, Result> e: hris.entrySet()) {
if (processDeadRegion(e.getKey(), e.getValue(),
this.services.getAssignmentManager(),
this.server.getCatalogTracker())) {
this.services.getAssignmentManager().assign(e.getKey(), true);
}
}
而在上面的挑选region assign的过程当中会存在bug
如一个region 从A move 到B ,其操作为close region IN A 然后 open region In B 。但是当region在B上线之前,此时由于已经关闭了region,故该region在master处是offline的,但是在meta表中还存在,而且RIT队列中也有。
如此时A server 挂掉,那么通过上述的分配规则,显然region 要assign,而此时 region 在B中上线,然后RIT队列中又存在一个对region的分配,从而造成region的二次分配,二者会对数据的一致性造成很大的影响
分享到:
相关推荐
【HBASERegion数量增多问题...通过合理设计ROWKEY、适时合并Region以及优化配置,可以有效地解决Region数量过多的问题,提升HBase集群的性能和稳定性。同时,监控和定期评估Region分布状况也是维护系统健康运行的关键。
HBase 负载均衡算法的实现主要是通过 Region 的分配和负载均衡来实现的。 Region 的初始分配策略是 Master 负责对 Region 的分配,而集群负载均衡算法主要是集中在文件 LoadBalancer.java 文件中,方法 ...
6. **HBase Console**:这是HBase提供的一个简单的Web界面,用于查看表的信息、region分布和集群状态。它不支持复杂的查询,但对于快速检查和监控HBase实例非常有用。 7. **HBase MapReduce**:MapReduce是Hadoop...
HBase的主节点(HMaster)负责region的分配和负载均衡。当HBase启动时,HMaster会将`.ROOT.`和`.META.`表的region分配给HRegionServer(RS)。每个RS管理多个region,并为每个region创建一个HRegion对象。每个...
当Region状态在变迁过程中出现异常时,如RegionServer未正确处理关闭或分配命令,可能会导致Region长时间处于RIT(Region-In-Transition)状态。这时,HMaster会尝试重试操作或采取其他恢复策略,例如强制关闭...
HBase 的性能调优需要考虑到多个因素,包括 Zookeeper 的 session timeout、RegionServer 的 IO 线程数和 Region 的大小。只有通过深入了解 HBase 的架构和机理,才能对这些配置项进行合理的调整,以提高 HBase 的...
【HBase优化-系统架构】主要探讨了针对HBase性能的优化策略,特别是从系统架构层面进行调优的方法。HBase作为一个分布式、列族式的NoSQL数据库,性能优化至关重要,尤其是对于大数据处理场景。 首先,关注到配置...
HBase性能调优 HBase是一种分布式、面向列的NoSQL数据库,作为...通过调整RegionServer与Zookeeper的连接超时时间、RegionServer的请求处理IO线程数、Region的最大存储空间等参数,可以提高HBase的性能和稳定性。
当RegionServer与Zookeeper间的连接超时,RegionServer会被从RS集群中移除,引发HMaster进行region的重新分配。调优时需谨慎,降低超时时间可以缩短RegionServer故障后的failover时间,但也可能因过于敏感的超时设置...
总的来说,HBase的性能调优涉及到多个层面,包括Zookeeper的稳定性、RegionServer的并发处理能力和Region的大小管理。每项参数的调整都需要根据实际应用的负载、资源限制和业务需求来进行,通过持续监控和压力测试,...
专属MetaServer只服务于metaregion,避免了原有的共用RegionServer(RS)带来的物理资源(比如网络IO)和软件资源(如RPC handle, compaction queue等)的竞争问题。 2. 针对集群启动时间过长的问题进行了优化:这...
一淘搜索系统是基于Hadoop和HBase构建的大型分布式搜索和存储解决方案,主要用于处理海量的电子商务数据。这个系统架构包括以下几个关键组成部分: 1. **一淘搜索系统架构**: 一淘搜索系统主要由抓取系统、存储...
HMaster (HM) 负责区域服务器管理和表的元数据,RegionServer (RS) 存储实际数据。Grafana模板可以展示HBase的读写请求、Region分布、内存使用情况等。 4. Hive: 是一个数据仓库工具,用于查询和管理大规模数据集。...