使用 TokenAwarePolicy 和 shuffleReplicas 的 Cassandra 负载平衡

Cassandra load balancing with TokenAwarePolicy and shuffleReplicas

我们有 6 个节点集群,我们将所有内容部署到 AWS 上的一个区域,具有 3 个可用区。我们正在使用 Ec2Snitch,它应该在每个可用区中分发一个副本。我们使用 DataStax Java 驱动程序。进行写入和读取的服务器分布在与节点相同的可用性区域中(AZ 1 个服务器)。我们想要实现的是最好的读取性能,从某种意义上说,写入对我们来说并不重要,因为我们需要写入数据但不一定要快。我们使用复制因子 3,但读写一致性级别为 ONE。

我们正在研究 TokenAwarePolicy 中的洗牌副本。 DataStax Java Driver中说它可以提高读取性能但减少写入分布。

第一个问题是关于shuffleReplicas实现的,我遵循了newQueryPlan方法的实现,我发现对于副本LinkedHashSet使用意味着主副本将始终优先于非主副本。

// Preserve order - primary replica will be first
Set<Host> replicas = new LinkedHashSet<Host>();

确认一下,如果我们将 shuffleReplicas 设置为 false,这将意味着驱动程序将始终更喜欢连接到主副本所在的节点,并将其作为协调器,这会产生热点吗?

第二个问题是关于将连接与集群分开的想法,对于写入使用shuffleReplicas on true,这将在集群中均匀分布令牌并供读取使用TokenAwarePolicyshuffleReplicas 设置为 false 以获得最佳阅读效果,这个想法可行吗?您认为它有什么问题吗?

我们希望始终从同一个可用区进行读取,以便在读取数据时获得尽可能快的速度。这是更好的方法然后将 shuffleReplicas 保留为 true 并让集群平均选择协调器。想法也可以是使用 WhiteListPolicy,这将 select 只有来自同一 AZ 的节点到放置在该 AZ 中的服务器,这将导致本地读取,但会产生热点。

Just to confirm, that will mean that driver will always prefer to connect to node where primary replica is, to have it as coordinator, if we set shuffleReplicas to false, which can create hot spots?

是的。但是请注意,只有当所有分区键都映射到同一个副本时,这才会产生热点;如果您的分区键在令牌环中均匀分布,应该没问题。

Second question is about idea to separate connection to cluster, and for writes use shuffleReplicas on true, which will distribute evenly tokens across cluster and for read to use TokenAwarePolicy with shuffleReplicas on false to gain best possible reads, is this idea viable and do you see any problems with it?

我看到的主要问题是驱动程序无法判断请求是 "read" 还是 "write",因此您必须编写自己的负载平衡策略,或使用两个单独的 Cluster 个实例,一个用于读取,一个用于写入。

否则,将shuffleReplicas设置为false并不一定意味着你会得到"best possible reads"。使用 shuffleReplicas 时要考虑的主要影响是最终一致性;当 shuffleReplicas 为真时,可以读取陈旧的值,例如如果您以一致性 ONE 写入副本 1,则以一致性 ONE 从副本 2 读取。我通常建议将读取和写入的 shuffleReplicas 设置为 true 以在集群上均匀分布负载,并调整一致性级别以在吞吐量与读取陈旧值的风险之间取得最佳平衡。