Автор, работавший раньше над инструментами для клонирования баз данных, вспомнил старую идею и решил собрать свою версию PlanetScale для дома. Проект называется Homescale. Он создаёт копии баз данных «на лету» из неизменяемых снапшотов, не копируя всю базу целиком.
В основе — модель из Docker. Есть образ (image) — неизменяемая отправная точка. Контейнер (container) — копия, в которую уже можно писать. Ветка (branch) — ещё один контейнер, созданный из текущего состояния существующего контейнера. CLI выглядит просто: создаёшь образ, потом контейнер из образа, подключаешься. Ветка создаётся одной командой. Пока примеры на Postgres, но модель не привязана к конкретной БД — любой движок, хранящий состояние на файловой системе поверх блочного устройства, подойдёт.
Главная фишка — разделение хранилища и вычислений. База данных видит обычный блочный девайс, но живёт он сам по себе. Это позволяет создавать хранилище до запуска БД, держать его после остановки и, что важнее, делать ветвление на уровне хранилища, не требуя от самой БД ничего про поддержку веток.
Волшебство называется copy-on-write (COW). Когда Homescale создаёт клон, новый контейнер читает данные родителя, а свои изменения пишет отдельно, не трогая исходник. Ветка от 100 ГБ базы не требует ещё 100 ГБ места сразу — только метаданные. Реальный расход пойдёт, когда данные начнут расходиться.
Под капотом используется Ceph и его RBD (RADOS Block Device). Ceph даёт нужные операции: неизменяемые снапшоты и клоны на основе COW. Homescale через rbd команду делает снимок, защищает его и клонирует. Вся эта механика скрыта от пользователя.
Управляет всем Kubernetes. Сам Homescale — это контроллер, который создаёт поды с БД, PVC и VolumeSnapshot ресурсы. За работу с Ceph отвечают Ceph CSI и Rook. Разработка идёт локально на macOS в однонодовом кластере (Colima/Lima). Позже автор планирует задеплоить всё на свой Talos кластер на Hetzner Cloud, где можно сделать репликацию на три ноды — если диск или нода упадёт, данные не потеряются.
Следующая часть будет про сам сервис: API, контроллеры и адаптер для Postgres. Сначала — путь образа (инициализация Postgres и снятие неизменяемого снапшота) и контейнера (клонирование, запуск БД, ожидание готовности). Потом — ветвление от работающего контейнера с подготовкой снапшота и клонированием.