在Java中,我连接到Cussandra集群:
Cluster cluster = Cluster.builder().addContactPoints("host-001","host-002").build();
我是否需要在那里指定群集的所有主机?如果我有一个1000个节点的集群怎么办?我随机选择几个吗?有多少,我真的随机做了吗?
答案 0 :(得分:10)
我想说,配置您的客户端使用与您配置Cassandra使用的种子节点列表相同的节点列表将为您提供最佳结果。
如您所知,Cassandra节点使用种子节点找到彼此并发现环的拓扑。驱动程序将仅使用列表中提供的一个节点来建立控制连接,用于发现集群拓扑的那个,但为客户端提供种子节点将增加客户端的机会在节点故障的情况下继续运行。
答案 1 :(得分:10)
我的方法是尽可能多地添加节点 - 原因很简单:只有群集启动才需要种子,但是一旦群集启动并且运行种子只是常见节点 - 仅使用种子可能会导致在工作集群中连接是不可能的 - 所以我给自己提供了连接到集群的最佳机会,保持了超过合理数量的节点 - 它足够一个工作节点来获得当前的集群配置。
答案 2 :(得分:8)
public Cluster.Builder addContactPoint(String address)
添加联络点。
联系点是驱动程序用于发现群集拓扑的Cassandra节点的地址。只需要一个联系点(驱动程序将自动检索其他节点的地址),但通常最好提供多个联系点,因为如果该单个联系点不可用,则驱动程序无法正确初始化
请注意,默认情况下(即,除非您使用此构建器的
withLoadBalancingPolicy(com.datastax.driver.core.policies.LoadBalancingPolicy)
)方法),第一个成功联系的主机将用于为客户端定义本地数据中心。如果您在多数据中心设置中运行Cassandra,则最好只提供与客户端位于同一数据中心的联系点,或者手动提供适合您需要的负载平衡策略。 / p>
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你也应该调查一下。
答案 3 :(得分:3)
我读了一篇关于Netflix及其Cassandra installation的有趣文章。
他们提到了这样一个事实:他们使用 Gorilla 系统取消了他们的Cassandra集群的33%,并看到他们的系统仍在按预期工作。
他们有大约2,000个Cassandra节点并且减少了33%。这意味着,3个节点中有1个消失了。 (Netflix约有660个节点)
如果你真的不走运,你指定的所有连接都是660个节点的一部分......哎呀。
但是,如果您使用足够多的节点并且从不期望有超过33%的网络发生故障而引发戏剧性事件,那么您应该可以使用非常小的数字,例如6个节点,因为有这样一个数字,你应该总是至少打4个......现在,如果可能的话,当然应该从战略上选择它。也就是说,如果您在6个不同的机架中选择同一个机架中的6个节点,则可能选择了错误。相反,您可能希望为每个机架指定1个节点。 (当然,一旦你成长那么多了。)
请注意,如果您的复制因子为5并且有33%的Cassandra节点出现故障,那么您无论如何都会遇到麻烦。在这种情况下,许多节点无法以QUORUM方式访问数据库。请注意,Netflix谈到了这一点。他们的复制因子只有3! (即1/3 = 0.33
和1/5 = 0.2
所以20%小于33%。)
最后,我不知道Java驱动程序,我使用的是C ++文件。当它失败时,我被告知。所以我可以做的是在必要时尝试使用另一组IP,直到它工作......我的系统有一个连接在客户端访问之间保持不变,所以这是一次性过程我可以转发这个服务器的事实连接到Cassandra,因此可以接受客户端连接。如果每次客户端向您发送请求时重新连接到Cassandra,最好不要发送多个IP。