【问题标题】:Aerospike - Read (with consistency level ALL) when one replica is downAerospike - 当一个副本关闭时读取(一致性级别为 ALL)
【发布时间】:2015-10-09 02:30:58
【问题描述】:

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”副本可用?

【问题讨论】:

    标签: aerospike


    【解决方案1】:

    请求 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。

    【讨论】:

      猜你喜欢
      • 2021-05-07
      • 2021-06-15
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 2016-06-03
      • 2017-03-12
      • 1970-01-01
      • 2014-11-15
      相关资源
      最近更新 更多