目录#
数据模型#
逻辑视图#
row: rowkey + (column + columnValue)*n
column: column family:qualifier column family固定, qualifier可增加
cell: (row, column, timestamp, type, value)
物理视图#
HBase中的数据是按照列簇存储的。
KV存储结构 K( (row, column, timestamp, type) ) -> V( value )
{"com.cnn.www","anchor","cnnsi.com","put","t9"} -> "CNN"
{"com.cnn.www","anchor","my.look.ca","put","t8"} -> "CNN.com"
{"com.cnn.www","contents","html","put","t7"} -> "..."
{"com.cnn.www","contents","html","put","t6"} -> "..."
{"com.cnn.www","contents","html","put","t5"} -> "..."
{"com.example.www","people","author","put","t5"} -> "John Doe"
架构#
RegionServer#
- HLog (WAL)
一个RegionServer有一个或者多个HLog;
每个HLog是多个Region共享的;
生命周期: 构建,滚动, 失效(MemStore落盘后), 删除; - BlockCache
LRUBlockCache(时间局部性);
BucketCache(空间局部性); - Region
分片, 水平切分(split), 负载均衡的基本单位
Region包含n个StoreStore==column family
Store包含1个MemStore和n个HFile
MemStore: 写缓存
HFile的Compact操作, 小文件合并成大文件 - MemStore [1]
- HFile [1]
读写流程和读优化#
读写流程
- 写流程
客户端写入MemStore和HFile就表示写入成功。
Flush的时机: 三个flush的参数 - 读流程
BlockCache没有数据的前提下, MemStore和StoreFile(HFile)都会读取数据。 - 总结
Master不参与读写流程,但是master宕机了,集群会处于不健康状态, Region分裂后改不了元数据。
客户端只要配置Zookeeper地址,Master的切换对客户端是透明的。
客户端缓存Meta数据, RegionServer的BlockCache缓存StoreFile(HFile)的数据。
- 写流程
HFile Compaction 读优化
- 类型
Minor Compaction: 小的相邻HFile合并成更大的HFiile。
Major Compaction: 一个store中所有的HFile合并成一个HFile。线上建议关闭自动触发,改为在低峰期手动或者自动触发。
Minor Compaction不会删除数据,Major Compaction会删除数据。
Minor Compaction 合并后,旧的数据不会马上删除, 会对客户端不可见。 - Compaction作用
减少文件数, 稳定随机读延迟; 用短时间的IO消耗以及带宽消耗换取后序读操作的低延迟。(空间换时间)
清除无效数据,较少数据存储量。
- 类型
数据删除时机
flush和Major Compaction的时候会删除冗余的数据。
flush时只删除内存的冗余数据,不删除”Delete标记”,因为在Major Compaction删冗余数据的时候会用到这个”Delete标记”。
Region分裂(split)#
- 寻找分裂点
- Region迁移的状态存在meta表, Master内存, zookeeper的region-in-transition节点
RIT状态: Region在三个地方不能保持一致 - 整个分裂过程包装成了一个事务, 保证分裂事务的原子性。
迁移的中间状态都只存储在内存中, 一旦在分裂过程中出现RegionServer宕机,有可能出现RIT状态, 需要HBCK工具分析并解决。 - Region分裂过程没有涉及数据的移动, 分裂后的子Region的文件没有任何用户数据。 [通过reference文件来查找数据,像游标offset]
真正数据迁移的迁移发生在子Region执行Major Compaction时。
优化和最佳实践#
预分区#
自动split有数据倾斜问题,所以要预分区。
建议: 生产中列簇不要太多, 列簇数据要有同步增长的趋势(不要一个列簇有很多数据, 其他列簇数据很少),
防止Region分裂时产生多个小文件。
Row_key设计 防止热点的三种方法[3]#
- Salt
- Hash
- Reversing
性能和版本#
性能#
单表 千亿行, 百万列 容量TB甚至PB级别
版本#
v0.98 目前生产线上使用最广泛的版本之一
v1.4.10 HBase社区推荐使用的稳定版本
v2.x 最受期待的一个版本
工作中接触的#
- MVCC
- 读写队列 - 4个核心参数
- TTL - TTL失效问题
- 多租户方案
rsgroup - 二级索引
- 超时 Timeout
- RIT
- 高可用
双向同步 - 优化
- bulkload
- CAS
HBase提供基于单 行 数据操作的原子性保证
HBase基于行锁来保证单行操作的原子性
checkAndPut/checkAndDelete/increment/append
参考#
- HBase - LSM-Tree
- 《Hbase原理和实践》 胡争 范欣欣 第1,2,5,7,8章
- HBase Hotkey-预分区和Rowkey设计