在Java中,我会这样连接到Cassandra集群:
Cluster cluster = Cluster.builder().addContactPoints("host-001","host-002").build();
我需要在其中指定集群的所有主机吗?如果我有1000个节点的集群怎么办?我是否随机选择一些节点?选择多少个节点,我是否真的要随机选择呢?
在Java中,我会这样连接到Cassandra集群:
Cluster cluster = Cluster.builder().addContactPoints("host-001","host-002").build();
我需要在其中指定集群的所有主机吗?如果我有1000个节点的集群怎么办?我是否随机选择一些节点?选择多少个节点,我是否真的要随机选择呢?
我认为,将客户端配置为使用与您在Cassandra中配置的种子节点列表相同的节点列表,将会给您带来最好的结果。
正如您所知,Cassandra节点使用种子节点来互相发现并了解环形拓扑结构。驱动程序将仅使用提供的列表中的一个节点来建立 控制连接,该连接用于发现集群拓扑结构,但是向客户端提供种子节点将增加客户端在节点故障的情况下继续操作的机会。
public Cluster.Builder addContactPoint(String address)
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.
我读到了一篇关于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。