В соответствии с журналом cassandra (см. ниже) запросы прерываются из-за присутствия слишком большого количества tombstones
. Это происходит потому, что раз в неделю я очищаю строки с счетчиком, который слишком низок. Это "удаляет" сотни тысяч строк (маркирует их как таковые с помощью tombstone
.)
Это вовсе не проблема, если в этой таблице вновь удалена строка, потому что во время процесса очистки был отключен node, поэтому я установил 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)
at org.apache.cassandra.db.HintedHandOffManager.doDeliverHintsToEndpoint(HintedHandOffManager.java:351)
at org.apache.cassandra.db.HintedHandOffManager.deliverHintsToEndpoint(HintedHandOffManager.java:309)
at org.apache.cassandra.db.HintedHandOffManager.access$300(HintedHandOffManager.java:92)
at org.apache.cassandra.db.HintedHandOffManager$4.run(HintedHandOffManager.java:530)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Забыл упомянуть; версия Cassandra 2.0.4