Region恢复逻辑
RegionServer出现宕机以后,其上部署的Region将会被Master重新分配处理,由于在宕机前,某些Region的memStore数据可能还没有做flush操作,因此,需要对这部分数据做还原处理,还原过程通过读取HLog文件来实现。
截至到目前为止(1.0版本),HBase共对外声明了两种Region恢复策略,分别基于LOG_SPLITTING和LOG_REPLAY。其中LOG_REPLAY是从0.98版本起开始引入的新策略,其相对LOG_SPLITTING策略有以下优点(具体可参考HBASE-7006):
(1)省略了创建和读写recovered.edits文件的过程;
(2)在Region恢复期间依然可以对其执行写操作。
因此,本文主要围绕LOG_REPLAY策略进行描述。
HMaster通过监听Zookeeper的/hbase/rs节点可获取到相关RegionServer的宕机事件,从而进行相应的回调处理,处理逻辑是通过ServerShutdownHandler类来封装的,具体细节如下:
-
首先通过元数据信息查找RegionServer,看其之前都部署了哪些Region,并将这些Region标记成recovering状态
针对每个待恢复的Region记录,Zookeeper都会创建与之对应的/hbase/recovering-regions/[region]/[failed-regionserver]节点来存储其最后一次执行flush时的sequenceId。这个过程是在Master端来完成的,通过MasterFileSystem的prepareLogReplay方法,由于RegionServer在默认情况下会每隔3秒与Master通信一次(通过hbase.regionserver.msginterval参数来控制),因此sequenceId信息便可从通信内容中进行获取。
-
将目标RegionServer上部署的Region进行重新分配处理
分配过程依然是在Master端进行的,通过AssignmentManager的assign(List<HRegionInfo>)方法,以round-robin方式将目标Regions分配给其他RegionServer,详细参考Region分配章节。
-
提交LogReplayHandler,将目标RegionServer上的HLog文件按Region进行分组拆分,并针对每个分组执行LOG_REPLAY操作
针对每一个待拆分的HLog,Master都会生成与之对应的SplitLogTask任务,并在Zookeeper中创建/hbase/splitWAL/[hlog]节点来将其存储,节点名称为HLog的存储路径,内容为SplitLogTask对象信息。
虽然SplitLogTask在Master端生成,但执行过程却是在RegionServer端,这主要通过Zookeeper来进行协调。每当有/hbase/splitWAL/[hlog]节点生成时,Zookeeper便会通知所有RegionServer节点进行任务抢占,抢占逻辑是通过SplitLogWorker线程来封装的,具体细节如下:
首先对目标ZK节点的数据内容进行读取,获取其version信息和SplitLogTask对象信息,然后由SplitLogTask对象判断其是否处于Unassigned状态,如果不是说明该任务已被其他RegionServer抢占;否则将SplitLogTask的状态修改为OWN,并通过Zookeeper的setData(path,data,version)方法来重新设置目标节点的数据内容,如果setData方法在执行过程中发现当前version与目标数据的version不匹配,说明该任务已优先被其他RegionServer抢占,将放弃处理。而抢到任务的RegionServer节点通过开启WALSplitterHandler线程开始对目标HLog进行拆分。
WALSplitter线程在实现上是基于生产者-消费者模式来设计的,其对内封装了buffers生产队列来存储所有待恢复的HLog.Entry实体。并对外提供了splitLogFile生产方法,来将目标HLog中符合以下要求的日志记录添加到buffers集合中去:
HLogKey的logSeqNum属性值 > 其所在Region最后一次执行flush操作时的seqId
其中,HLogKey所属Region可通过其encodingRegionName属性值来确定,而该Region最后执行flush时的seqId则记录在Zookeeper的/hbase/recovering-regions/[region]/[failed-regionserver]节点中(步骤1中所创建)。
buffers集合产生数据之后,WALSplitterHandler线程默认会开启3个子线程来对其数据内容进行消费处理(hbase.regionserver.hlog.splitlog.writer.threads参数控制),每个子线程充当消费者的角色,通过WriterThread进行封装。
buffers集合是通过如下数据结构进行组织的:
Map<regionName, RegionEntryBuffer>
消费者在消费过程中,会从集合中挑选出数据总量最大的RegionEntryBuffer,并将其传递给LogReplayOutputSink进行处理(通过调用其append方法),处理逻辑大致如下:
-
将RegionEntryBuffer中的日志记录追加到serverToBufferQueueMap集合中
serverToBufferQueueMap集合的存储结构大致如下:servername#tablename --> Queue<Row>
通过key可定位到目标RegionServer上的目标表格,value为要在目标表格上执行LOG_REPLAY操作的日志数据。
-
从serverToBufferQueueMap集合中挑选出Row数量最多的记录并进行如下判断:
(1)Row个数是否大于hbase.regionserver.wal.logreplay.batch.size参数值;
(2)所有Row的总数据量大于hbase.regionserver.hlog.splitlog.buffersize * 0.35
如果满足以上任意一项条件,对其执行下个步骤中的操作,否则先将数据缓存在serverToBufferQueueMap集合中,待数据总量达到一定规模时在进行处理。
-
对上个步骤中过滤成功的数据执行LOG_REPLAY操作
通过RPC请求执行远端RSRpcServices服务的replay方法,来将待同步的日志数据传递过去进行数据恢复。
-
-
hbase.master.distributed.log.replay
是否启用LOG_REPLAY策略,启用前提:hfile.format.version属性值不小于3。
-
hbase.hlog.split.skip.errors
默认值为false,表示如果在HLog读取过程中如果出现了问题,则打印异常信息,并放弃接下来的处理。
如果将其属性值设置成true,则出现问题时会进行如下处理:首先打印错误信息,然后将出现问题的HLog文件移动到/hbase/.corrupt目录下,并继续接下来的处理。
-
hbase.splitlog.report.interval.loglines
默认值为1024,表示每处理1024行HLog日志记录时打印一次输出信息。
-
hbase.regionserver.hlog.splitlog.buffersize
默认值为128M,表示每次LOG_REPLAY操作的日志总量应大于128M * 0.35(固定百分比),或满足hbase.regionserver.wal.logreplay.batch.size参数。
-
hbase.regionserver.wal.logreplay.batch.size
默认值为64,表示每次执行LOG_REPLAY操作时应至少包含64条日志记录,或满足hbase.regionserver.hlog.splitlog.buffersize参数。
-
hbase.regionserver.hlog.splitlog.writer.threads
通过该参数来控制WALSplitter.WriterThread线程的数量。
http://blog.csdn.net/javaman_chen/article/details/47166141
相关推荐
4. Coprocessor:在Region服务器端实现业务逻辑,减少网络传输。 六、HBase监控与故障恢复 1. 监控指标:包括内存使用、磁盘I/O、网络流量等,通过JMX和Hadoop Metrics2提供。 2. 故障处理:Master节点和Region...
- **第5章:通过Coprocessors扩展HBase**:Coprocessors是HBase中的一个重要特性,用于在服务器端执行用户定义的逻辑,从而减少网络传输开销并提高性能。本章将详细介绍Coprocessors的工作原理及其应用场景。 - **...
1. HMaster:负责全局协调,包括 Region 分配、Region 服务器的监控与故障恢复、元数据的更新等。HMaster并不参与数据存储和处理,而是专注于集群的管理和维护。 2. HRegionServer:实际存储和处理数据的节点,每个...
- **Zookeeper**: 提供协调服务和故障恢复机制,确保HBase的稳定运行。 ##### 2. **借鉴Google Bigtable的设计** HBase的设计灵感来源于Google的Bigtable论文。类似于Bigtable依赖于Google文件系统(GFS),HBase...
9. **故障恢复和容错**:HBase通过Zookeeper进行协调和故障恢复。当RegionServer失败时,Zookeeper可以帮助重新分配其负责的Region,保证系统的高可用性。 10. **批量操作**:`HTable`支持`Batch`操作,可以一次性...
8. **备份与恢复**:HBase提供了数据备份和恢复机制,以应对数据丢失或错误。在Twitbase中,这部分可能涉及到如何备份和恢复推文数据。 9. **Zookeeper**:HBase依赖Zookeeper进行协调和服务发现,了解Zookeeper的...
5. **Region**:Region是HBase的逻辑数据分区,由一个或多个列族组成。每个Region有唯一的开始和结束键,这些键定义了该Region的数据范围。 6. **Column Family**:列族是数据的物理存储单位,每个列族下可以有任意...
HBase的Coprocessor允许用户在RegionServer端实现自定义逻辑,如数据校验、数据计算等,增强了系统的灵活性和可扩展性。 10. **安全与隔离**: HBase支持用户认证、授权和加密,确保了大数据的安全存储。此外,...
除了上述内容外,HBase还涉及许多其他高级主题,如压缩算法的选择、缓存策略、故障恢复机制等,这些都需要开发者根据具体的业务需求进行细致的考虑。 ### 结论 通过深入理解HBase的逻辑视图和物理视图,以及掌握...
HBase 使用一种称为“Region”的逻辑单元来组织数据。每个 Region 包含一定数量的行,并且可以跨多个节点分布。Region 又被进一步划分为 Store 文件,每个 Store 文件对应于特定的列族。这种分层的存储结构使得 ...
2. **Region**:HBase的数据物理划分为多个Region,每个Region包含一个或多个Column Family。Region的大小可动态调整,随着数据增长而分裂。 3. **Column Family**:Column Family是逻辑上的数据集合,可以看作...
Region是表的逻辑分区,随着数据增长,Region会自动分裂以保持性能。在Region内部,数据按行键排序,这样可以快速定位到特定的数据。 图片“Hbase.png”可能展示了HBase的架构,包括Master节点、Region Server、...
每个Region Server可以管理多个Region,Region是表的逻辑分片,随着数据的增长,Region会自动分裂以保持良好的性能。 2. **Master节点**:HBase集群的核心组件,负责管理Region Server,处理Region的分配和负载均衡...
3. **HBase Coprocessor**:通过Coprocessor在服务器端执行复杂的查询逻辑,减少网络传输开销。 4. **HBase集成其他索引系统**:例如使用Apache Phoenix提供的SQL层或Apache Solr作为索引引擎。 #### 五、RowKey...
Region是表的逻辑分片,随着数据量的增长,Region会自动分裂,以确保性能和可扩展性。 3. 列族(Column Family):列族是一种预定义的数据结构,类似于关系数据库中的表。每个列族包含一系列列,列名由列族名和列...
- **Master Server**:管理Region Server,负责Region的分配、Region Server的监控和故障恢复。 - **Zookeeper**:协调集群状态,确保高可用性。 - **Region**:表被分割成多个Region,每个Region包含一个或多个...
- Region(区域):HBase中的数据分区,一个Region包含一组连续的RowKey。 3. **HBase的架构** - ZooKeeper:负责元数据管理、协调和故障恢复。 - Master:管理Region服务器,处理表的创建、删除和Region的分配...
HBase提供了多种备份和恢复策略,包括基于快照的备份、Region复制等,确保数据的安全性。 **九、扩展性与高可用性** HBase的设计使得它能够水平扩展,通过增加Region Server来处理更多数据和负载。其高可用性体现在...