Aerospike - 当一个副本关闭时读取(一致性级别为 ALL)

标签 aerospike

TL;DR
如果副本节点出现故障并且新的分区映射尚不可用,一致性级别 = ALL 的读取会失败吗?

示例:

鉴于此 Aerospike 集群设置:
- 3个物理节点:A、B、C
- 副本 = 2
- 读取一致性级别 = ALL(读取引用保存数据的两个节点)

这一系列事件:
- 一条数据“DAT”被存储到两个节点,A和B
- 节点 B 出现故障。
- B 宕机后,立即执行读请求(“请求 1”),并且一致性为 ALL。
- 约 1 秒后,生成新的分区图。集群现在知道 B 已经消失。
- “DAT”现在在节点 C 上进行复制(以保留副本=2)。
- 另一个读取请求(“请求 2”)以 ALL 一致性执行。

有理由说“请求2”会成功。

“请求1”会成功吗?会不会:
a) 即使一个节点已关闭,也因为尝试了两次读取而成功?
b) 由于一个节点关闭而失败,这意味着只有 1 个“DAT”副本可用?

最佳答案

请求 1 和请求 2 将成功。一致性级别策略的行为如下所述:https://discuss.aerospike.com/t/understanding-consistency-level-overrides/711 .

读/写一致性级别的要点是,它们仅适用于集群内给定分区存在多个版本的情况。如果集群中给定分区只有一个版本,则无论一致性级别如何,读/写都将仅转到单个节点。

  1. 因此,给定一个由 A、B、C 组成的 Aerospike 集群,其中 A 是主节点,B 是 分区 1 的副本。
  2. 假设 B 发生故障,C 现在是分区 1 的副本。分区 1 收到写入并且分区键发生更改。
  3. 现在B重新启动并返回集群。 B 上的分区 1 将 现在与 A 和 C 不同。
  4. 对分区上某个键的读取一致地到达节点 A 1 并且集群中现在有该分区的 2 个版本。我们 将从节点A和B读取记录并返回最新的 版本(读取不失败)。

延时

  1. 迁移现已完成,对于分区 1,A 是主分区,B 是分区 副本,C 不再有分区。
  2. 读操作以一致性的方式到达节点 A。因为只有 分区 1 的一个版本,节点 A 响应客户端时无需 咨询节点B。

关于Aerospike - 当一个副本关闭时读取(一致性级别为 ALL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33028946/

相关文章:

apache-spark - Aerospark 构建(并与 PySpark 一起运行)

aerospike - 如何处理 Aerospike 中不支持的数据类型

java - 在 Java 中将 Aerospike 与 Spark 结合使用时设置 TTL

docker - Aerospike Hearbeat 调用卡在 TIME_WAIT

go - 如何执行纯 aql 查询?

performance - 用于快速读取和快速写入的高性能数据库。没有更新或删除

aerospike - 如何使用 aql 对 Aerospike 中特定 bin 中的所有列表进行排序?

java - Aerospike 箱体长度小于 14

java - Aerospike 中列表元素的单独 TTL

amazon-web-services - 使用自动缩放将节点添加到现有的 aerospike 集群