数据请求流程

HBaseClient 会通过 Zookeeper 定位到 .META. 表。

根据 .META. 查找需要服务的 RegionServer,连接 RegionServer 进行读写

Client 会缓存 .META. 表信息,下次可以直接连到 RegionServer

MysqlClient 通过 Proxy,查找需要连接的 Mysql 实例,连接并进行读写

Rquest 的路由流程,Mysql 与 Hbase 基本一致,那么 RegionServer 与 Mysql 的性能差异如何呢?

Hbase 写的快

新增

为什么 Mysql 建议自增主键?(Mysql 随机插入的代价)主键索引是有序的 B+ 树结构,新增条目的 id 肯定是最大的,新增给 B+ 结构带来的调整最小

主键索引是聚簇的:新增条目,id 是最大的。其 data 追加在上一次插入的后面,磁盘更容易顺序写

辅助索引,插入基本是随机的插入条目,可能会引起 B+ 树结构很大的调整

HBase 可以随机插入HBase 的所有插入只是写入内存 memstore,只保证内存数据的有序即可 (很快、很容易)

为防止数据丢失写入 memstore 前,先写入 wal (可以关闭,速度更快)

HBase 没有辅助索引需要维护

memstore 写满了,申请一块新的内存,旧的 memstore 被后台线程刷盘,存入 HFile

修改

Mysql 数据变化引起存储变动数据块大小变化:磁盘空间不足,可能需要调整磁盘存储结构,引起大量的磁盘随机读写

辅助索引发生变化:可能需要重新调整辅助索引 B+ 树

HBase 直接将变化写入到 memstore,没有其它开销

删除

Mysql 数据删除直接操作 b+ 树的节点,肯定需要刷新磁盘

如果引起树结构变化,甚至可能需要多次刷新磁盘

HBase 只是在 memstore 记录删除标记,没有其它开销

结论

HBase 写入内存+后台刷盘 (最多是 WAL,磁盘顺序写);Mysql 需要维护 B+ 树,大量的磁盘随机读写。

Mysql 要求尽量追加写(自增 ID),速度较慢;Hbase 可以随机插入,速度很快。

Mysql 读的快

Mysql 数据是本地存储的,HBase 是基于 HDFS 有可能数据不在本地

B+ 树天然的全局有序根据主键查询,可以快速定位到数据所在磁盘块。极少的磁盘 IO 即可拿到数据

通过缓存高层节点,主健查询只需要一次磁盘 IO 就可拿到数据

Mysql 单表行数一般建议不会超过 2 千万。千万行以下的大表,B+ 树 只需 2~3 层即可

辅助索引,提供快速定位能力

辅助索引 B+ 树,可以快速定位到最终所需的主键 id,根据主键 id 可以快速拿到所需信息

HBase 只有局部信息,没有辅助索引查询会优先查找 memstore, 如果没有会查找 Hfile (存储结构类似 B+ 树)

如果第一个 Hfile 中没有所需的信息,需要去第二个Hfile 中查询,第三 ……

如果查询的数据恰好在 memstore, 第一个 Hfile,Hbase 会优于 Mysql;平均下来,hbase 读性能一般

减少 Hfile 数据以提速,小的 HFile 合并成大的 HFile 文件。这种存储结构叫 LSM 树 (Log-structured merge-tree)

如果需要检索特定的列,可能需要遍历所有 Hfile,成本巨高。

Mysql 成也 B+,败也 B+;HBase 成也 LSM,败也 LSM

附录

B+ 树

查询 值为 25 的节点,只需要 2 次定位即可

LSM 树

查询 值为 25 的节点,只需要 4 次定位即可