点评:从时间轴上看 , 一个个的 HFile 也是有序的 , 本质上它们保存了每个 region 的每个 column family 的数据历史更新 。所以对于同一个 rowkey 的同一个 cell , 它可能也有多个版本的数据分布在不同的 HFile 中 , 所以可能需要读取多个 HFiles , 这样性能开销会比较大 , 尤其是当不满足 data locality 时这种 read amplification 情况会更加严重 。这也是后面会讲到的 compaction 必要的原因 。

文章插图
HBase Minor Compaction
HBase 会自动合并一些小的 HFile , 重写成少量更大的 HFiles 。这个过程被称为 minor compaction 。它使用归并排序算法 , 将小文件合并成大文件 , 有效减少 HFile 的数量 。

文章插图
HBase Major Compaction
Major Compaction 合并重写每个 Column Family 下的所有的 HFiles , 成为一个单独的大 HFile , 在这个过程中 , 被删除的和过期的 cell 会被真正从物理上删除 , 这能提高读的性能 。但是因为 major compaction 会重写所有的 HFile , 会产生大量的硬盘 I/O 和网络开销 。这被称为写放大(Write Amplification) 。
Major compaction 可以被设定为自动调度 。因为存在 write amplification 的问题 , major compaction 一般都安排在周末和半夜 。MapR 数据库对此做出了改进 , 并不需要做 compaction 。Major compaction 还能将因为服务器 crash 或者负载均衡导致的数据迁移重新移回到离 Region Server 的地方 , 这样就能恢复 data locality 。

文章插图
Region = Contiguous Keys
我们再来回顾一下 region 的概念:
- HBase Table 被水平切分成一个或数个 regions 。每个 region 包含了连续的 , 有序的一段 rows , 以 start key 和 end key 为边界 。
- 每个 region 的默认大小为 1GB 。
- region 里的数据由 Region Server 负责读写 , 和 client 交互 。
- 每个 Region Server 可以管理约 1000 个 regions(它们可能来自一张表或者多张表) 。

文章插图
Region 分裂
一开始每个 table 默认只有一个 region 。当一个 region 逐渐变得很大时 , 它会分裂(split)成两个子 region , 每个子 region 都包含了原来 region 一半的数据 , 这两个子 region 并行地在原来这个 region server 上创建 , 这个分裂动作会被报告给 HMaster 。处于负载均衡的目的 , HMaster 可能会将新的 region 迁移给其它 region server 。

文章插图
Read 负载均衡
Splitting 一开始是发生在同一台 region server 上的 , 但是出于负载均衡的原因 , HMaster 可能会将新的 regions 迁移给它 region server , 这会导致那些 region server 需要访问离它比较远的 HDFS 数据 , 直到 major compaction 的到来 , 它会将那些远方的数据重新移回到离 region server 节点附近的地方 。
点评:注意这里的迁移的概念 , 只是逻辑上的迁移 , 即将某个 region 交给另一个 region server 管理 。

文章插图
HDFS数据备份
所有的读写都发生在 HDFS 的主 DataNode 节点上 。HDFS 会自动备份 WAL 和 HFile 的文件 blocks 。HBase 依赖于 HDFS 来保证数据完整安全 。当数据被写入 HDFS 时 , 一份会写入本地节点 , 另外两个备份会被写入其它节点 。

文章插图
WAL 和 HFiles 都会持久化到硬盘并备份 。那么 HBase 是怎么恢复 MemStore 中还未被持久化到 HFile 的数据呢?下面的章节会讨论这个问题 。

文章插图
HBase 故障恢复
当某个 Region Server 发生 crash 时 , 它所管理的 region 就无法被访问了 , 直到 crash 被检测到 , 然后故障恢复完成 , 这些 region 才能恢复访问 。Zookeeper 依靠心跳检测发现节点故障 , 然后 HMaster 会收到 region server 故障的通知 。
推荐阅读
- 中国最大的黄鳝38斤 世界上最大的黄鳝有多重
- 一个进程开启多少线程最好
- 最实用的家庭储藏茶叶的方法
- 铁观音的最佳储存方法
- 一小时搭建微信聊天机器人
- 古希腊旧喜剧古典时期的喜剧最重要的作家是谁 古希腊三大喜剧家及其代表作
- 儿童疱疹性咽喉炎
- 梦见高考迟到但最终进了考场 梦见高考迟到是什么意思
- 去惠州罗浮山哪个寺庙最好 梅州灵光寺风景区
- 大红袍的最佳储存方法
