HBase sequenceId知识点略记
在HBase中,sequenceId是实现一致性的灵魂,这里的一致性有两方面意思:
- 顺序性,即先写的先被读到,未提交的写不能被读到;
- 完整性,包含如下几点;
- 未持久化到hfile的数据,对应的wal文件不能删除
- 如果由于wal文件过多需要清理,则需要先把对应的数据持久化
- 异常恢复过程中,需要能够找出wal文件中尚未持久化的部分
以下从seqId的生成、保存和使用几方面对相关知识点进行了整理;
在哪里生成
1、每个HRegion都对应了一个的MultiVersionConcurrencyControl,该类中有2个变量:readPoint和writePoint,rpcHandler处理写请求的过程中,在写wal之前,会通过将writePoint加1来得到最新的seqId,然后创建1个WriteEntry,封装了该seqId和代表是否完成的状态,最后放入到1个链表中,代码如下:
synchronized (writeQueue) { long nextWriteNumber = writePoint.incrementAndGet(); WriteEntry e = new WriteEntry(nextWriteNumber); writeQueue.add(e); action.run(); return e; }
在哪些地方保存
- 写wal,walEntry的key中包含该seqId,同时会更新SequenceIdAccounting中的highestSequenceIds,其中保存了该WAL实例负责的各个region的最大seqId,值得注意的时,如果启用了multiwal,则会存在多个WAL实例并各自对应一个SequenceIdAccounting实例;
- 写memstore,cell中包含该seqId;
- 写完成时,更新readPoint为该seqId,这里会检查writeQueue中是否存在更小的未完成WriteEntry,如果有,则不会更新;
- flush,生成的hfile中,除了会在cell中包含该seqId之外,还会在fileInfo中保存MAX_SEQ_ID,代表hfile中的最大seqId,同时也会更新SequenceIdAccounting中的lowestUnflushedSequenceIds,其中保存了每个region下各个store的最小未持久化seqId;
- report,rs每隔3s会上报信息给master,其中包含了每个region及其各个store的lastFlushedSequenceIds;
- compact,会获取smallestReadPoint,seqId小于该值的cell会被当前及后续的所有scanner读取,因此在生成的新hfile中这些cell不需要再保存seqId;
- roll log,会获取SequenceIdAccounting中的highestSequenceIds,将其保存到AbstractFSWAL中的walFile2Props,然后将highestSequenceIds清空;
- bulkload,会先请求执行flush,其中会通过writePoint加1得到最新的seqId,并将其作为后缀放在hfile的文件名中(完整suffix:"_SeqId_" + seqNum + "_");
在哪些地方使用
- rpcHandler处理读请求的时候,会获取region的mvcc中最新的readpoint,以此过滤memstore和hfile中的数据;
- logRoller创建新wal文件时,会对AbstractFSWAL中的walFile2Props与SequenceIdAccounting中的lowestUnflushedSequenceIds进行比较,如果某个wal文件中各region的数据都已经落盘,则将其转移到oldWALs目录;
- log文件过多时,需要将最早那个log文件转移到oldWALs目录,此时也是对AbstractFSWAL中的walFile2Props与SequenceIdAccounting中的lowestUnflushedSequenceIds进行比较,找出存在未落盘数据的reigon进行flush;
- rs挂掉后执行scp,需要splitlog,将不同reigon的log放到该reigon的recovered.edits目录下,用来在open时replay,此时splitworker会从master获取seqId来过滤掉确定已落盘的数据,获取到的seqId分为region级别的lastFlushedSequenceId和store级别的storeSequenceId,分别用于读取wal文件和写入recovered.edits目录时进行过滤;
- openreigon的时候需要对recovered.edits目录下的数据进行replay,此时会再次根据store中各hfile的最大seqId进行过滤,这里再次过滤的原因是,splitlog时从master获取的seqId是rs定时上报的,存在一定的滞后;
- 另外,新引入的serial replication特性,也会使用seqId进行相关的协调控制;

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
【漫画】ElasticSearch原理 必知必会的倒排索引和分词
倒排索引的初衷 倒排索引,它也是索引。索引,初衷都是为了快速检索到你要的数据。 我相信你一定知道mysql的索引,如果对某一个字段加了索引,一般来说查询该字段速度是可以有显著的提升。每种数据库都有自己要解决的问题(或者说擅长的领域),对应的就有自己的数据结构,而不同的使用场景和数据结构,需要用不同的索引,才能起到最大化加快查询的目的。对 Mysql 来说,是 B+ 树,对 Elasticsearch/Lucene 来说,是倒排索引。 倒排索引是什么 刚刚胖滚猪说到图书的例子,目录和索引页,其实就很形象的可以比喻为正排索引和倒排索引。为了进一步加深理解,再看看熟悉的搜索引擎。没有搜索引擎时,我们只能直接输入一个网址,然后获取网站内容,这时我们的行为是document -> words。此谓「正向索引」。后来,我们希望能够输入一个单词,找到含有这个单词,或者和这个单词有关系的文章,即word -> documents。于是我们把这种索引,叫「反向索引」,或者「倒排索引」。好了,我们来总结一下: 倒排索引的实现 假如一篇文章当中,有这么一段话"胖滚猪编程让你收获快乐",我要通过"...
- 下一篇
【云栖号直播】重磅推荐:云计算试飞员老蒋开播啦!驻云CEO手把手教你0门槛搭建电商网站
云栖号在线课堂,及时了解行业动态!阿里云推出疫情专题方案,为企业业务护航,让你足不出户了解行业动态。 在这里可以走近阿里云基础产品,了解更多应用方案,还能遇见大咖分享洞见及故事!也可以通过视频的形式让你高效、生动的了解场景化的上云最佳实践。 本周重磅推荐 标题:“疫搏云天”航空科技沙龙 简介:1、中国东方航空集团有限公司党组成员、副总经理、总审计师席晟致辞,2、阿里巴巴合伙人、阿里巴巴飞猪总裁赵颖致辞,3、阿里巴巴集团副总裁、阿里云智能通用事业部总裁任庚致辞,4、东航信息部总经理高志东分享《打造智慧东航 赋能“世界一流”》,5、南方航空副总信息师黄文强分享《航空业的新零售》,6、阿里云航空行业首席架构师郭柱《阿里云航空数字化转型解决方案》,7、三大航空公司前任CIO数字化寄语,8、阿里巴巴集团副总裁 阿里CIO学院院长胡臣杰分享《数字经济时代企业IT进化》,9、飞猪资深技术专家郑铠龙《从传统IT技术架构到互联网技术架构的演进分析》,10、中国航空公司CIO全家福与闭门会"。 观看直播 标题:云计算试飞员老蒋开播啦!第一讲:电商网站搭建 简介:驻云CEO老蒋手把手教你搭建电商网站,0门槛...
相关文章
文章评论
共有0条评论来说两句吧...