Apache Cassandra · Apache Cassandra 5.0
Netflix сначала хранил всю историю просмотров клиента в одной строке Cassandra с ключом CustomerId, каждый просмотр — отдельная колонка. Записей примерно в 9 раз больше, чем чтений.
Пока подписчиков было меньше и истории короче, схема работала. Через несколько лет у активных клиентов набрались тысячи просмотров, чтение всей истории замедлилось, а компакция переписывала большие строки снова и снова.
Интерфейсу почти всегда нужны недавние просмотры, полная история — редко (страница «История», рекомендации раз в сутки).
В работе: Временные ряды на пользователя: история заказов, просмотров, транзакций за много лет.
Источник: Netflix Tech Blog: Scaling Time Series Data Storage, Part I, 2018. Условие пересказано своими словами.
Какое изменение модели Netflix в итоге выбрал?
- Разделить историю на «живую» несжатую часть с недавними просмотрами и сжатую архивную часть, которую фоновая задача пополняет и хранит чанками
- Добавить вторичный индекс на дату просмотра
- Увеличить gc_grace_seconds и включить ALLOW FILTERING для чтения истории
- Перенести историю в одну большую партицию на страну