cobalt
Встроенное key-value хранилище типа LSM на Zig. Свежие записи попадают в skiplist на WAL, сбрасываются в неизменяемые SSTable, а место освобождается leveled-compaction.
Встраиваемое LSM-хранилище ключ-значение на Zig. Свежие записи попадают в skiplist поверх журнала WAL, затем сбрасываются в неизменяемые SSTable, а место возвращает leveled-compaction. Это фундамент, на котором стоят современные базы данных.
Введение
У современных баз данных, которыми вы пользуетесь каждый день, почти всегда под капотом одна и та же форма движка. cobalt существует, чтобы эта форма перестала быть черным ящиком: он реализует весь путь записи LSM от журнала до compaction, на Zig, языке, который не прячет от вас ни одного байта и ни одной аллокации.
Это не еще одна база для продакшена, а разобранный на части движок, в котором видно каждое решение. Как только вы сами напишете WAL, memtable, SSTable и compaction, RocksDB и Cassandra перестают быть магией и становятся знакомыми вариантами одной и той же идеи.
Почему LSM, а не B-дерево
Классические базы пишут на месте, обновляя страницы B-дерева, что означает случайные записи по диску. LSM идет иначе: каждая запись - это дописывание. Новые данные летят в структуру в памяти, а более старые слои лежат неизменными на диске. Благодаря этому записи быстрые и последовательные, потому что последовательную запись диск любит больше всего.
Цена ясна и осознанна: одни и те же данные могут существовать сразу в нескольких местах, и их приходится сливать позже. Все искусство LSM в том, чтобы платить этот долг в фоне, не замедляя записи, которые его создают.
Путь записи, шаг за шагом
запись сначала попадает в журнал, поэтому переживет внезапное отключение, прежде чем попасть куда-либо еще.
свежие данные сидят в отсортированной структуре в памяти, готовые к быстрому чтению.
когда память заполняется, skiplist сбрасывается в неизменяемый отсортированный файл на диске.
leveled-compaction сливает файлы между уровнями, удаляет перезаписанные версии и возвращает место.
Порядок этих шагов не случаен. WAL идет первым именно потому, что гарантирует сохранность до того, как данные дойдут до летучей памяти. Будь порядок обратным, отключение питания между записью в память и журналом означало бы тихую потерю данных.
Compaction - это сердце, которое отличает работающий LSM от такого, что со временем задыхается. Без него файлы SSTable нарастают бесконечно, а чтению приходится просматривать все больше слоев. Leveled-compaction сливает их между уровнями, выбрасывая по пути перезаписанные версии и возвращая место, занятое мертвыми данными.
Ту же форму движка, WAL плюс memtable плюс SSTable плюс compaction, вы найдете в RocksDB, LevelDB и Cassandra. Разница между ними - в основном настройка одних и тех же кубиков, а не другая архитектура.
Конец черного ящика
Самая большая выгода cobalt - не само хранилище, а то, что большие базы данных перестают быть тайной. Пройдя весь путь от дописывания в журнал до возврата места в compaction, вы точно знаете, почему LSM быстр на записи и где он платит за это на чтении.
Слои движка и где они еще живут
| Слой | Роль | Где еще |
|---|---|---|
| WAL | сохранность записи | любая серьезная база |
| Memtable (skiplist) | свежие данные в памяти | RocksDB, LevelDB |
| SSTable | неизменяемые файлы на диске | Cassandra, LevelDB |
| Compaction | возврат места, слияние | RocksDB, Cassandra |
Больше проектов
Другие работы из той же категории - посмотрите, как мы решаем похожие задачи.
Есть похожий проект?
Напишите нам - смета бесплатна и приходит в течение часа.



