继续HMASTER的failover 流程
上一篇说道master failover的一个漏洞,这几天好好的看了一下,终于找到问题的关键在
哪儿了。首先来看如何重现。
1. master 发送rpc请求去open region,此时zk上的节点时offline状态。
2. rs收到请求还没有开始处理,即zk节点仍然是offline。
3. master重启
4. master开始failover 流程,rs继续处理open region动作
关键就在第四步:
如果rs已经将region open了。
1). master先收到zk node changed时间。然后再处理failover流程
1.1 收到zk事件,查看rit队列该region为null,则不做任何处理。然后failover处理的时候会将该region 重新assign。如果assign的是同一个regionserver,那么会立刻返回,且rs此次open动作结束。即region只在该rs上分配了一次,但是master的内存中并没有更新master中regions存放的信息是不准确的,影响balance;另外region依旧在RIT中,超时以后依旧会继续分配到另外一个region中,造成二次分配。
1.2 assign到不同rs,则显然会二次分配。
2).master先处理failover流程,再处理zk事件。
2.1 failover中会assign 该region,RIT为PENDINGOPEN,zk节点时offline。此时rs也在openregion 并更新zk节点,如果在此过程中有冲突的话会导致rs 或是master abort掉。
2.2 master的assign如果到不同rs上的话也会导致二次分配。
2.3 如果是同一个rs的话assign 动作结束。
2.3.1 master处理zk事件,如果此时getdata是opened的话,那么在RIT中是pendingopen,符合预期,更新master内存这个逻辑是正确的。
2.3.2但是master getdata的数据可能已经是被修改的数据,即虽然触发的是opened事件,但是在master 的nodedatachanged函数中去getdata得到的数据并不一定是opened,如有可能是offline(assign 动作更新的)这就导致master的内存又不正确,RIT也没有清空,又会二次分配。
上面所说的先处理failover还是先处理zk事件,是因为对这两个操作都是需要对RIT队列上锁的,是串行的。可以看到如果zk上状态是offline时master failover会有很大可能导致集群状态不一致,或是二次分配。
90中修正这个比较难。因为涉及到rpc通信协议的修改。
94中如何修改呢?
将要region将要在何处open的rs数据写入到zk中,即在zk上记录该region将要在那个regionserver上打开。
zk上的servername是master。这种只有当failover时有deadserver时,master会创建该region节点才会出现,即rpc请求肯定没有发送
zk上的servername是regionserver。且该server online,那么将assign该region的动作重写,不需要创建或是更新zk上面的节点。
如果region已经在rs上面分配成功了,RPC会返回alreadyopen然后会更新master内存。
如果region还在分配,rpc返回不做处理。当master收到rs 成功open region以后会更新
内存。
针对上面的几个问题
1.1 收到zk事件,查看rit队列该region为null,则不做任何处理。然后failover处理的时候会将该region 重新assign如果assign的是同一个regionserver,那么会立刻返回,且rs此次open动作结束。即region只在该rs上分配了一次,但是master的内存中并没有更新master中regions存放的信息是不准确的,影响balance;另外region依旧在RIT中,超时以后依旧会继续分配到另外一个region中,造成二次分配。
答:收到zk时间发现RIT队列是null,此时94会有一个判断,如果是正在failover那么会更新master内存。并将region加入一个队列,当failover开始执行的时候,发现该region已经被处理了,则该region的failover就不会再处理了。
1.2 master的assign如果到不同rs上的话也会导致二次分配。
答:master assign现在只会分配到同一台rs上。
2.1 failover中会assign 该region,RIT为PENDINGOPEN,zk节点时offline。此时rs也在openregion 并更新zk节点,如果在此过程中有冲突的话会导致rs 或是master abort掉。
答:修改了region failover assign的逻辑,当分配到同一台region的话,是不会去更新或是创建zk节点的,因此也就不会有冲突。如果是zk上的servername是master的话,那么该region的rpc尚未发出,创建节点就不会冲突
2.2 master的assign如果到不同rs上的话也会导致二次分配。
答:只会分配到同一台rs。
2.3 如果是同一个rs的话assign 动作结束。master处理zk事件,如果此时getdata是opened的话,那么在RIT中是PENDINGopen,符合预期,更新master 内存这个逻辑是正确的。但是master getdata的数据可能已经是被修改的数据,即虽然触发的是opened事件,但是在master 的nodedatachanged函数中去getdata得到的数据并不一定是opened,如有可能是offline(assign 动作更新的)这就导致master的内存又不正确,RIT也没有清空,又会二次分配
答:更新zk节点只有一个线程在操作不会存在两个线程了,因此不存在getdata的数据与触发的事件不一致的结果。
分享到:
相关推荐
#### 三、HBase架构 1. **HMaster** - HMaster 是 HBase 集群中的主节点。 - 它负责协调集群中的活动,包括负载均衡、故障恢复等。 - 一个 HBase 集群只有一个 HMaster。 2. **RegionServer** - RegionServer ...
例如,给定的配置中,192.168.11.12是主HMaster,192.168.11.14是备用HMaster,192.168.11.16、192.168.11.18和192.168.11.20作为Zookeeper和HRegionServer节点,而192.168.11.12到192.168.11.20同时也是HDFS的数据...
当超时时间到后,RegionServer 会被 Zookeeper 从 RS 集群中移除,HMaster 收到移除通知后,会对这台 server 负责的 regions 重新 balance,让其他存活的 RegionServer 接管。 然而,调整这个 timeout 值需要谨慎,...
三、总结 本文主要介绍了 HBase 和 OpenTSDB 在华为的实战经验,涵盖了 HBase 的启动优化、Region-locality 计算优化、系统表区域 asign、SSH/SCP 优化等方面的内容,同时还介绍了 OpenTSDB 的数据写入优化、查询...
Huawei 的实践和经验在 HBase 和 OpenTSDB 方面非常丰富,涵盖了加速 HMaster 启动、增强复制机制、迁移到 2.1.x 集群、加速数据摄取、增强数据压缩和提高查询性能等多个方面。这些实践和经验对于大数据时代的企业来...
3. 基于 Zookeeper 的 ZKFC (Zookeeper Failover Controller) 自动切换机制,当 Active NN 故障时,Standby NN 会自动接管并成为新的 Active NN。 **ResourceManager (RM) HA 实现方式**: 1. RM 将状态信息存储在 ...
三、Hbase数据库模型 Hbase的数据模型由表(table)、行(row)、列族(column family)和列(column)组成。 1. 表:由行和列族构成,不存储null值。 2. 行关键字:作为行的唯一标识,用于定位数据。 3. 列族:列...
本文将从概述、环境准备、环境搭建三个方面对 Hadoop 集群架构搭建进行分析。 一、概述 Hadoop 集群架构搭建是指在多台机器上搭建一个分布式计算环境,以满足大数据处理和分析的需求。该环境包括 NameNode、...
HMaster,很多服务器上面跑的进程是 HRegionServer,HMaster 没有单点问题,HBase 集群当中可以启动多个 HMaster,但是通过 ZooKeeper 的事件处理机制保证整个集群当中只有一个 HMaster 在运行。 HBase 组件设置 ...
HBase中的多个HMaster通过Zookeeper的Master Election机制来确定主HMaster,主HMaster负责管理表和Region的生命周期,包括表的创建、删除、分区以及Region的迁移等。 HRegionServer是HBase的核心组件,它们直接处理...
【HBase工作流程】 1. **数据路由**:客户端首先通过ZooKeeper找到Meta Region,然后通过Meta Region找到目标UserRegion所在的RegionServer。 2. **数据读写**:客户端直接与RegionServer交互,进行数据的读写操作...
默认值为3分钟(180000ms),如果超时时间到达,RegionServer将被Zookeeper从RS集群中移除,HMaster将对该服务器负责的regions重新平衡,让其他存活的RegionServer接管。 调优:这个超时时间决定了RegionServer是否...
三、测试Topic和分区 在测试中,建立了两个topic:test2和test3,两者都是12个分区(partition),前者复制数为2,后者复制数为1。 四、同步API性能测试 使用Kafka提供的性能测试工具kafka-producer-perf-test.sh...
三、HBase 配置 HBase 的配置主要包括两部分:hbase-env.sh 和 hbase-site.xml。 * hbase-env.sh:主要配置 HBase 的环境变量,例如 HBASE_PID_DIR、HBASE_MANAGES_ZK 等。 * hbase-site.xml:主要配置 HBase 的...
这些数据集通常具有三个显著特征:体积(Volume)、速度(Velocity)、种类(Variety),简称3V。随着信息技术的发展,数据量急剧增加,如何高效地收集、存储、管理和分析这些海量数据成为了一项挑战。大数据技术...
三、HBase数据模型 HBase的数据模型基于列式存储,这意味着数据按列族和列限定符进行存储,这与传统的关系型数据库不同,列式存储在大数据处理中能提供更高的读写效率。 四、HBase读写流程 1. 写入流程:客户端将...
通过阅读《HBase实战源码》,读者可以了解到上述组件的实现细节,包括数据存储格式、数据分布策略、并发控制以及各种操作的内部流程。这对于优化HBase性能、排查问题以及开发定制化功能具有极高的价值。深入源码,能...
- HBase本身不提供传统意义上的二级索引,但可以通过客户端实现索引或者使用Phoenix等第三方工具。 8. **HBase的并发控制**: - HBase使用MVCC(多版本并发控制)来保证并发操作的一致性。 - HBase的读操作通常...
**二、HBase 的工作流程** 1. **数据写入**:数据首先写入 MemStore,当 MemStore 达到一定大小或触发 flush 操作时,会将内存中的数据写入到硬盘的 StoreFile 中。 2. **数据读取**:读取数据时,首先查询 Meta ...
三、HBase的读写流程 1. 写操作:客户端将数据写入本地内存,称为MemStore,当达到一定阈值后,会触发一个 flush 操作,将数据写入磁盘形成HFile,同时更新元数据到HMaster。 2. 读操作:通过行键定位到特定的...