您的位置:首页 > 运维架构 > 网站架构

浅谈HBase系统架构

2016-05-11 10:32 399 查看
一、HBase基本架构和核心功能模块



Client:

客户端Client是HBase系统的入口,使用者直接通过客户端操作HBase;

Client使用HBase的RPC机制与HMaster和RegionServer进行通信,对HBase 管理类操作,Client与HMaster进行RPC通信;对数据读写类操作,Client与 RegionServer进行RPC交互;

Client客户端允许有多个,包括原生Java接口,还有Thrift,Avro,Rest等客户端模式;

  

Zookeeper(协调服务组件):

ZooKeeper Quorum队列负责管理HBase中多个HMaster的选举、服务器之间的状态同步等,避免HMaster单点问题;

HBase中ZooKeeper实例负责的协调工作有:存储HBase元数据信息、实时监控RegionServer(感知各个HRegionServer的健康状况)、存储所有Region的寻址入口;

保证HBase集群中有且只有一个HMaster节点;

HMaster:

HMaster没有单点问题,在HBase中可以启动多个Hmaster,通过ZooKeeper 的Master(leader)选举机制保证总有一个Master正常运行并提供服务,其余HMaster作为备选时刻准备提供服务;

HMaster 主要负责Table和Region的管理工作;

管理用户对Table的增删改查操作;

管理RegionServer的负载均衡,调整Region分布;

在Region分裂后,负责新的Region的分配;

在RegionServer宕机后,负责失效RegionServer上的Region迁移;

HRegionServer:

HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中的核心存储模块;

HRegionServer内部管理了一系列Hregion对象,每个Hregion对应了Table中的一个Region;

HRegion由多个HStore组成,每个HStore对应了Table中的一个 Column Family的存储;

HBase中每个Column Family就是一个集中的存储单元,因此设计时最好将具备共同IO特性的列放在同一个Column Family中,保证读写的高效性;

二、HRegionServer架构



HStore是HBase的真实数据存储结构,有两部分组成:MemStore 和StoreFile(底层实现是HFile格式);

MemStore是Sorted Memory Buffer,用户写入的数据首先会放入 MemStore中,当MemStore满了以后会Flush成一个StoreFile;

当StoreFile文件数量增长到一定阈值,会触发Compact操作,将多 个StoreFile合并成一个StoreFile,在合并过程中会进行版本合并和数据删除,因此可以看出,HBase其实只有增加数据,所有的更新和删除操作都是在后续的Compact过程中进行的,使得用户的写操作只要缓冲至内存即可返回,保证IO性能;

StoreFiles在触发Compact操作后,会逐步形成越大的StoreFile,当单个StoreFile大小超过一定阈值后,会触发Split操作,同时把当前 Region分裂成2个Region,父Region会下线,新分裂的2个子 Region会被Hmaster分配到相应的HRegionServer上,使得原来的 1个Region的负载压力得以分流到2个Region上;

每个HRegionServer中都有一个HLog对象,HLog是一个实现WAL 的类,每次操作写入数据到MemStore时,也会写一份数据到HLog 文件中,HLog文件定期会更新删除旧的文件(已经持久化到StoreFile中的数据);

三、HRegionServer意外出错或宕机

由上面我们知道HBase其实只有增加数据,所有的更新和删除操作都是在后续的Compact过程中进行的,使得用户的写操作只要缓冲至内存即可返回,保证IO性能,但是如果在Compact之前HRegionServer宕机了,那在内存中的写操作数据都将会丢失,下面说明一下HBase是如何做的。

其实HRegionServer中的HLog就是防止这种情况发生的。

工作机制:

每个HRegionServer中都会有一个HLog对象,HLog是一个实现Write Ahead Log(WAL)的类,每次用户操作写入Memstore的同时,也会写一份数据到HLog文件,HLog文件定期会滚动出新,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知;

HMaster首先处理遗留的HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应的Region目录下;

然后再将失效的Region重新分配,领取到这些Region的HRegionServer在加载Region的过程中会发现有历史HLog需要处理;

最后新分配的HRegionServer会将HLog中的数据回滚到MemStore中,接着Flush到StoreFile中进行持久化存储;

四、HBase存储格式

HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,格式主要有两种:

HFile HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile ;

HLog File,HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File;

1.HFile



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

HFile由六部分组成

1). Data Block 段:保存表中的数据,这部分可以被压缩;每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成,Magic内容就是一些随机数字,目的是防止数据损坏;为了提高效率,HRegionServer中有基于LRU的Block Cache机制。

2). Meta Block段 (可选的):保存用户自定义的kv对,可以被压缩。

3). File Info 段:HFile的元信息,不被压缩,用户也可以在这一部分添加自己的元信息。

4). Data Block Index 段:Data Block的索引。每条索引的key是被索引的 block的第一条记录的key。记录了每个Data块的起始点。

5). Meta Block Index段 (可选的):Meta Block的索引。记录了每个Meta块的起始点。

6). Trailer段:这一段是定长的。保存了每一段的偏移量,读取一个HFile时会首先读取Trailer,Trailer保存了每个段的起始位置(段的Magic Number用来做安全check),然后DataBlock Index会被读取到内存中,这样,当检索 某个key时,不需要扫描整个HFile,而只需从内存中找到key所在的block,通过一次磁盘io将整个 block读取到内存中,再找到需要的key。

Data Block Index采用LRU机制淘汰。

HFile的Data Block,Meta Block通常采用压缩方式存储,压缩之后 可以大大减少网络IO和磁盘IO,随之而来的开销当然是需要花费cpu 进行压缩和解压缩。

目标Hfile的压缩支持两种方式:Gzip,Lzo。

2.HLog(WAL log)



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;

五、-ROOT-与.META.表

-ROOT-表

表包含.META.表所在的区域列表,该表只会有一个HRegion,不会被切分;Zookeeper中记录了-ROOT-表的location;

.META.表

表包含所有的用户空间区域列表,以及RegionServer的服务器地址;

–>

因此查找数据的流程:

1. 通过Zookeeper找到-ROOT-的位置

2. 根据-ROOT-找到相关.META.对应的位置

3. .META.找到对应RegionServer的位置

4. 在RegionServer里找到相关Region

5. 在Region中取得数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: