2

背景:

我们正在创建一个跨越 3 个地理上分离的数据中心的 Cassandra 集群。我们计划在每个数据中心有 2 个 Cassandra 节点(2 个节点 x 3 个站点 = 总共 6 个节点)。所有 6 个节点都将属于同一个集群。

这个想法是能够将数据写入集群中的任何节点,并能够从任何其他节点读取数据。[我们可以容忍 1 秒的更新延迟]。

问题:

我们如何设计一个客户端来写入“集群”。Cassandra 没有路由器或像 MongoDB 这样的中间层。我们是否设计为写入环中的任何节点?如果是这样,那个节点是什么故障(即我们是否需要让我们的客户端知道集群中的所有节点 IP?)

谢谢你。

4

3 回答 3

3

您可以从集群中的任何节点读取或写入,它们都能够将请求路由到正确的节点(执行路由的节点通常称为操作的“协调器”)。您应该尝试在本地数据中心的所有节点上平衡您的请求,仅在所有本地节点都关闭时才使用远程数据中心中的节点。大多数 Cassandra 客户端将以循环方式将请求传播到您指向它们的所有节点,正如 Canausa 所提到的,一些自动发现其他节点,有时使用更复杂的算法来选择将请求发送到哪个节点。

对任何数据中心的写入会自动复制到所有其他数据中心,因此您确实可以写入任何节点并从任何节点读取。通常,您将希望使用一致性级别 LOCAL_QUORUM 进行读取和写入,这需要本地数据中心中的法定数量的副本响应操作才能被视为成功。您还可以考虑在 EACH_QUORUM 写入,它等待来自每个数据中心中的法定副本的响应。显然,在这种情况下延迟会更高,但您可以在所有数据中心之间实现强一致性。

但是,每个数据中心只有 2 个节点,副本的法定人数相当于所有副本,因此如果任何节点出现故障,您将失去该部分数据的可用性。出于这个原因,如果您想使用仲裁一致性级别,建议您在每个数据中心中至少有 3 的复制因子,以允许丢失一个副本,同时仍保持强(或本地强)一致性。

于 2012-09-21T03:15:26.030 回答
1

大多数 Cassandra 客户端将尝试连接到 1 个节点,如果失败,将尝试列表中的下一个节点。有些人甚至会建立连接并找出集群的布局并选择正确的节点进行连接。像 Hector 这样的客户端将保持对特定节点的连接开放,以防您需要请求更多信息,这将避免昂贵的设置。

于 2012-09-19T20:30:14.983 回答
0

任何 Cassandra 客户端都可以向集群中的任何节点发送请求,该节点将路由和整合来自自身和其他节点的结果。

在您的场景中,您可能会考虑复制因子为 3,每个数据中心一个,每个节点对一半数据进行分区,并使用 QUORUM 进行读取和写入。配置您的副本放置策略,以便每次写入更新每个数据中心的一个节点(例如 A1、A2、A3、B1、B2、B3)。这样,每个数据中心都可以支配所有数据,并且读取或写入请求将在收到来自第一个响应数据中心的响应以及它自己的响应时立即返回控制权。

您不需要让您的客户端知道所有节点,但它应该知道至少两个以防止单点故障。我会从每个数据中心至少选择一个。

于 2012-09-21T09:13:31.470 回答