Для Кассандры вся записанная информация неизменяема. Это означает, что когда у вас есть операция удаления (явная с оператором удаления или с предложением Time To Live [TTL
]), база данных добавит еще одну запись со специальным флагом с именем tombstone. Все эти записи останутся в базе данных, пока не истечет gc_grace_seconds
периодов; по умолчанию 10 дней.
В вашем случае движок обнаружил, что большинство полученных записей были удалены, но они все еще ждут прохождения gc_grace_seconds, чтобы позволить сжатию вернуть пространство. Один из возможных вариантов решения проблемы — уменьшить gc_grace_seconds
для этой таблицы.
Для получения дополнительной информации см. эта статья из Last Pickle.
это означает, что из 5745474 извлеченных записей 10 оказались полезными, а 5745464 помечены для удаления. Такое количество надгробий будет иметь серьезные негативные последствия при чтении.
10 не надгробные данные? только 5745464
правильно, эти 10 записей действительно пригодны для чтения данных. Остальные 5,7 миллиона записей были извлечены, но найдены помеченными как удаленные, поэтому их нельзя использовать; этот флаг надгробие
Еще одна важная вещь, о которой следует помнить при работе с Cassandra, заключается в том, что ячейки надгробий не связаны напрямую с удалениями.
Когда вы вставляете значение null
в атрибут при выполнении вставки, Cassandra внутренне помечает этот атрибут/ячейку как надгробную плиту. Таким образом, даже если у вас не происходит большого количества удалений, вы можете получить огромное количество надгробий. Легкое и простое решение — не вставлять значения null
для атрибута при вставке.
Согласно этому утверждению Read 10 live and 5645464 tombstones cells in keyspace.table
, может быть сканирование таблицы для запроса, который сканирует 10
ячеек и 5645464
количество надгробий (ячеек со значением null
), при этом я предполагаю, что это так. Необходимо понять, какие типы запросов выполняются, чтобы лучше понять это.
что значит 10 живых? а 5645464?
Чтобы это звучало просто, если у вас есть запрос типа select * from keyspace.table where id = 'abc' and cluster_key_with_int_value > 10 limit 10
, то cassandra просканирует диапазон вашей таблицы и зарегистрирует приведенное выше утверждение. Где 10 — допустимое количество строк, а 5645464
— количество надгробий, обнаруженных при сборе ваших 10 строк.
Да, но что значит "10 живых 5745464 надгробий"?