【问题标题】:Datastax java-driver LoadBalancingPolicyDatastax java-driver LoadBalancingPolicy
【发布时间】:2023-04-03 15:20:01
【问题描述】:

我想了解如何使用 datastax java 驱动程序为 cassandra 中的大量批处理工作负载决定负载平衡策略。我有两个数据中心,我希望尽可能快、可靠地写入具有一致性 ONE 的集群。

我该如何选择负载平衡选项,我看到了 TokenAwarePolicy, LatencyAware, DCAware 。我可以全部使用吗?

谢谢 斯里瓦桑

【问题讨论】:

    标签: cassandra datastax datastax-java-driver


    【解决方案1】:

    java-driver 中的默认 LoadBalancingPolicy 应该非常适合这种情况。默认的 LoadBalancingPolicy 定义为(来自Policies):

    public static LoadBalancingPolicy defaultLoadBalancingPolicy() {
        return new TokenAwarePolicy(new DCAwareRoundRobinPolicy());
    }
    

    这将使您提供的联络点所在的数据中心的所有请求保持在本地,并将您的请求定向到具有您正在读取/插入的数据的副本(使用循环来平衡)。

    您可以嵌套 LoadBalancingPolicies,因此如果您想使用所有这三个策略,您只需执行以下操作:

    LoadBalancingPolicy policy = LatencyAwarePolicy
      .builder(new TokenAwarePolicy(new DCAwareRoundRobinPolicy()))
      .build();
    

    【讨论】:

    • 如果联络点属于不同的数据中心,是否会有多个本地数据中心?
    • 驱动程序会将其选择(随机选择)的接触点的DC视为本地DC。因此,从多个 DC 传递接触点不是一个好习惯。当您不提供明确的 DC 名称时,较新版本的驱动程序会发出警告,而 Java 驱动程序 4.x 实际上会出错。
    【解决方案2】:

    如果你愿意使用一致性级别ONE,你并不关心使用哪个数据中心,所以没有必要使用DCAwareRoundRobinPolicy。如果您希望写入尽可能快,您希望最小化延迟,因此您应该使用LatencyAwarePolicy;在实践中,这通常会选择本地数据中心的节点,但如果它可能提供更好的性能,例如当本地节点过载时,将使用远程节点。您还希望最小化网络跳数,因此您希望使用写入的存储节点之一作为写入的协调器,因此您应该使用TokenAwarePolicy。您可以通过将一个策略传递给另一个的构造函数调用来将策略链接在一起。

    很遗憾,Cassandra 驱动程序没有提供任何直接有用的基本策略供您用作LatencyAwarePolicyTokenAwarePolicy 的子策略;选择是DCAwareRoundRobinPolicyRoundRobinPolicyWhiteListPolicy。但是,如果您使用RoundRobinPolicy 作为子策略,LatencyAwarePolicy 应该在前几次查询之后获取它需要的延迟信息。

    【讨论】:

      猜你喜欢
      • 2017-06-16
      • 2016-02-26
      • 2019-09-28
      • 2016-05-10
      • 1970-01-01
      • 2020-10-20
      • 2015-08-05
      • 2019-09-15
      • 2014-04-22
      相关资源
      最近更新 更多