Надгробия создаются в Cassandra всякий раз, когда вы удаляете какие-то данные. Проще говоря, надгробные плиты в значительной степени аналогичны строке данных, которые вы только что удалили, с добавлением специального маркера «удаления», который сообщает базе данных, что данные были удалены.

Итак, допустим, у вас есть строка A в вашей таблице, и вы удаляете эту строку, как если бы вы удаляли любые строки в реляционных или нереляционных базах данных. Вместо того, чтобы немедленно удалить эти данные, Cassandra просто добавляет к ним «маркер удаления» и сообщает вам, что данные были удалены.

«Маркер удаления» включает некоторую информацию о самой операции удаления, например, что было удалено и когда произошло удаление.

Технически, допустим, вы удалили строку данных размером 2 МБ. Вы ожидаете, что освободите эти 2 МБ при удалении данных. Вместо этого Cassandra в значительной степени создает некоторые новые метаданные с маркером удаления, который увеличивает пространство, которое ваши «удаленные» данные теперь занимают на диске.

Это довольно нелогично. Посмотрим, почему Кассандра это делает.

Удаляет без надгробий

Распределенная природа Кассандры затрудняет удаление. Как Cassandra хранит данные, одни и те же фрагменты данных реплицируются на нескольких узлах. Таким образом, даже если вы думаете, что у вас только одна строка данных, в мире Кассандры эта строка реплицируется на нескольких отдельных машинах.

Когда вы вводите команду удаления, Cassandra «удаляет» данные с одной машины (или с любым другим коэффициентом записи) и подтверждает, что удаление выполнено успешно. Ему не терпится подтвердить, что все потенциальные копии данных на разных машинах были удалены. Если бы это было так, запись в Cassandra была бы безумно медленной.

Таким образом, он подтверждает успешную запись и в фоновом режиме сообщает другим хостам, что вы удалили данные, так что все хосты находятся на одной странице.

На мгновение представим, что Кассандра сразу же удалила данные. Также предположим, что ваши данные реплицируются в 3 разных узлах. Теперь предположим, что при общении с другими узлами, что эта машина удалила ваши данные, связь не работает. Теперь один узел удалил ваши данные, тогда как два других узла все еще имеют данные.

Теперь предположим, что вы выполняете чтение тех же данных, и у вас есть коэффициент чтения, равный 3. Теперь это чтение сбивает с толку! У двух ваших узлов есть данные, а один говорит, что данных нет. Что вы делаете? Кассандра всегда предполагает, что правильнее всего будет вернуть данные, поэтому в конечном итоге она вернет вам данные, которые уже были удалены. Эти данные называются «зомби» или «призраками».

Надгробия - способ обойти эту проблему. Посмотрим как.

Как работают надгробия

Надгробие - это особые данные, которые хранятся вместе с данными, которые вы только что удалили. Он содержит информацию об операции удаления, например, когда удаление было выполнено.

Когда вы удаляете некоторые данные, все, что делает Кассандра, - это вставляет надгробие. Затем он сообщает вам, что удаление было успешным.

Предположим, вы читаете те же данные через несколько минут. При чтении Cassandra запрашивает данные со всех узлов, на которых они реплицируются. Затем он возвращает вам результат самой последней записи.

Последняя (самая последняя) запись в этом случае - это удаленное событие или надгробие. Итак, Кассандра знает, что, хотя другие узлы не знают, что данные были удалены, самой последней записью было удаление. Следовательно, Кассандра вам ничего не вернет. Он будет уважать удаление.

Как долго хранятся надгробия

Cassandra выполняет запланированную операцию, называемую уплотнением, которую вы можете сравнить с операцией по техническому обслуживанию. Эта операция объединяет несколько копий одних и тех же данных на хосте и обеспечивает более высокую производительность будущих операций чтения.

Во время этого процесса обслуживания / ремонта Кассандра также занимается удалением надгробий. Частота выполнения этого действия настраивается, и вы сможете это контролировать.

Однако это не так просто, как запускать операцию каждые несколько секунд, чтобы избавиться от надгробных камней, потому что сжатие - дорогостоящий процесс и может повлиять на производительность чтения / записи в вашем кластере Cassandra, если вы запускаете его слишком часто.

Еще один забытый источник надгробий

Помимо удаления строк и разделов, есть еще одна очень странная операция, которая может привести к надгробным камням. Об этом очень легко забыть.

Удаление определенных значений столбца или явная установка значения столбца на NULL также могут привести к появлению надгробий. Их называют каменными надгробиями.

Таким образом, вы не хотите проектировать свою схему таким образом, чтобы вы явно записывали NULL в разные столбцы в очень интенсивном приложении. Если вы сделаете это, вы будете создавать надгробные камни каждый раз, когда будете писать запись с явным значением NULL в столбце.

Последние мысли

Хорошо знать о надгробиях, когда вы решаете использовать Cassandra, проектировать свои таблицы или даже писать API-интерфейсы для общения с Cassandra.

Есть команды CQL, которые вы можете запустить, чтобы понять, сколько надгробий находится в вашей базе данных, и вы можете вручную запустить процесс восстановления, чтобы избавиться от них. Все это необходимо учитывать, если вы решите поддерживать кластер Cassandra.