浅谈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中取得数据
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中取得数据
相关文章推荐
- kfaka架构介绍
- 作为首席架构师如何做好
- 架构和框架的区别
- iptables 防火墙 只允许某IP访问某端口、访问特定网站
- 大型网站技术架构 读书笔记1 大型网站架构模式
- 大型网站技术架构 读书笔记1 大型网站架构模式
- C# ComboBox的联动操作(三层架构)
- 国外大型网站使用的编程语言汇总
- LVS+Keepalived高可用负载均衡集群架构实验(参考)
- Python3使用requests登录人人影视网站的方法
- 15个推广方法的成本、引流、效果评估
- 用github搭建个人网站和git使用
- Android基础——1.系统架构&SDK目录
- Python3使用requests登录人人影视网站的方法
- 有了这个,一年可以省下25万的网站运营费用!
- iOS新建项目架构规范
- 关于“幽灵架构”的补充说明1:协议中的方法定义
- 每秒处理10万订单乐视集团支付架构
- 软件架构设计师特训营(广州站)
- 系统架构师成长之路(三)