构建Cassandra集群?

构建Cassandra集群?,cassandra,nosql,cluster-computing,Cassandra,Nosql,Cluster Computing,背景: 我们正在创建一个Cassandra集群,它跨越3个地理位置不同的数据中心。我们计划在每个数据中心有2个Cassandra节点(2个节点x 3个站点=总共6个节点)。所有6个节点都将是同一集群的一部分 其思想是能够将数据写入集群中的任何节点,并能够从任何其他节点读取数据。[我们可以容忍更新延迟1秒] 问题: 我们如何设计一个客户端来写入“集群”。Cassandra没有像MongoDB那样的路由器或中间层我们的设计是否可以写入环中的任何节点?如果是这样,那么该节点是什么(即,我们是否需要让客

背景:

我们正在创建一个Cassandra集群,它跨越3个地理位置不同的数据中心。我们计划在每个数据中心有2个Cassandra节点(2个节点x 3个站点=总共6个节点)。所有6个节点都将是同一集群的一部分

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

问题:

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


谢谢。

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

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

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

对任何数据中心的写入都会自动复制到所有其他数据中心,因此您确实可以对任何节点进行写入,也可以从任何节点进行读取。通常,您会希望对读取和写入使用一致性级别的本地仲裁,这要求本地数据中心中的副本仲裁做出响应,操作才会被视为成功。您也可以考虑在EAQuQueRUM中编写,它等待每个数据中心中的一组副本的响应。显然,在这种情况下,延迟会高得多,但可以实现所有数据中心的强一致性。


但是,由于每个数据中心中只有2个节点,副本的仲裁相当于所有副本,因此,如果任何节点发生故障,您将失去该部分数据的可用性。因此,如果您希望使用仲裁一致性级别,建议每个数据中心的复制系数至少为3,以允许他丢失了一个副本,但仍保持了强(或本地强)一致性。

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

对任何数据中心的写入都会自动复制到所有其他数据中心,因此您确实可以对任何节点进行写入,也可以从任何节点进行读取。通常,您会希望对读取和写入使用一致性级别的本地仲裁,这要求本地数据中心中的副本仲裁做出响应,操作才会被视为成功。您也可以考虑在EAQuQueRUM中编写,它等待每个数据中心中的一组副本的响应。显然,在这种情况下,延迟会高得多,但可以实现所有数据中心的强一致性。


但是,由于每个数据中心中只有2个节点,副本的仲裁相当于所有副本,因此,如果任何节点发生故障,您将失去该部分数据的可用性。因此,如果您希望使用仲裁一致性级别,建议每个数据中心的复制系数至少为3,以允许在保持强(或本地强)一致性的同时,他丢失了一个副本。

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

在您的方案中,您可以考虑一个复制因子3,每个数据中心一个,每个节点划分一半的数据,并使用QuRUM进行读取和写入。配置您的副本放置策略,以便每个写从每个数据中心更新一个节点(例如A1、A2、A3、B1、B2、B3)。。这样,每个数据中心都有自己处理的所有数据,读或写请求将在收到来自第一个响应数据中心的响应后立即返回控制权


您不需要让客户端意识到所有节点,但它应该至少意识到两个节点,以防止单点故障。我建议每个数据中心至少有一个节点。

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

在您的场景中,您可能会考虑复制品