【问题标题】:Consistency strategy for two datacenters两个数据中心的一致性策略
【发布时间】:2013-01-24 06:43:29
【问题描述】:

当所有节点都启动时,最好的容错和快速读取的写入/读取策略是什么?

我在每个数据中心有 2 个副本,起初我考虑使用 QUORUM 进行写入,使用 LOCAL_QUORUM 进行读取,但如果一个节点崩溃,读取将失败。

我想出的另一个策略是使用 QUORUM 进行写入,使用 TWO 进行读取。它在正常情况下应该工作得很快(因为我们会首先从最近的节点获得结果),当任何节点崩溃时它会工作得更慢。

  1. 这种情况是建议使用一致性级别 2 还是出于其他目的?
  2. 什么时候使用 CL 3?
  3. 您有更好的一致性和容错写入/读取策略吗?

【问题讨论】:

  • 是否有任何障碍可以避免使用 ONE 进行读取?
  • 是的,在这种情况下,我需要一致性,如果我使用 ONE 则无法实现(除非我将 ALL 用于不容错的写入)。
  • 理想情况下,我希望有类似 EACH_ONCE 用于写入和两次用于读取,这样即使 2 个节点死亡(每个数据中心一个节点),系统也可以容错。

标签: cassandra


【解决方案1】:

您首先必须选择是否需要一致性或可用性。如果选择一致性,则需要 R + W > N,其中 R 是读取的节点数,W 是写入的节点数,N 是副本数。

然后您必须选择是否希望读取/写入始终跨越多个数据中心。

一旦你做出这些选择,你就可以选择你的一致性级别(或者它将由你决定)。

例如,如果您决定需要一致性,并且您不希望写入/读取跨越多个数据中心,那么您可以在 LOCAL_QUORUM(在您的情况下为 2)读取并在 ONE 写入,反之亦然反之亦然。

每个 dc 2 份是一个奇怪的选择。通常你想做 LOCAL_QUORUM,每个数据中心有 3 个副本。这使您可以仅使用数据中心内的节点进行读写,但允许 1 个节点关闭。

【讨论】:

  • 好吧,我们不需要同时具备一致性和可用性。我们还需要两个 dc 中的副本,以便在一个 dc 出现故障时更改读/写一致性。在这种情况下,我们可以接受失去可用性的一致性。但在正常情况下,我们希望对单个节点崩溃保持一致和容错。
  • @sbridges 关于每个 DC 中的副本少于三个的注释是关键。每个 DC 一个你三个,你可以有很好的本地强一致性,并且仍然可以容忍一个本地节点的故障。当节点出现故障时更改一致性级别通常是一个坏主意;您不妨一直使用降低的一致性级别,因为您愿意接受该级别的一致性,并且当节点启动时行为将是相同的。一致性级别也是可插入的,因此您可以根据需要创建 EACH_ONE。
  • 我无法按数据中心拆分密钥,因为当一个数据中心出现故障时我需要可用性。因此,在这种情况下,如果我将 LOCAL_QUORUM 用于读取和写入,它将不起作用。我也不能一直使用降低的一致性级别。仅在脑裂的情况下会相同,但如果 dc 下降,则不会。
猜你喜欢
  • 2018-01-07
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 2014-11-15
  • 2012-04-04
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多