Cassandra Java驱动程序:合理的联系点数量是多少?

19

在Java中,我会这样连接到Cassandra集群:

Cluster cluster = Cluster.builder().addContactPoints("host-001","host-002").build();

我需要在其中指定集群的所有主机吗?如果我有1000个节点的集群怎么办?我是否随机选择一些节点?选择多少个节点,我是否真的要随机选择呢?

4个回答

15

我认为,将客户端配置为使用与您在Cassandra中配置的种子节点列表相同的节点列表,将会给您带来最好的结果。

正如您所知,Cassandra节点使用种子节点来互相发现并了解环形拓扑结构。驱动程序将仅使用提供的列表中的一个节点来建立 控制连接,该连接用于发现集群拓扑结构,但是向客户端提供种子节点将增加客户端在节点故障的情况下继续操作的机会。


「在节点故障的情况下继续运行。」—— 如果那个种子节点是故障点怎么办? - Alexis Wilke
2
在一个集群中通常有多个种子节点,配置驱动程序也是如此。 - Alex Popescu

11
我的做法是尽可能添加更多的节点——原因很简单: 种子节点仅在集群引导时需要,但一旦集群运行起来,种子节点只是普通节点——仅使用种子节点可能会导致无法连接到工作集群——因此,我为自己提供了最好的连接集群的机会,保留了超过合理数量的节点——只要有一个工作节点就足以获取当前集群配置。

谢谢您的回复。我只是想确认一下,在1000个节点的集群中,您会尽力添加全部1000个节点吗? - henry
1
绝对不会...在这样一个大的集群中,我会跟踪30个节点,并选择它们的方式,以便机架故障不会导致所有这些节点无法访问。 - Carlo Bertuccini
1
我的集群有10个节点。我在addContactPoints中提到了所有这10个节点。现在,如果我从集群对象获取一个会话,它是否总是使用同一个节点来执行该会话中的每个查询? - abi_pat
不,计算读/写操作的节点取决于您键的哈希值。而“代理节点”则是随机的,据我所知。 - Carlo Bertuccini

8

Documentation from DataStax

public Cluster.Builder addContactPoint(String address)

添加一个联系点。
联系点是Cassandra节点的地址,驱动程序使用它们来发现集群拓扑。只需要一个联系点(驱动程序将自动检索其他节点的地址),但通常提供多个联系点是一个好主意,因为如果单个联系点不可用,驱动程序无法正确初始化自己。
请注意,默认情况下(即,除非您使用此构建器的withLoadBalancingPolicy(com.datastax.driver.core.policies.LoadBalancingPolicy)方法),第一个成功联系的主机将用于定义客户端的本地数据中心。因此,如果您在多个数据中心设置中运行Cassandra,最好只提供与客户端位于同一数据中心的联系点,或手动提供适合您需求的负载均衡策略。
Parameters:
    address - the address of the node to connect to
Returns:
    this Builder.
Throws:
    IllegalArgumentException - if no IP address for address could be found
    SecurityException - if a security manager is present and permission to resolve the host name is denied.

据我所知,您只需要添加一个联系点,驱动程序将会自动发现其他的点。希望这能帮到你。我个人使用hector,您也可以考虑一下。

6
但就像文件所说的那样,如果那个单独的节点故障了,驱动程序将无法发现任何内容。因此,我显然需要指定多个节点,但是指定多少个比较合理呢?Cassandra通过说“与MongoDB不同,Cassandra中的所有节点都是相等的”来将自己与MongoDB进行对比。换句话说,没有特殊的“mongos”节点。但从驱动程序的角度来看,这并不是真的,您指定为联系点的一个或几个节点将成为这个特殊节点... - henry
它们之所以特殊,是因为它们必须用来发现集群的其余部分。一旦驱动程序连接到集群中至少一个节点,它将发现集群中的其他节点,并根据您配置的负载平衡策略平衡请求。请查看 Ruby 驱动程序的负载平衡文档,其中的概念直接从 Java 驱动程序中获取 - http://datastax.github.io/ruby-driver/features/load_balancing/ - avalanche123
+1 因为您直接从文档中引用了正确且最佳的描述,但正如 henri 所说,它明确表示您不应使用单个 IP,尽管您可能不需要数百个。 - Alexis Wilke

5

我读到了一篇关于Netflix和他们的Cassandra安装的有趣文章。

他们提到了他们使用自己的系统关闭了33%的Cassandra集群,并发现系统仍然按预期工作。

他们有大约2,000个Cassandra节点,关闭了33%。这意味着三分之一的节点已经失效。(Netflix有大约660个节点)

如果你非常不幸,你指定的所有连接都是这660个节点中的一部分...痛苦啊。

不过,如果你只使用足够数量的节点,并且从未预料到超过33%的网络故障事件,则应该能够使用相当少量的节点,例如6个节点,因为在这种情况下,你应该总能够至少连接4个处于活动状态的节点...

现在,如果可能,应该进行战略性选择。也就是说,如果你在六个不同的机架上有6个节点,那么你选择得可能是错误的。相反,你可能想要在每个机架上指定1个节点。 (当然,前提是你规模已经发展到了那个程度。)

请注意,如果你的复制因子为5,而你的Cassandra节点有33%失效,则你会遇到麻烦。在这种情况下,许多节点无法按QUORUM方式访问数据库。请注意Netflix谈论了这一点。他们的复制因子只有3! (即<代码>1/3 = 0.33 ,1/5 = 0.2 因此是20%,小于33%。)

最后,我不知道Java驱动程序,我使用的是C ++驱动程序。当它失败时,我会被告知。所以我可以尝试使用另一组IP,直到它工作为止...我的系统有一个连接,在客户端访问之间保持连接,因此这是一个一次性的过程,我可以传递这个服务器已连接到Cassandra,并且可以接受客户端连接。如果每次客户端向您发送请求时都重新连接到Cassandra,那么最好不要发送太多的IP。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接