1

鉴于我们有一个 2x5 节点设置(跨越 2 个 DC)和 3 复制因子,并且我们异步创建视图(因此我们可以安全地重试失败的操作)这一事实使用 WRITE=ALL 和 READ=ONE 有意义吗?

如果一个副本失败,我们如何知道恢复时间,那么如何选择正确的重试间隔和超时?

4

2 回答 2

0

WRITE=ALL 和 READ=ONE 的组合在一致性意义上是正确的 - 在您写入所有副本之后,您确实可以从任何副本中读取并期待最新数据。但是,这对高可用性不利——如果两个 DC 中的 6 个副本中的任何一个发生故障,则无法完成写入。如果其中一个节点宕机一小时,您将无法在一个小时内进行任何写入。在某些批处理设置中,这可能是有意义的,但对于交互式工作负载来说,这通常是不可接受的行为,其中高可用性是主要关注点。

如果您真的不关心高可用性并且只想在所有节点都启动时写入,那么我猜 WRITE=ALL 可以工作。例如,您可以使用“nodetool”判断所有节点何时启动。或者只是定期重试写入。

于 2019-02-07T11:21:33.973 回答
0

以下任何组合都应为您提供正确的数据:

  1. 写=全部读=一个
  2. 写=一个 读=全部
  3. 写=LOCAL_QUORUM 读=LOCAL_QUORUM

您可以根据应用程序的负载调整应用程序中的一致性级别。

根据我的说法,3 号 LOCAL_QUORUM 应该工作得更好,因为有时一个节点可能处于高负载状态或可能已关闭。您的应用程序不会受到影响。

以防万一,您的写入次数多于读取次数;WRITE CL=ALL会使您的应用程序变慢。

于 2019-02-07T04:53:00.913 回答