Datastax java-驱动程序 LoadBalancingPolicy

Datastax java-driver LoadBalancingPolicy

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

如何选择负载平衡选项,我看到了 TokenAwarePolicy、LatencyAware、DCAware。我可以使用所有这些吗?

谢谢 斯里瓦赞

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

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

这会将所有请求保存在您提供的联系点所在的数据中心本地,并将您的请求定向到具有您的数据的副本(使用循环法来平衡)reading/inserting。

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

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

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

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