索引数据的存储
Hbase中索引数据主要分为两类:
- 一部分存储在内存中
- 一部分存储在磁盘中
存储在内存中的索引
常见的内存索引结构有红黑树和二叉树,Hbase使用了跳跃表
之所以使用跳跃表,一方面是因为跳跃表实现相对简单;另一方面是因为跳跃表在并发场景下加锁粒度更小,能够乘载更多的并发
存储在磁盘中的索引
存储在磁盘部分的索引使用的是LSM(Log Structure Merge),这里存储的不是数据,而是数据的操作记录,包括数据的内容和对数据的操作类型
我们都知道Mysql innodb存储引擎底层使用的索引结构就是B+树,那么为什么Hbase没有使用B+树作为自己的索引结构呢?
使用LSM的原因
主要是因为当只有少量写的时候,B+树的性能还好,但是当发生大量写的时候,就会导致写性能的下降。
这里可以回忆一下B+树的数据修改过程,使用待插入的key和当前树节点存储的几个索引值进行比较,确定属于下层哪个数据节点,然后使用待插入key来和其存储的几个索引值进行比较,重复上述过程,直到叶子节点。
如果有大量的并发写操作,那么就会在磁盘中发生大量的在磁盘块中查找数据的过程,如果这些大量的待插入的key不在同一个或者相邻的磁盘块中,那么会发生大量的随机io,而我们