bythe.net
← К ленте
Проект

Litestream: как держать SQLite в проде и не бояться

Маленький демон читает WAL-журнал SQLite и потоком отправляет изменения в S3. Восстановление до любой секунды и бэкап, о котором можно забыть.

Проблема

SQLite — самая распространённая база данных в мире, но в веб-проектах её обычно боятся использовать в проде. Не из-за скорости: на одном сервере она обгоняет Postgres в большинстве типовых сценариев чтения. Страх в другом — файл базы лежит на диске, диск может умереть, и «сделать дамп по крону» звучит как план, пока не выясняется, что последний дамп был позавчера.

Что делает Litestream

Litestream — небольшая программа на Go, которая запускается рядом с приложением и следит за файлом базы. SQLite в режиме WAL пишет изменения в отдельный журнал, а Litestream читает этот журнал и отправляет сегменты в объектное хранилище: S3, любой S3-совместимый сервис, SFTP или просто другую директорию.

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

litestream restore -o app.db s3://my-bucket/app.db

Задержка репликации — секунды. Если сервер сгорел, вы теряете последние несколько секунд записи, а не сутки.

Конфигурация

Весь конфиг помещается в десяток строк:

dbs:
- path: /data/app.db
replicas:
- url: s3://my-bucket/app.db
retention: 72h

Запуск — litestream replicate, либо Litestream сам стартует приложение как дочерний процесс и следит за ним. В Docker это удобно: один контейнер, один entrypoint.

Чего Litestream не делает

Это не кластер и не многомастерная репликация. Писать по-прежнему может только один процесс на одной машине. Если нужен горячий резерв с чтением на нескольких узлах, смотрите в сторону LiteFS или полноценных серверных СУБД.

Ещё Litestream не заменит бэкап в другом регионе, если хранилище и сервер живут у одного провайдера и провайдер ляжет целиком. Но это уже вопрос о том, где лежат реплики, а не об инструменте.

Почему это важно

Связка «SQLite + Litestream» возвращает в моду самый простой деплой из возможных: один бинарник, один файл базы, один сервер. Без пула соединений, без миграции на managed-базу за деньги, без отдельного контейнера с Postgres, который тоже надо бэкапить.

Для контентных сайтов, внутренних инструментов, небольших SaaS и всего, что живёт на одной машине, это честный вариант. И с ним проще спать по ночам.

Войти, чтобы оценить материал

Комментарии

Войти, чтобы оставить комментарий