我经历过这样一个场景:每分钟对一个表执行一次select count(*)(是的,这绝对应该避免),导致Cassandra的写入量大幅增加,达到每秒150K左右。
谁能解释一下这种奇怪的行为?为什么Select查询会显著增加Cassandra中的写计数?谢谢!
如果你勾选
org.apache.cassandra.metrics:type=ReadRepair,name=RepairedBackground
和
org.apache.cassandra.metrics:type=ReadRepair,name=RepairedBlocking
度量,您可以查看它的读取修复发送突变。如果数据不一致,读取所有数据来服务计数(*)可能会导致大量的读取修复。在这种情况下,降低桌面上的read_repair_chance
和dclocal_read_repair_chance
(ALTER TABLE
)可以降低负载。
其他可能的情况有:
- 您已启用跟踪(全局或在表中)作为某些%。
- 或者如果你使用DSE并且启用了慢速查询
在更新的写入路径中可以找到一个可能的解释:
然后在写过程中,Cassandra将每一个新行添加到数据库中,而不检查是否存在重复记录。此策略使得数据库中可能存在同一行的多个版本。
大多数Cassandra安装将每一行的副本存储在两个或多个节点上。每个节点独立执行压缩。这意味着,即使已从一个节点删除了行的过时版本,它们仍可能存在于另一个节点上。
最后:
这就是为什么Cassandra在读过程中执行另一轮比较。当客户端请求具有特定主键的数据时,Cassandra从一个或多个副本中检索该行的多个版本。