Aerospike Design | 请求流程内部| 资源

Moh*_*pta 6 database nosql aerospike

从客户端API触发时,在哪里可以找到有关群集中读/写请求流的信息?

在Aerospike配置文档(http://www.aerospike.com/docs/reference/configuration)中,提到了事务队列,服务线程,事务线程等,但架构文档中没有对它们进行讨论.我想了解它是如何工作的,以便我可以相应地配置它.

Ron*_*zer 7

从客户端到群集节点

在您的应用程序中,记录的是3元组(名称空间,集合,标识符).密钥将传递给客户端以获取所有键值方法(例如getput).

然后客户端通过RIPEMD-160散列密钥的(set,identifier)部分,从而产生20B摘要.此摘要是Aerospike群集的指定命名空间记录的实际唯一标识符.每个命名空间都有4096个分区,这些分区分布在群集的各个节点上.

客户端使用12位摘要来确定该特定密钥的分区ID.使用分区映射,客户端查找拥有与分区ID对应的主分区的节点.随着集群的增长,找到正确节点的成本保持不变(O(1)),因为它不依赖于记录数或节点数.

客户端将操作及其数据转换为Aerospike 有线协议消息,然后使用其池中的现有TCP连接(或创建新的TCP连接)将消息发送到正确的节点(持有此分区ID的主副本的节点).

服务线程和事务队列

当操作消息作为NIC发送/接收队列中断进入时,服务线程从NIC接收消息.接下来会发生什么取决于此操作应该执行的命名空间.如果它是内存中的命名空间,则服务线程将执行以下所有步骤.如果它是数据存储在SSD上的命名空间,则服务线程将操作放在事务队列上.其中一个队列的事务线程将执行以下步骤.

主索引查找

每条记录在内存中的主索引中都有一个64B元数据条目.主索引表示为每个分区sprigs集合,每个sprig实现为红黑树.

线程(事务线程或服务线程,如上所述)从记录的摘要中找到分区ID,并跳转到分区的正确小枝.

存在,读取,更新,替换

如果操作是存在,读取,更新替换,则线程获取记录锁定,在此期间其他操作等待访问特定的sprig.这是一个非常短暂的锁.线程遍历红黑树以查找具有此摘要的条目.如果操作是存在的,并且元数据条目确实存在,则线程将打包相应的消息并进行响应.对于读取,线程将使用指针元数据从命名空间存储中读取记录.

更新需要如上所述读取记录,然后合并bin数据.替换类似于更新,但它会先跳过读取当前记录.如果命名空间在内存中,则服务线程会将修改后的记录写入内存.如果命名空间存储在SSD上,则合并的记录被放置在流写入缓冲区中,等待刷新到存储设备.调整主索引中的元数据条目,将其指针更新为记录的新位置.Aerospike为创建/更新/替换执行写时复制.

如果命名空间的复制因子大于1,则还需要将更新和替换传递给副本.在记录锁定过程之后,操作也将驻留在RW Hash(Serializer)中,而副本写入完成.这是同一记录上的其他事务将排队到达事务挂起限制(AKA是热键)之前的位置.副本写入由不同的线程(rw-receive)处理,释放事务或服务线程以继续进行下一个操作.当副本写入完成时,RW哈希锁被释放,并且rw-receive线程将打包回复消息并将其发送回客户端.

创建和删除

如果操作是正在写入的新记录,或者正在删除记录,则需要修改分区sprig.

与更新/替换类似,这些操作获取记录级锁定并将通过RW哈希.因为它们从表示小树枝的红黑树中添加或删除元数据条目,所以它们还必须获取索引树缩减锁定.当命名空间管理程序线程找到过期记录并从主索引中删除它们时,也会发生此过程.创建操作将向分区sprig添加元素.

如果命名空间存储在SSD上,则create会将记录加载到流写入缓冲区,等待刷新到SSD,并在复制写入之前.它将更新主索引中的元数据条目,调整其指向新块的指针.

删除将从主索引的分区枝条中删除元数据条目.

摘要

  • exists/read抓取记录级锁定,并保持最短的时间.复制因子为1时,更新/替换也是如此.
  • 当复制因子高于1时,update/replace也会获取RW哈希锁.
  • create/delete也抓取索引树缩减锁.
  • 对于内存中的命名空间,服务线程可以完成所有工作,可能是副本写入.
  • 对于SSD名称空间的数据,服务线程将操作抛出到事务队列上,之后其中一个事务线程处理诸如将记录加载到用于写入的流写入缓冲区之类的事情,直到潜在的副本写入为止.
  • rw-receive线程处理副本写入并在更新/替换/创建/删除写入操作之后返回消息.

进一步阅读

  • 关于3. Aerospike是一个[AP](https://en.wikipedia.org/wiki/CAP_theorem)数据库,强调高可用性.副本只会在非常短的时间内关闭,直到群集自动重新组织N-1个节点数.将在其他位置创建新的副本分区.如果发生这种情况,那么副本写入可能会超时,但写入将保留在主分区中,然后在集群重新平衡时进行复制.因此,如果只到达主节点并且集群正在改变,则写入返回成功. (3认同)
  • 1.两个锁都用于小枝(子树),并且将它们分开以减少读取/更新/替换与创建/删除之间的争用。2.如前所述,在某些情况下,访问*同一记录*的多个操作会被序列化。Aerospike是一个多节点分布式数据库,每个节点都是多核,多线程系统,因此可以并行处理多个记录。在单个记录级别上,确保隔离操作,然后将它们对齐。如何处理热键是一个单独的主题:https://discuss.aerospike.com/t/hot-key-error-code-14/986 (2认同)