我应该如何在 Cassandra 中设置复制因子来解决节点故障?

How should I set the replication factor in Cassandra to account for node failure?

假设我们有一个复制因子为 2 的 cassandra 部署。我的意思是我们可以容忍持久存储的一个节点完全丢失而不会丢失整体数据。我理解这意味着每个值在任何给定时间至少存储在两个不同的节点上。因此,所需的总存储至少是值的总数据 x 2。即,如果我们需要在集群中存储 100TB,则我们至少需要跨节点的 200TB 持久存储。

但是,随着节点数的增加,超过 1 个节点发生故障的可能性也会增加。因此,我们是否需要随着节点数量的增加而增加复制因子?

例如:

让我们假设所有组件都是 100% 可靠的,除了我的节点本地存储控制器,它有时会完全损坏所有本地存储并且没有恢复的可能性(即,数据丢失是全部)。所有机架设备、交换机、电源、冷却等都非常完美。我知道这不现实。

我们还假设任何数据丢失对于此应用程序来说都是非常非常糟糕的。

假设我的节点每个有 1TB 的存储空间。对于 100TB 的值,我需要 200 台机器才能实现 2 的复制因子(即,我可以丢失任何一个节点并仍然保留数据)。但是,如果我认为那组 200 中的 2 个节点同时发生故障,我可能需要将复制因子提高到 3。因此现在我需要每个值的三个副本(在三个不同的节点上),现在我需要 300节点。我现在感觉有可能同时丢失3个或更多节点,所以我必须重新添加更多节点,等等...

当然这不是实际的扩展方式?我的逻辑有什么问题?

您需要考虑以下几种类型的故障:

  1. 单个节点故障 (hardware/os/...) - 您的节点完全故障(数据丢失)或部分故障(例如,电源适配器出现故障)
  2. Rack/data 中心故障 - 当数据中心特定部分或数据中心的节点完全故障,或网络不可用时

复制有助于避免完全数据不可用,但它也可能取决于部署策略。

例如,如果您的所有服务器都在一个数据中心,如果它不可用,您将无法访问数据。或者,如果您没有将集群设置为具有机架感知数据放置,则可以将副本放入同一个机架中,如果它发生故障,您将丢失副本。

通常,建议使用复制因子 3,如果您计划进行大型部署,一定要使用机架感知数据放置 - 但您应该小心,因此机架数量应与 RF 匹配(在云部署中,通常机架映射到可用性区域)。

可用性还取决于您的业务需求 - 在最简单的情况下,如果您使用一致性级别 ONELOCAL_ONE,即使只有一个副本可用,您的数据也是可用的,但如果您的业务逻辑需要更强的一致性,你需要有更多的副本可用。并且复制因子也会影响一致性级别 - 如果您使用 RF=2,并且要求 CL=QUORUM,您不能容忍单节点故障,而在 RF=3 和一个节点故障时实现 CL 是可能的。