4

您如何配置 Apache Cassandra 以允许灾难恢复,以允许两个数据中心之一发生故障?

DataStax 文档讨论了使用复制策略,以确保至少一个复制被写入您的两个数据中心中的每一个。但是,一旦灾难真正发生,我看不出这有什么帮助。如果您切换到剩余的数据中心,您的所有写入都将失败,因为这些写入将无法复制到其他数据中心。

我猜你会希望你的软件在两种模式下运行:正常模式,写入必须在两个数据中心之间复制,以及灾难模式,它们不需要。但改变复制策略似乎是不可能的。

我真正想要的是两个过度配置的数据中心,并且在正常操作期间使用两个数据中心的资源,但是当只有一个数据中心时仅使用剩余一个数据中心的资源(性能降低)正在运行。

4

1 回答 1

10

诀窍是改变通过 API 为写入提供的一致性设置,而不是改变复制因子。当只有一个数据中心可用时,在灾难期间使用LOCAL_QUORUM写入设置。在正常操作期间使用EACH_QUORUM以确保两个数据中心都有数据副本。读取可以LOCAL_QUORUM一直使用。

以下是多个数据中心的 Datastax 文档摘要,以及较旧但在概念上仍然相关的灾难恢复 (0.7)

使用两种一致性LOCAL_QUORUMEACH_QUORUM.

这里,“local”表示单个数据中心的本地,而“each”表示在每个数据中心都严格保持同一级别的一致性。

假设您有 2 个数据中心,其中一个严格用于灾难恢复,那么您可以将复制因子设置为...

3 个用于主写入/读取中心,2 个用于故障转移数据中心

现在,根据您的数据实际写入灾难恢复节点的重要性,您可以使用 EACH_QUORUM 或 LOCAL_QUORUM。假设您正在使用复制放置策略NetworkTopologyStrategy (NTS)

LOCAL_QUORUMon writes 只会延迟客户端本地写入 DC1 并异步写入 DC2 中的恢复节点。

EACH_QUORUM将确保复制所有数据,但会延迟写入,直到两个 DC 确认成功操作。

对于读取,最好只使用 LOCAL_QUORUM 来避免inter-data center latency.

这种方法有问题!如果您选择在写入时使用 EACH_QUORUM,则会增加潜在的故障点(DC2 已关闭,DC1-DC2 链接已关闭,无法满足 DC1 仲裁)。

好处是一旦您的 DC1 出现故障,您就有了有效的 DC2 灾难恢复。另请注意,在第二个链接中,它讨论了用于正确路由 IP 的自定义告密设置。

于 2012-11-30T20:51:00.503 回答