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

时间:2015-10-09 02:30:58

标签: aerospike

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

示例:

鉴于此Aerospike群集设置: - 3个物理节点:A,B,C
- 复制品= 2
- 读取一致性级别= ALL(读取请参阅保存数据的两个节点)

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

说"请求2"是合理的。将会成功。

将"请求1"成功?会不会:
a)成功是因为尝试了两次读取,即使一个节点出现故障? b)因为一个节点出现故障而失败,这意味着只有一个节点出现了#34; DAT"可以吗?

1 个答案:

答案 0 :(得分:4)

请求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读取记录并返回最新的记录 版本(不会失败阅读)。
  5. 时间流逝

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