根据cassandra的日志(见下文),由于tombstones存在太多,查询将被中止.发生这种情况是因为每周一次我用一个太低的计数器清理(删除)行.这会'删除' 数十万行(用a标记它们tombstone.)
如果在此表中由于节点在清理过程中出现故障而重新出现已删除的行,那么完全没有问题,因此我将gc grace time单个受影响的表设置为10小时(从默认的10天开始),以便逻辑删除的行可以相对快速地永久删除.
无论如何,我必须设置tombstone_failure_threshold极高以避免以下异常.(一亿,高达十万.)我的问题是,这有必要吗?我完全不知道什么类型的查询被中止; 插入,选择,删除?
如果只是某些选择被中止,那就不是那么大了.但是假设中止意味着"上限",因为查询过早停止并返回它在找到太多墓碑之前收集的任何实时数据.
好吧,要问它更简单; 当tombstone_failure_threshold超过时会发生什么?
INFO [HintedHandoff:36] 2014-02-12 17:44:22,355 HintedHandOffManager.java (line 323) Started hinted handoff for host: fb04ad4c-xxxx-4516-8569-xxxxxxxxx with IP: /XX.XX.XXX.XX
ERROR [HintedHandoff:36] 2014-02-12 17:44:22,667 SliceQueryFilter.java (line 200) Scanned over 100000 tombstones; query aborted (see tombstone_fail_threshold)
ERROR [HintedHandoff:36] 2014-02-12 17:44:22,668 CassandraDaemon.java (line 187) Exception in thread Thread[HintedHandoff:36,1,main]
org.apache.cassandra.db.filter.TombstoneOverwhelmingException
at org.apache.cassandra.db.filter.SliceQueryFilter.collectReducedColumns(SliceQueryFilter.java:201)
at org.apache.cassandra.db.filter.QueryFilter.collateColumns(QueryFilter.java:122)
at org.apache.cassandra.db.filter.QueryFilter.collateOnDiskAtom(QueryFilter.java:80)
at org.apache.cassandra.db.filter.QueryFilter.collateOnDiskAtom(QueryFilter.java:72)
at org.apache.cassandra.db.CollationController.collectAllData(CollationController.java:297)
at org.apache.cassandra.db.CollationController.getTopLevelColumns(CollationController.java:53)
at org.apache.cassandra.db.ColumnFamilyStore.getTopLevelColumns(ColumnFamilyStore.java:1516)
at org.apache.cassandra.db.ColumnFamilyStore.getColumnFamily(ColumnFamilyStore.java:1335) …Run Code Online (Sandbox Code Playgroud)