我想了解如何使用datastax java驱动程序为cassandra中的繁重批处理工作负载确定负载平衡策略。我有两个数据中心,我希望尽可能快地写入具有一致性ONE的集群。
如何选择负载均衡选项,我看到了TokenAwarePolicy,LatencyAware,DCAware。我可以使用所有这些吗?
由于 Srivatsan
答案 0 :(得分:3)
java-driver中的默认LoadBalancingPolicy应该适合这种情况。默认的LoadBalancingPolicy定义为(来自Policies):
public static LoadBalancingPolicy defaultLoadBalancingPolicy() {
return new TokenAwarePolicy(new DCAwareRoundRobinPolicy());
}
这将保留您提供的联系点所在的数据中心本地的所有请求,并将您的请求定向到具有您正在读取/插入的数据的副本(使用循环平衡)。
您可以嵌套LoadBalancingPolicies,因此如果您想要使用所有这三个策略,您可以执行以下操作:
LoadBalancingPolicy policy = LatencyAwarePolicy
.builder(new TokenAwarePolicy(new DCAwareRoundRobinPolicy()))
.build();
答案 1 :(得分:1)
如果您愿意使用一致性级别ONE
,则无需关心使用哪个数据中心,因此无需使用DCAwareRoundRobinPolicy
。如果您希望写入尽可能快,您希望最小化延迟,因此您应该使用LatencyAwarePolicy
;实际上,这通常会选择本地数据中心的节点,但如果可能提供更好的性能,则会使用远程节点,例如当本地节点过载时。您还希望最小化网络跃点的数量,因此您希望使用其中一个存储节点作为写入的协调器,因此您应该使用TokenAwarePolicy
。您可以通过将一个策略传递给另一个的构造函数调用来链接策略。
很遗憾,Cassandra驱动程序不提供任何直接有用的基本策略供您用作LatencyAwarePolicy
或TokenAwarePolicy
的子策略;选项包括DCAwareRoundRobinPolicy
,RoundRobinPolicy
和WhiteListPolicy
。但是,如果您使用RoundRobinPolicy
作为子策略,LatencyAwarePolicy
应在前几次查询后获取所需的延迟信息。