Moh*_*pta 6 database nosql aerospike
从客户端API触发时,在哪里可以找到有关群集中读/写请求流的信息?
在Aerospike配置文档(http://www.aerospike.com/docs/reference/configuration)中,提到了事务队列,服务线程,事务线程等,但架构文档中没有对它们进行讨论.我想了解它是如何工作的,以便我可以相应地配置它.
从客户端到群集节点
在您的应用程序中,记录的键是3元组(名称空间,集合,标识符).密钥将传递给客户端以获取所有键值方法(例如get和put).
然后客户端通过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,并在复制写入之前.它将更新主索引中的元数据条目,调整其指向新块的指针.
删除将从主索引的分区枝条中删除元数据条目.
摘要
进一步阅读
auto-pin
,service-threads
,transaction-queues
. 归档时间: |
|
查看次数: |
643 次 |
最近记录: |