Hbase基本架构
Hbase主要组成部分Zookeeper、Client、HMaster、HRegionServer、HLog
HMaster:
1. 可以有多个,通过Zk的Master Election机制保证总有一个Master在运行
2. 管理RegionsServer 负载均衡,调整Region分布:Region Split后实现新Region的分布,RegionServer失效后负责RegionServer上Region的迁移
3. 实现表的DDL操作
4. 管理NameSpace和Table的元数据
RegionServer
1. Hbase存储的核心,主要响应用户的IO请求,向HDFS中读写数据
2. 一个RegionServer下管理多个Region(HRegion)
3. Region 是Hbase分布式存储管理和负载均衡的最小单位,但不是存储的最小单位;Hbase存储的最小单位是StoreFile,StoreFile以HFile形式存储在HDFS上,StoreFile是对HFile的轻量级封装;一个Region由一个或者多个Store组成,每个Store存储一个ColumnFamily, ** 这也是使用列式存储的一个特点:相似结构的数据相近存储,方便压缩等处理 **
4. MemStore是内存里放着的保存 KEY/VALUE 映射的 MAP,当 MemStore(默认 64MB)写满之后,会开始 flush 到磁盘,即HDFS
HLog
1. Hbase的底层存储是LSM Tree ; Hbase中写入数据时先写入MemStore,由于存在宕机系统崩溃导致数据丢失等可能,可以引入WAL(Write-Ahead-Log),HLog就是实现WAL机制在Hbase中的实现
2. HLog会滚动更新,并删除旧的数据文件(已经持久化到StoreFile中的数据)
Hbase写入
写入过程
大致的流程为: 生成Put对象 --> 找到对相应的region --》 向RegionServer发起写入 -- 》写入MemStore--》写入HLog --》 返回
region定位
Hbase的客户端如何定位到到某个row key (或者某个 row key range)所对应的region呢?
首先Hbase有两个特殊的表:-ROOT- 和 .META. 表
META存储的是所有region的信息, 同时META表也处于一个Region中,ROOT表存储的是META表的Region信息
说明:
1. root region永远不会被split,保证了最需要三次跳转,就能定位到任意region 。
2. META.表每行保存一个region的位置信息,row key 采用表名+表的最后一样编码而成。
3. 为了加快访问,.META.表的全部region都保存在内存中。
4. client会将查询过的位置信息保存缓存起来,缓存不会主动失效,因此如果client上的缓存全部失效,则需要进行6次网络来回,才能定位到正确的region(其中三次用来发现缓存失效,另外三次用来获取位置信息)。
以上结构使Client经过最多经过三次跳转就能找到row key对应的region
ROOT表和META表结构
http://blog.csdn.net/chlaws/article/details/16918913
http://abloz.com/hbase/book.html#arch.catalog.meta
目录表 -ROOT- 和 .META. 实际也是HBase 表,但是会被HBase shell的 list 命令过滤掉
-ROOT- 保存 .META. 表存在哪里. -ROOT- 表结构如下:
Key:
.META. region key (.META.,,1)
Values:
info:regioninfo (序列化.META.的 HRegionInfo 实例 )
info:server ( 保存 .META.的RegionServer的server:port)
info:serverstartcode ( 保存 .META.的RegionServer进程的启动时间)
.META. 保存系统中所有region列表, .META.表结构如下:
Key:
Region key 格式 ([table],[region start key],[region id])
Values:
info : regioninfo (序列化.META.的 HRegionInfo 实例 )
info : server ( 保存 .META.的RegionServer的server:port)
info : serverstartcode ( 保存 .META.的RegionServer进程的启动时间)
ROOT表已经改名为hbase:namespace, META则是hbase:meta
Region管理
http://blog.csdn.net/u014297175/article/details/50456147
数据不写入MemStore,当MemStore满时就会Flush到HDFS上生成HFile,当HFile的数量越来越多时会影响到读性能。因此可以对HFile进行Compact操作,把多个HFile合并成一个HFile,合并过程中会产生大量的IO
compact可以分为Minor compact 和Major compact;
Minor Compact用来做部分文件的合并操作以及minVersion=0并且设置ttl过期版本清理, 不做数据删除、多版本数据清理的工作
Major compact 是对Region下的下的所有StoreFile进行合并,最终和合并出一个文件
Region minor Compact
http://www.mamicode.com/info-detail-951200.html (compact比较详细)
http://blog.csdn.net/u014297175/article/details/50456147 (主要讲解minor compact)
http://blog.csdn.net/pun_c/article/details/46841625 (Hbase渡请求分析)
http://blog.csdn.net/dbanote/article/details/8897599 (LSM树 VS B+树对比)
HFile格式
HFile存储格式Version1
HFile格式存储Version2
还有HFile存储Version3
以上可靠的介绍还是见权威的资料介绍
http://hbase.apache.org/book.html#_hfile_format_2
http://www.larsgeorge.com/2009/10/hbase-architecture-101-storage.html
Hbase与redis的对比
对比项 | redis | Hbase |
---|---|---|
开发语言 | C | Java |
存储结构 | 可以支持set、list、map、int、string等多种类 | 基于LSM Tree |
可靠性 | 基于sentinel机制 | HMaster基于Zookeeper,底层存储基于HLog |
持久化 | AOF、RDB机制 | 基于HLog+MemeStore+StoreFile |
数据量 | 单机内存 | 海量 |
读写速度数据 | ||
应用场景 | 缓存 | 时序数据存储、实时检索 |
参考资料:
WAL
Hbase官方文档
星环科技Hbase
Hbase功能细节
最全Hbase资料
http://www.th7.cn/db/nosql/201606/192979.shtml
http://www.open-open.com/lib/view/open1346821084631.html