【发布时间】:2019-06-30 02:42:33
【问题描述】:
鉴于我们有 2x5 节点设置(跨 2 个 DC)和 3 复制因子,并且我们异步创建视图(因此我们可以安全地重试失败的操作)这一事实是否使用 WRITE=ALL 和 READ=ONE 有意义?
如果一个副本失败,我们如何知道恢复时间,那么如何选择正确的重试间隔和超时?
【问题讨论】:
标签: cassandra replication availability
鉴于我们有 2x5 节点设置(跨 2 个 DC)和 3 复制因子,并且我们异步创建视图(因此我们可以安全地重试失败的操作)这一事实是否使用 WRITE=ALL 和 READ=ONE 有意义?
如果一个副本失败,我们如何知道恢复时间,那么如何选择正确的重试间隔和超时?
【问题讨论】:
标签: cassandra replication availability
WRITE=ALL 和 READ=ONE 的组合在一致性意义上是正确的 - 在您写入所有副本之后,您确实可以从任何一个副本中读取并期待最新的数据。但是,这对 高可用性 不利 - 如果两个 DC 中的 6 个副本中的任何一个发生故障,则无法完成写入。如果其中一个节点宕机一小时,您将无法在一个小时内进行任何写入。在某些批处理设置中,这可能是有意义的,但对于交互式工作负载来说,这通常是不可接受的行为,因为高可用性是主要关注点。
如果您真的不关心高可用性并且只想在所有节点都启动时写入,那么我猜 WRITE=ALL 可以工作。例如,您可以使用“nodetool”判断所有节点何时启动。或者只是定期重试写入。
【讨论】:
以下任何组合都应为您提供正确的数据:
您可以根据应用程序的负载调整应用程序中的一致性级别。
根据我的说法,3 号 LOCAL_QUORUM 应该会更好,因为有时节点可能处于高负载状态或可能已关闭。您的应用不会受到影响。
如果您的写入次数多于读取次数; WRITE CL=ALL 会使您的应用程序变慢。
【讨论】: