我有一个由8个Cassandra节点(Amazon EC2实例)组成的集群。我正在评估增加复制因子对Cassandra读取性能的影响。除了最初插入100万个对象外,不执行任何写操作。已禁用Read_Repair机会,并且正在使用ONE的一致性级别。到目前为止,我的观察是,随着复制因子的增加,读取性能也会下降。为什么会这样呢?

最佳答案

根据您尝试执行的读取类型,如果节点数保持不变并且增加了复制因子,则读取性能可能会降低。

例如,如果在聚类列上运行范围查询,或者在任何其他需要指定“允许过滤”关键字的查询上运行,则理论上可以观察到该行为。通过增加复制因子,群集的每个节点将存储更多数据:与环的主要范围有关的数据以及与该节点为其副本的所有分区键有关的数据。即使Cassandra进行了许多优化来避免此类查询的性能下降,但在每个节点中添加更多的行也会产生较低的性能。

对于使用分区键的查询,应该观察不到性能的下降,因为在到达数据之前,对分区摘要(在内存中)和分区索引(在磁盘上)的访问次数几乎相同。显然,只有当您进行一致性读取时,这才成立。
如果您在这种情况下观察到这种现象,我认为这应该与高速缓存未命中次数增加有关(如果您使用键高速缓存,行高速缓存或Bloom过滤器,尤其是当您尝试读取不存在的数据时),由于所有这些高速缓存无法保存磁盘上存在的所有数据,并且由于现在每个节点上的数据更多,因此所有高速缓存中的命中数应减少。可以使用nodetool进行验证。

当然,在使用分区键访问的情况下,由于具有更多可用于回答查询的副本节点,因此在提高复制因子方面还具有许多其他优点。但是,由于驱动程序有更多选择和更高的复制因子,因此两次向同一节点询问两次的可能性降低了。这样一来,您就不太可能在某些缓存中找到该行。

10-06 16:21