Aerospike(以下简称Spike)
索引的作用是加快对存储记录的查找或排序,Spike中的索引分两种,分别为一级索引(Primary-Index)和二级索引(Secondary-Index),两种索引的用途各不相同。
如下是个人基于Spike4.5.X版本对索引(Index)的一些梳理总结。

1、索引类型

1.1、一级索引(Primary-Index)

Primary-Index是Spike默认存在的,作用是加速查询和防止数据倾斜,在可操作的DB中最快、最可预测的索引就是一级索引。在Spike中一级索引具体原理是分布式哈希表技术与每个服务器中的分布式树结构的混合。命名空间(数据库)中的整个键空间使用健壮的散列函数分区。共有4096个分区平均分布在集群节点上。
在最底层,Spike使用了一个红黑内存结构。对于每个分区,可以有可配置数量的这种红黑结构,称为sprigs 。在一台机器上配置正确数量的sprigs 可以在优化并行访问的同时减少内存开销。
一级索引位于指定主键的摘要20字节哈希上。当一台服务器出现故障时,第二台服务器上的索引立即可用。如果失败的服务器仍处于关闭状态,数据将开始重新平衡,复制的索引将在新节点上建立。

1.1.1、索引元数据

目前,每个索引项需要64个字节。除了20字节摘要外,以下元数据也存储在索引中。
1、写入生成:跟踪密钥的所有更新;用于解决冲突更新。
2、过期时间:跟踪密钥过期的时间。逐出子系统使用此元数据。
3、上次更新时间:跟踪对密钥的最后一次写入(Citrusleaf epoch)。用于冷重启期间的冲突解决、迁移期间的冲突解决(基于配置)、谓词筛选、增量备份扫描、截断和截断命名空间命令。
4、存储地址:数据的存储位置(包括内存和持久性)。

1.2、二级索引(Secondary-Index)

二级索引位于非主键上,这允许您对一对多关系建模。在Spike中,二级索引是在逐行的基础上指定的(类似于RDBMS列)。这允许高效的更新并最小化存储索引所需的资源量。
数据描述(DDL)确定要索引哪些bin和数据类型。使用Spike工具或API动态创建和删除索引。这个DDL(类似于RDBMS的schema)不用于数据验证,即使一个bin作为索引存在于DDL中,这个bin也是可选的。对于已索引的bin,更新记录以包含bin将更新索引。
对索引项进行类型检查,即如果您有一个存储用户年龄的bin,并且年龄值由一个应用程序存储为字符串,由另一个应用程序存储为整数,则整数索引排除包含存储在索引bin中的字符串值的记录,而字符串索引排除了存储在索引bin中的具有整数值的记录。
注:
1、存储在RAM中以便快速查找。
2、在群集中的每个节点上构建,并与主索引共存。每个二级索引项仅包含对节点本地记录的引用。
3、包含指向节点中主记录和复制记录的指针。

1.2.1、数据结构

二级索引是哈希表和B-tree的混合。二级索引在结构上是B-trees的B-tree的散列。每个逻辑二级索引有32个物理树。对于密钥标识上的索引操作,哈希函数确定必须从32个物理树中创建二级索引项的物理树。识别后,对树进行B-trees更新。注意,对应于单个二次索引键,可以有许多主记录引用。此结构的最低级别是一个基于需要存储的记录数的成熟B-trees列表。

1.2.2、索引元数据

Spike跟踪在全局维护的数据结构系统元数据(SMD)系统中创建的索引。SMD模块位于多个节点上多个辅助索引模块的中间。对次索引所做的更改总是从SMD触发。
SMD工作流程是:
1、客户端请求触发与二级索引元数据相关的创建、删除或更新。请求通过二级索引模块传递到SMD。
2、SMD将请求发送到Paxos主机。
3、paxos主机从所有集群节点请求相关元数据。
4、一旦接收到所有数据,它就会调用二级索引合并回调函数。此函数用于解析二级索引的获取元数据版本。
5、SMD向所有群集节点发送请求以接受新元数据。
6、每个节点执行一个二级索引创建或删除DDL函数。
7、扫描被触发并返回到客户端。

2、索引操作

2.1、sindex-create

Format: sindex-create:ns=NAMESPACE;[set=SET];indexname=INDEX_NAME;indexdata=BIN_NAME,BIN_TYPE

2.2、sindex-delete

Format: sindex-delete:ns=NAMESPACE[;set=SET];indexname=INDEX_NAME

2.3、sindex-histogram

Format: sindex-histogram:ns=NAMESPACE;[set=SET];indexname=INDEX;enable=ENABLE