数据请求流程
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 次定位即可