cobalt

Встроенное key-value хранилище типа LSM на Zig. Свежие записи попадают в skiplist на WAL, сбрасываются в неизменяемые SSTable, а место освобождается leveled-compaction.

cobalt
TL;DR

Встраиваемое LSM-хранилище ключ-значение на Zig. Свежие записи попадают в skiplist поверх журнала WAL, затем сбрасываются в неизменяемые SSTable, а место возвращает leveled-compaction. Это фундамент, на котором стоят современные базы данных.

Введение

У современных баз данных, которыми вы пользуетесь каждый день, почти всегда под капотом одна и та же форма движка. cobalt существует, чтобы эта форма перестала быть черным ящиком: он реализует весь путь записи LSM от журнала до compaction, на Zig, языке, который не прячет от вас ни одного байта и ни одной аллокации.

Это не еще одна база для продакшена, а разобранный на части движок, в котором видно каждое решение. Как только вы сами напишете WAL, memtable, SSTable и compaction, RocksDB и Cassandra перестают быть магией и становятся знакомыми вариантами одной и той же идеи.

Почему LSM, а не B-дерево

Классические базы пишут на месте, обновляя страницы B-дерева, что означает случайные записи по диску. LSM идет иначе: каждая запись - это дописывание. Новые данные летят в структуру в памяти, а более старые слои лежат неизменными на диске. Благодаря этому записи быстрые и последовательные, потому что последовательную запись диск любит больше всего.

Цена ясна и осознанна: одни и те же данные могут существовать сразу в нескольких местах, и их приходится сливать позже. Все искусство LSM в том, чтобы платить этот долг в фоне, не замедляя записи, которые его создают.

Путь записи, шаг за шагом

1
WAL

запись сначала попадает в журнал, поэтому переживет внезапное отключение, прежде чем попасть куда-либо еще.

2
Skiplist

свежие данные сидят в отсортированной структуре в памяти, готовые к быстрому чтению.

3
SSTable

когда память заполняется, skiplist сбрасывается в неизменяемый отсортированный файл на диске.

4
Compaction

leveled-compaction сливает файлы между уровнями, удаляет перезаписанные версии и возвращает место.

Порядок этих шагов не случаен. WAL идет первым именно потому, что гарантирует сохранность до того, как данные дойдут до летучей памяти. Будь порядок обратным, отключение питания между записью в память и журналом означало бы тихую потерю данных.

Compaction - это сердце, которое отличает работающий LSM от такого, что со временем задыхается. Без него файлы SSTable нарастают бесконечно, а чтению приходится просматривать все больше слоев. Leveled-compaction сливает их между уровнями, выбрасывая по пути перезаписанные версии и возвращая место, занятое мертвыми данными.

i
Примечание

Ту же форму движка, WAL плюс memtable плюс SSTable плюс compaction, вы найдете в RocksDB, LevelDB и Cassandra. Разница между ними - в основном настройка одних и тех же кубиков, а не другая архитектура.

Конец черного ящика

Самая большая выгода cobalt - не само хранилище, а то, что большие базы данных перестают быть тайной. Пройдя весь путь от дописывания в журнал до возврата места в compaction, вы точно знаете, почему LSM быстр на записи и где он платит за это на чтении.

Слои движка и где они еще живут

СлойРольГде еще
WALсохранность записилюбая серьезная база
Memtable (skiplist)свежие данные в памятиRocksDB, LevelDB
SSTableнеизменяемые файлы на дискеCassandra, LevelDB
Compactionвозврат места, слияниеRocksDB, Cassandra

Больше проектов

Другие работы из той же категории - посмотрите, как мы решаем похожие задачи.

Есть похожий проект?

Напишите нам - смета бесплатна и приходит в течение часа.