【问题标题】:Cassandra Java driver: how many contact points is reasonable?Cassandra Java驱动:多少个接触点比较合理?
【发布时间】:2015-01-07 06:21:54
【问题描述】:

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

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

我需要在那里指定集群的所有主机吗?如果我有一个包含 1000 个节点的集群怎么办?我随机选择几个?有多少,我真的是随机的吗?

【问题讨论】:

    标签: java cassandra cassandra-2.0


    【解决方案1】:

    我想说,将您的客户端配置为使用与您配置 Cassandra 使用的种子节点列表相同的节点列表将为您提供最佳结果。

    如您所知,Cassandra 节点使用种子节点来寻找彼此并发现环的拓扑。驱动程序将仅使用列表中提供的节点之一来建立控制连接,该节点用于发现集群拓扑,但为客户端提供种子节点将增加客户端的机会在节点故障的情况下继续运行。

    【讨论】:

    • «在节点故障的情况下继续运行。» — 如果那个种子节点是故障点怎么办?!
    • 集群中通常有多个种子节点,配置驱动程序也是如此。
    【解决方案2】:

    我的方法是添加尽可能多的节点 -- 原因很简单:种子仅在集群启动时是必需的,但是一旦集群启动并运行,种子只是普通节点 -- 仅使用种子可能会导致无法在工作集群中连接 -- 所以我给自己最好的机会来连接到集群,保持超过合理数量的节点 -- 一个工作节点就足以获得当前的集群配置。

    【讨论】:

    • 感谢您的回复。我只是想得到确认,在 1000 个节点的集群中,您会尽力添加所有 1000 个节点吗?
    • 绝对不会……可能在这么大的集群中,我会跟踪选择它们的 30 个节点,这样机架故障不会导致所有这些节点无法访问。
    • 我的集群有 10 个节点。我提到了 addContactPoints 中的所有 10 个节点。现在,如果我从集群对象获得一个会话,它是否总是使用同一个节点来执行我在同一个会话中的每个查询?
    • 不,计算读/写操作的节点取决于密钥的哈希值。而“代理节点”是,afaik,随机
    【解决方案3】:

    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.
    

    据我了解,您应该只添加一个接触点,然后司机会发现其余的。希望有帮助。我个人使用赫克托,你也应该研究一下。

    【讨论】:

    • 但是就像文档说的那样,如果单点故障,驱动程序将无法发现任何东西。所以,我显然需要指定不止一个,但有多少是合理的? Cassandra 将自己与 MongoDB 进行对比说:“与 MongoDB 不同,Cassandra 中的所有节点都是平等的。”换句话说,没有特殊的“mongos”节点。但从司机的角度来看,这是不正确的,您指定为接触点的一个或几个节点,成为那个特殊的节点......
    • 它们之所以特别,是因为它们需要发现集群的其余部分。一旦驱动程序连接到集群中的至少一个节点,它将发现集群中的其余节点并在所有节点之间进行负载平衡请求(根据您配置的负载平衡策略)。查看 Ruby 驱动程序的负载平衡文档,这些概念直接取自 Java 驱动程序 - datastax.github.io/ruby-driver/features/load_balancing
    • +1 因为您直接从文档中引用了正确和最佳的描述,但就像 henri 所说,它明确表示您不应该使用单个 IP,尽管您可能不需要数百个。
    【解决方案4】:

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

    他们提到他们使用他们的 Gorilla 系统关闭了 33% 的 Cassandra 集群,并看到他们的系统仍在按预期工作。

    他们有大约 2,000 个 Cassandra 节点,下降了 33%。这意味着,3 个节点中的 1 个已消失。 (Netflix 大约 660 个节点)

    如果你真的不走运,你指定的所有连接都是 660 个节点的一部分……哎哟。

    不过,如果您只使用足够多的节点,并且从没想过会发生超过 33% 的网络出现故障的剧烈事件,那么您应该能够使用一个非常小的数字,例如 6 个节点,因为有了这样的数字,你应该总是至少打出 4 个向上的数字……

    现在,如果可能的话,当然应该从战略上选择它。也就是说,当你有 6 个不同的机架时,如果你选择 6 个节点都在同一个机架上,那么你可能选错了。相反,您可能希望为每个机架指定 1 个节点。 (当然,那是你成长得那么快的时候。)

    请注意,如果您的复制因子为 5 并且 33% 的 Cassandra 节点出现故障,那么无论如何您都会遇到麻烦。在这种情况下,许多节点无法以 QUORUM 方式访问数据库。请注意,Netflix 谈到了这一点。它们的复制因子只有 3! (即 1/3 = 0.331/5 = 0.2 所以 20% 小于 33%。)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-05
      • 2015-10-31
      • 2017-10-09
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      相关资源
      最近更新 更多