Cassandra使用TokenAwarePolicy和shuffleReplicas进行负载均衡

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

我们正在调查TokenAwarePolicy中的 shuffle副本。 在DataStax Java Driver中可以说它可以提高读取性能但减少写入分配。

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

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

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

第二个问题是关于将连接分离到集群的想法,对于写入,使用shuffleReplicas on true,它将在集群中均匀地分配令牌,并且读取使用TokenAwarePolicy和false的shuffleReplicas以获得最佳可能读取,这个想法是否可行,你看到了吗?有什么问题吗?

我们希望始终从相同的可用区读取数据,以便在读取数据时获得最大可能的速度。 这是更好的方法,然后将shuffleReplicas为true,让集群均匀地选择协调器。 想法也可以使用WhiteListPolicy ,它将仅选择从同一个AZ到放置在该AZ中的服务器的节点,这将导致本地读取但可以创建热点。

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

是。 但请注意,仅当所有分区键映射到同一副本时,才会创建热点; 如果您的分区键均匀分布在令牌环上,则应该没问题。

第二个问题是关于将连接分离到集群的想法,对于写入,使用shuffleReplicas on true,它将在集群中均匀地分配令牌,并且读取使用TokenAwarePolicy和false的shuffleReplicas以获得最佳可能读取,这个想法是否可行,你看到了吗?有什么问题吗?

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

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