Select Count(*)会影响Cassandra的写操作吗?



我经历过这样一个场景:每分钟对一个表执行一次select count(*)(是的,这绝对应该避免),导致Cassandra的写入量大幅增加,达到每秒150K左右。

谁能解释一下这种奇怪的行为?为什么Select查询会显著增加Cassandra中的写计数?

谢谢!

如果你勾选

org.apache.cassandra.metrics:type=ReadRepair,name=RepairedBackground

org.apache.cassandra.metrics:type=ReadRepair,name=RepairedBlocking

度量,您可以查看它的读取修复发送突变。如果数据不一致,读取所有数据来服务计数(*)可能会导致大量的读取修复。在这种情况下,降低桌面上的read_repair_chancedclocal_read_repair_chance (ALTER TABLE)可以降低负载。

其他可能的情况有:

  • 您已启用跟踪(全局或在表中)作为某些%。
  • 或者如果你使用DSE并且启用了慢速查询

在更新的写入路径中可以找到一个可能的解释:

在写过程中,Cassandra将每一个新行添加到数据库中,而不检查是否存在重复记录。此策略使得数据库中可能存在同一行的多个版本。

然后

大多数Cassandra安装将每一行的副本存储在两个或多个节点上。每个节点独立执行压缩。这意味着,即使已从一个节点删除了行的过时版本,它们仍可能存在于另一个节点上。

最后:

这就是为什么Cassandra在读过程中执行另一轮比较。当客户端请求具有特定主键的数据时,Cassandra从一个或多个副本中检索该行的多个版本。

最新更新