如何配置Apache Cassandra以允许灾难恢复,以允许两个数据中心之一失败?
DataStax documentation讨论了使用复制策略,确保至少有一个复制写入两个数据中心的每一个。但是,一旦灾难真的发生,我看不出这有什么帮助。如果切换到剩余的数据中心,则所有写入都将失败,因为这些写入将无法复制到其他数据中心。
我想您希望您的软件能够以两种模式运行:正常模式,写入必须在两个数据中心之间复制,而灾难模式则不需要。但是,似乎不可能改变复制策略。
我真正想要的是两个过度配置的数据中心,并且在正常操作期间使用两个数据中心的资源,但只使用一个剩余数据中心的资源(性能降低)数据中心正在运作。
答案 0 :(得分:9)
诀窍是改变通过API给出的一致性设置,而不是改变复制因子。在灾难期间使用LOCAL_QUORUM
设置进行写入,此时只有一个数据中心可用。在正常操作期间,使用EACH_QUORUM
确保两个数据中心都具有数据副本。读取可以始终使用LOCAL_QUORUM
。
以下是multiple data centers以及较早但仍具有概念相关性disaster recovery (0.7)的Datastax文档摘要。
根据两个一致性LOCAL_QUORUM
和EACH_QUORUM
制作配方以满足您的需求。
此处,“local”表示单个数据中心的本地,而“each”表示每个数据中心的一致性严格保持在同一级别。
假设您有2个数据中心,一个严格用于灾难恢复,那么您可以将复制因子设置为...
3表示主写/读中心,2表示故障转移数据中心
现在,根据您的数据实际写入灾难恢复节点的严重程度,您可以使用EACH_QUORUM或LOCAL_QUORUM。假设您使用的是复制放置策略NetworkTopologyStrategy (NTS)
,
LOCAL_QUORUM
只会延迟客户端本地写入DC1并异步写入DC2中的恢复节点。
EACH_QUORUM
将确保所有数据都被复制,但会延迟写入,直到两个DC确认成功操作。
对于读取,最好只使用LOCAL_QUORUM来避免inter-data center latency
。
这种方法有捕获!如果您选择在写入时使用EACH_QUORUM,则会增加潜在的故障点(DC2关闭,DC1-DC2链路断开,无法满足DC1仲裁)。
奖励是您的DC1一旦关闭,您就有了有效的DC2灾难恢复。另请注意,在第二个链接中,它讨论了用于正确路由IP的自定义snitch设置。