计算下推
将计算节点的逻辑推送到存储节点执行,避免了大量的数据传输,也达到了计算并行执行的效果。
分区索引
分区索引就是索引与数据在同一分区,分区==分片。索引和数据在同一个物理节点的情况称为同分布(co_located)。
分区索引的优点很明显,那就是性能好,因为所有走索引的查询都可以下推到每个存储节点,每个节点只把有效查询结果返回给计算节点,避免了大量无效的数据传输。分区索引的实现难点在于如何保证索引与数据始终同分布。
在 HBase 下,每个分片都有一个不重叠的 Key 区间,这个区间左闭右开。当新增一个键值对(Key/Value)时,系统会先判断这个 Key 与哪个分片的区间匹配,而后就分配到那个匹配的分片中保存,匹配算法一般采用左前缀匹配方式。
分区索引的难点在于分片分裂时如何保持索引与数据的同分布,可以通过引入更小的数据组织单元解决这个问题。把同分布的索引和数据装入一个更小的组织单元 (Bucket),而在分片分裂时要保持 Bucket 的完整性。
全局索引
当然,分区索引也是有缺陷的。如果你期望的是一个唯一索引,那么分区索引就无法实现。
唯一索引对应的方案就是全局索引。
全局索引问题:
- 读操作的通讯成本更高,计算节点要与存储节点做两轮通讯,第一次查询索引信息,第二次回表查询数据。
- 写操作的延迟更长,因为任何情况下索引应该与数据保持一致,如果同分布,那么数据变更时可以通过本地事务保证,但在全局索引下就变成了一个分布式事务,代价当然更高了。
此文章为6月Day19学习笔记,内容来源于极客时间《分布式数据库30讲》