天天看点

hbase 学习(十六)系统架构图

hbase 系统架构图

hbase 学习(十六)系统架构图

<b>组成部件说明 </b>

client:  

使用hbase rpc机制与hmaster和hregionserver进行通信   

client与hmaster进行通信进行管理类操作   

client与hregionserver进行数据读写类操作   

zookeeper:  

zookeeper quorum存储-root-表地址、hmaster地址   

hregionserver把自己以ephedral方式注册到zookeeper中,hmaster随时感知各个hregionserver的健康状况   

zookeeper避免hmaster单点问题   

hmaster:  

hmaster没有单点问题,hbase中可以启动多个hmaster,通过zookeeper的master election机制保证总有一个master在运行   

主要负责table和region的管理工作:   

1 管理用户对表的增删改查操作   

2 管理hregionserver的负载均衡,调整region分布   

3 region split后,负责新region的分布   

4 在hregionserver停机后,负责失效hregionserver上region迁移   

hregionserver:  

hbase中最核心的模块,主要负责响应用户i/o请求,向hdfs文件系统中读写数据

hbase 学习(十六)系统架构图

hregionserver管理一些列hregion对象;  

每个hregion对应table中一个region,hregion由多个hstore组成; 

每个hstore对应table中一个column family的存储;   

column family就是一个集中的存储单元,故将具有相同io特性的column放在一个column family会更高效

hstore:  

hbase存储的核心。由memstore和storefile组成。   

memstore是sorted memory buffer。用户写入数据的流程:

hbase 学习(十六)系统架构图

client写入 -&gt; 存入memstore,一直到memstore满 -&gt; flush成一个storefile,直至增长到一定阈值 -&gt; 触发compact合并操作 -&gt; 多个storefile合并成一个storefile,同时进行版本合并和数据删除 -&gt; 当storefiles compact后,逐步形成越来越大的storefile -&gt; 单个storefile大小超过一定阈值后,触发split操作,把当前region split成2个region,region会下线,新split出的2个孩子region会被hmaster分配到相应的hregionserver上,使得原先1个region的压力得以分流到2个region上。

由此过程可知,hbase只是增加数据,有所得更新和删除操作,都是在compact阶段做的,所以,用户写操作只需要进入到内存即可立即返回,从而保证i/o高性能。

hlog  

<b>引入hlog原因: </b>  

在分布式系统环境中,无法避免系统出错或者宕机,一旦hregionserver意外退出,memstore中的内存数据就会丢失,引入hlog就是防止这种情况   

<b>工作机制:</b>   

每个hregionserver中都会有一个hlog对象,hlog是一个实现write ahead log的类,每次用户操作写入memstore的同时,也会写一份数据到hlog文件,hlog文件定期会滚动出新,并删除旧的文件(已持久化到storefile中的数据)。当hregionserver意外终止后,hmaster会通过zookeeper感知,hmaster首先处理遗留的hlog文件,将不同region的log数据拆分,分别放到相应region目录下,然后再将失效的region重新分配,领取到这些region的hregionserver在load region的过程中,会发现有历史hlog需要处理,因此会replay hlog中的数据到memstore中,然后flush到storefiles,完成数据恢复。

hbase存储格式  

hbase中的所有数据文件都存储在hadoop hdfs文件系统上,格式主要有两种:   

1 hfile hbase中keyvalue数据的存储格式,hfile是hadoop的二进制格式文件,实际上storefile就是对hfile做了轻量级包装,即storefile底层就是hfile   

2 hlog file,hbase中wal(write ahead log) 的存储格式,物理上是hadoop的sequence file

hfile

<b></b>

hbase 学习(十六)系统架构图

图片解释:  

hfile文件不定长,长度固定的块只有两个:trailer和fileinfo   

trailer中指针指向其他数据块的起始点   

file info中记录了文件的一些meta信息,例如:avg_key_len, avg_value_len, last_key, comparator, max_seq_id_key等   

data index和meta index块记录了每个data块和meta块的起始点   

data block是hbase i/o的基本单元,为了提高效率,hregionserver中有基于lru的block cache机制   

每个data块的大小可以在创建一个table的时候通过参数指定,大号的block有利于顺序scan,小号block利于随机查询   

每个data块除了开头的magic以外就是一个个keyvalue对拼接而成, magic内容就是一些随机数字,目的是防止数据损坏

hfile里面的每个keyvalue对就是一个简单的byte数组。这个byte数组里面包含了很多项,并且有固定的结构。

hbase 学习(十六)系统架构图

keylength和valuelength:两个固定的长度,分别代表key和value的长度  

key部分:row length是固定长度的数值,表示rowkey的长度,row 就是rowkey   

column family length是固定长度的数值,表示family的长度   

接着就是column family,再接着是qualifier,然后是两个固定长度的数值,表示time stamp和key type(put/delete)   

value部分没有这么复杂的结构,就是纯粹的二进制数据

hlog file

hbase 学习(十六)系统架构图

hlog文件就是一个普通的hadoop sequence file,sequence file 的key是hlogkey对象,hlogkey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是“写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。  

hlog sequece file的value是hbase的keyvalue对象,即对应hfile中的keyvalue

<b>结束语:</b>这篇文章是我专门在网上弄下来的,算是hbase部分的终极篇吧,我的服务端的源码系列也要基于这个顺序来开展。

继续阅读