Грабли и антипаттерны

В теории LSM-деревья идеальны для записи. Но на практике, если пустить всё на самотёк, база может «встать колом» или сожрать весь диск. Вот шпаргалка по самым частым проблемам с продакшена и способам их лечения.

Частые грабли и как их лечить
Проблема Симптом на проде В чем проблема Чек-лист решения
Write Stall (Затор) Запросы COMMIT застревают дольше 1 секунды, графики latency улетают в космос. Уровень L0 переполнен. Фоновые потоки компакции не успевают «перемолоть» файлы, и база блокирует новые записи. 1) Добавить CPU для потоков компакции; 2) Поднять лимит slowdown_writes_trigger; 3) Использовать быструю гибридную компрессию (LZ4).
Space Amp > 1.5× Место на дисках тает быстрее, чем растет реальный объем данных. Слишком много мертвых файлов. Долгие живые tombstones и устаревшие файлы ждут своей очереди на компакцию. 1) Включить Periodic full-compaction; 2) Если данные временные — использовать TTL-шардирование.
Компакция жрёт CPU top показывает 80% системной нагрузки при простаивающем диске. Неограниченный rate компакции и единый тред-пул для всех задач БД. 1) Поставить compaction_thread_priority=LOW; 2) Выделить отдельный пул для Flush-операций; 3) Включить rate_limiter для диска.
Out-of-space crash База падает с ошибкой «Unable to compact». В LSM (особенно Size-Tiered) для слияния двух файлов по 10 ГБ нужно временно еще 20 ГБ свободного места. Вы прозевали алерты. Настроить жесткий алерт на < 15% Free Space. Если места нет — временно переключить на Universal компакцию или отключить автокомпакцию.

Пример тормозящей компакции

Где LSM — это плохая идея

Для начала введем несколько терминов

  • Endurance (Выносливость SSD): Предельный объем перезаписей, который физически выдержит диск до того, как начнет сыпаться. Измеряется в TBW (Терабайт записано) или DWPD (Перезаписей диска в день).
  • Long-range scan: Запрос, который затрагивает такой огромный диапазон ключей (например, «все логи за год»), что фильтры Блума становятся бесполезны, и базе приходится читать файлы целиком, байт за байтом.

LSM — не серебряная пуля. Вот ситуации, когда стоит вернуться к B+ Tree или взять колоночную базу:

  1. OLAP-запросы и скан миллионов ключей (long-range scan)
    1. Почему больно: Большая часть данных лежит в самом нижнем, огромном уровне. При диапазонном чтении придется линейно пролистать гигантский файл.
    2. Что брать: Колоночные базы. Они умеют обрубать ненужные колонки и мгновенно прыгать по блокам благодаря мета-статистике.
  2. Точечные чтения без горячего кэша
    1. Почему больно: Чтобы найти один случайный ключ на холодном диске, LSM придется дернуть фильтры Блума и индексы на каждом уровне. Это много операций чтения (Read Amp).
    2. Что брать: B+ Tree. Оно делает ровно один бинарный спуск O(log N) и читает одну страницу диска. Средняя латентность будет ниже.
  3. Крошечный датасет на дешевом SSD (low endurance)
    1. Почему больно: На маленьких объемах вы не почувствуете плюсов от скорости вставки LSM. Зато огромный Write Amplification будет постоянно перезаписывать ячейки вашего накопителя. Ресурс дешевого диска сгорит в разы быстрее.
    2. Что брать: Классические базы на B-Tree (PostgreSQL, MySQL), они бережнее относятся к небольшим объемам.