Я создаю простую службу HTTP, в которой хранятся произвольные двоичные объекты. Сервис поддерживается Cassandra. Это упрощенная версия Amazon S3. Система должна выдерживать большую нагрузку записи и должна быть высокодоступной на пути записи и чтения.
Сохраненные данные являются своего рода неизменяемыми. Его можно удалить, но нельзя обновить. Таким образом, несогласованность данных не является проблемой. Хранилище данных должно иметь возможность эффективно удалять старые данные.
Сервис использует библиотеку Netflix Astyanax, которая предоставляет рецепт для хранения (больших) бинарных объектов в Cassandra.
Я вижу два решения проблемы, у каждого из которых есть свои плюсы и минусы. Мне трудно оценить, какой образ больше подходит Кассандре.
Одна таблица с TTL
Astyanax автоматически разбивает большие объекты на мелкие части и сохраняет их в одной таблице. Каждому большому двоичному объекту назначается TTL, который истечет через определенный период времени. Запуск уплотнения удаляет большие двоичные объекты по истечении срока жизни.
Эти решения работают и довольно просты в реализации. Я начал использовать SizeTieredCompactionStrategy
, но думаю, что DateTieredCompactionStrategy
может быть лучшим выбором при работе с данными TTL.
Меня больше всего беспокоит: сможет ли уплотнение Кассандры сохраниться? Есть ли у кого-нибудь опыт с подобным вариантом использования?
Разделение данных по времени
Другим подходом было бы разделение данных по времени. Я мог бы создать таблицу на каждый день и хранить куски в этой таблице. В этом случае я могу удалить всю таблицу, чтобы избавиться от просроченных данных.
Это решение требует немного больше усилий при реализации, но упрощает и, возможно, ускоряет удаление просроченных данных.
Насколько эффективна Кассандра в удалении стола?