目前,我们在两个数据中心各运行一个 4 节点 Cassandra 环。我们希望将它们重建为一个 8 节点环。在其他条件相同的情况下,我们确实希望获得一致的读取,因此我们目前运行 QUORUM 读取和写入。但是,如果我们失去一个数据中心,这似乎会导致许多或所有请求因无法满足 ConsistencyLevel 而失败。由于我们计划向两个数据中心发送请求,因此切换到 LOCAL_QUORUM 不足以保证一致性。
Cassandra 似乎非常缺少仅针对可用节点进行衡量的 ConsistencyLevel 设置。
在这种情况下,怎样做才能获得最大程度的一致性,且不会出现可用性故障?为了获得它,需要进行哪些权衡?
答案1
您可以在正常操作中使用 QUORUM 让您的应用进行读/写,然后在 DC 发生故障时故障转移到 LOCAL_QUORUM。这是您必须自己做的事情,因为 Cassandra 不会自动执行此操作。或者,如果 DC 发生故障,您可以在打开它进行读/写访问之前执行 nodetool 修复。显然,在多 DC 场景中,QUORUM 可能意味着您将遇到延迟问题,具体取决于它们之间的管道,但这是您必须权衡的权衡。
答案2
这根本不可能。当您的网络被分区(即数据中心之间的链接断开)然后又恢复时,您将如何协调中断期间每个数据中心内所做的更改?我特别询问两个数据中心中都发生了变化的记录。
Cassandra 似乎严重缺少仅针对可用节点进行衡量的 ConsistencyLevel 设置。
在分布式系统中,诸如 ConsistencyLevel 和 quorum 之类的事情需要管理员规划,而不是由系统自动决定,这是有原因的。如果他们这样做了,那么(再次使用你的例子)你可以将 2 个相邻的节点分区,并且这两个节点会决定它们具有法定人数,并且会与其余节点不一致。