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

Aerospike - Read (with consistency level ALL) when one replica is down

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

示例:

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

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

按理说"request 2"会成功。

"request 1"会成功吗?会不会:
a) 成功是因为尝试了两次读取,即使一个节点已关闭?
b) 失败是因为一个节点宕机了,意味着只有 "DAT" 的 1 个副本可用?

请求1和请求2会成功。此处描述了一致性级别策略的行为:https://discuss.aerospike.com/t/understanding-consistency-level-overrides/711.

read/write 一致性级别的要点是,它们仅适用于集群中存在给定分区的多个版本时。如果集群中只有一个给定分区的版本,那么 read/write 将只转到一个节点,而不管一致性级别如何。

  1. 所以给定一个由 A、B、C 组成的 Aerospike 集群,其中 A 是 master,B 是 分区 1 的副本。
  2. 假设 B 失败并且 C 现在是分区 1 的副本。分区 1 收到写入并更改分区键。
  3. 现在 B 重新启动并且 returns 到集群。 B 上的分区 1 将 现在与 A 和 C 不同。
  4. 对于分区上的键,读取以一致性方式全部到达节点 A 1,集群中现在有该分区的 2 个版本。我们 将从节点 A 和 B 读取记录并且 return 最新的 版本(读取不失败)。

时间流逝

  1. 迁移现已完成,对于分区 1,A 为主,B 为 副本,C 不再有分区。
  2. 一个读取一致到达节点A。因为只有 分区 1 的一个版本,节点 A 响应客户端没有 咨询节点 B.