- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从客户端API触发后,在哪里可以找到有关集群中读写请求的流向的信息?
在Aerospike配置文档(http://www.aerospike.com/docs/reference/configuration)中,提到了有关事务队列,服务线程,事务线程等,但体系结构文档中未进行讨论。我想了解它的工作原理,以便可以对其进行相应的配置。
最佳答案
从客户端到群集节点
在您的应用程序中,记录的key是3元组(命名空间,集合,标识符)。对于所有键值方法(例如client和get),键都将传递给put。
然后,客户端通过RIPEMD-160对 key 的(集合,标识符)部分进行哈希处理,从而得出20B摘要。该摘要是Aerospike群集的指定record中namespace的实际唯一标识符。每个 namespace 都有4096 partitions,分布在群集的各个节点上。
客户端uses 12 bits of the digest确定此特定 key 的分区ID。客户端使用分区图查找拥有与分区ID对应的主分区的节点。随着群集的增长,查找正确节点的成本保持不变(O(1)),因为它不依赖于记录数或节点数。
客户端将操作及其数据转换为Aerospike wire protocol消息,然后使用其池中的现有TCP连接(或创建一个新的TCP连接)将消息发送到正确的节点(该节点持有此分区ID的主副本)。
服务线程和事务队列
当操作消息作为NIC transmit/receive queue中断出现时,
service thread从NIC接收消息。接下来发生的情况取决于此操作应针对的 namespace 。如果它是内存中的 namespace ,则服务线程将执行以下所有步骤。如果它是一个数据存储在SSD上的命名空间,则服务线程会将操作放在transaction queue上。队列的transaction threads之一将执行以下步骤。
主索引查找
每个记录在内存中的primary index中都有一个64B元数据条目。主索引表示为sprigs per-partition的集合,每个小枝都实现为red-black tree。
线程(如上所述,事务线程或服务线程)从记录的摘要中找到分区ID,然后跳到该分区的正确分支。
存在,读取,更新,替换
如果该操作存在,读取,更新或替换,则该线程获取记录锁定,在此期间其他操作将等待访问特定的小枝。这是生命周期很短的锁。线程在红黑树间移动,以查找具有该摘要的条目。如果操作是exists,并且元数据条目确实存在,则线程将打包适当的消息并作出响应。对于读取,线程将使用指针元数据从namespace storage中读取记录。
更新需要如上所述读取记录,然后合并到bin数据中。替换类似于更新,但是它会跳过首先读取当前记录的过程。如果 namespace 在内存中,则服务线程会将修改后的记录写入内存。如果 namespace 存储在SSD上,则将合并的记录放置在streaming write buffer中,等待flush到存储设备。调整主索引中的元数据条目,将其指针更新为记录的新位置。 Aerospike执行写时复制以创建/更新/替换。
如果命名空间的replication factor大于1,则还需要将更新和替换传达给副本。在记录锁定过程之后,该操作也将驻留在RW哈希(序列化器)中,而副本写入完成。这是同一记录上的其他事务将排队的地方,直到它们达到transaction pending limit(又称为hot key)为止。副本写操作由另一个线程(rw-receive)处理,释放事务或服务线程以继续进行下一个操作。副本写入完成后,将释放RW哈希锁,并且rw-receive线程将打包回复消息并将其发送回客户端。
创建和删除
如果操作是正在写入的新记录或正在删除的记录,则需要修改分区小枝。
像更新/替换一样,这些操作将获取记录级锁定,并将通过RW哈希。因为他们从代表小 Twig 的红黑树中添加或删除了元数据条目,所以他们还必须获得索引树归约锁定。当 namespace 主管线程找到expired records并将其从主索引中删除时,也会发生此过程。创建操作会将元素添加到分区小枝。
如果 namespace 存储在SSD上,则创建会将记录加载到流式写缓冲区中,等待刷新到SSD并在副本写之前。它将更新主索引中的元数据条目,并调整其指向新块的指针。
删除操作将从主索引的分区小枝中删除元数据条目。
摘要
auto-pin
, service-threads
, transaction-queues
。 关于aerospike - Aerospike设计|申请流程内部|资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44075490/
如果两个连接试图创建同一条记录,aerospike 如何确保只有其中一个能够成功执行?Aerospike 为单个记录上的操作维护一个队列。因此,如果一条记录存在,则对该记录的所有操作都可以串行执行。但
我想知道如何在 Aerospike 中表示关系?我意识到这是一个键值存储,但有没有可以给出的例子? 例如:如果系统中有用户,我想获取与该用户关联的事物记录列表。 最佳答案 几个快速的想法: 1- 让每
我想在 aerospike 中导入以下 csv 文件数据,并希望触发简单的选择查询以使用 python 作为客户端显示数据 例如 policyID,statecode,county,eq_site_l
我目前有一个包含两个节点的工作集群。以下是 /etc/aerospike/aerospike.conf 的内容 - network { service { address an
我们有一个由 8 个节点组成的 aerospike 集群。我们看到,在高峰时段,与其他节点相比,其中一个节点的平均负载明显更高。同样在 AMC 仪表板中,我们看到该节点只有 30% 的读取成功率。在关
有什么办法可以从 aql 或 CLI 的命名空间(Aerospike)中删除一个集合??? 我的集合还包含 Ldts 。 请给我建议一种从 LDT 中删除整个 Set 的方法 最佳答案 您可以使用删除
Aerospike 是一个支持持久性的 key 存储数据库。 但是我可以完全信任这种持久性以将其用作数据库吗? 据我了解,它首先将数据写入内存,然后将其持久化。 我可以忍受最终的一致性,但我不想处于提
我正在考虑将 aerospike 用于我们的一个项目。所以我目前创建了一个 3 节点集群并在其上加载了一些数据。 示例数据 ns: 串号 设置:串号 +-------------------+----
我目前正在设计一个 Aerospike Cluster,它可以处理许多关系,并且会很快变得非常大。我在 aerospike 文档中发现了许多关于使用 python 客户端检索 key 时生成的摘要的引
我们配置了多个客户端来与这个 aerospike 节点集群进行通信。现在我们已经从我们知道的所有客户端中删除了配置,仍然有一些读/写请求传入该集群,如 AMC 中所示。 我查看了/var/log/ae
我正在尝试了解如何最好地构建我的 Aerospike 架构。当我尝试使用它时,我意识到部分问题是我没有完全理解 Aerospike 处理数据的方式,这似乎与 RDBMS 和 Cassandra 不同。
众所周知,Aerospike 服务器不支持某些数据类型,例如 Float。但它们是在客户端处理的。例如,1.0.40 版的 Python 客户端使用序列化支持不受支持的数据类型。 我想知道客户端在从服
我正在尝试了解如何最好地构建我的 Aerospike 架构。当我尝试使用它时,我意识到部分问题是我没有完全理解 Aerospike 处理数据的方式,这似乎与 RDBMS 和 Cassandra 不同。
众所周知,Aerospike 服务器不支持某些数据类型,例如 Float。但它们是在客户端处理的。例如,1.0.40 版的 Python 客户端使用序列化支持不受支持的数据类型。 我想知道客户端在从服
我在一组中有数百万条记录。我想检索所有匹配相同模式的记录。 例如我可能有: id=4444?mode=mode1?fieldA=abc id=4444?mode=mode1?fieldA=azerty
我想从命名空间的集合中选择随机“n”个容器的样本。有没有办法在 Aerospike 查询语言中实现这一点? 在 Oracle 中,我们通过以下查询实现了类似的功能: SELECT * FROM sa
我正在使用 Aerospike 4.8v 并将我的数据保存在磁盘上,并且我正在向 aerospike 发出并行写入请求,如果我发出 10 个并行请求,那么它工作正常,但是当我发出 100 个并行请求时
我想在 aerospike 中查看数据,但找不到任何 GUI 工具。像aql这样的控制台应用程序令人不舒服。有这样的GUI工具吗? 最佳答案 当前答案:2021 打电话过来,想让我更改语音信箱。 ht
HBase 的协处理器是“移动计算而不是数据”的一个很好的例子。不确定 Aerospike 是否支持类似的功能? 最佳答案 Aerospike 支持用户定义函数 (UDF),这些函数是用户加载到数据库
我有一个包含两个 bin 的现有记录,我需要使用 java 客户端 API 向它添加第三个 bin val client = new AerospikeClient("localhost",3000)
我是一名优秀的程序员,十分优秀!