docs: update backup.md with multi-database and HTTP API docs
CI / test (push) Has been cancelled
CI / verify (push) Has been cancelled
Clients CI / build-server (push) Has been cancelled
Clients CI / test-python (push) Has been cancelled
Clients CI / test-javascript (push) Has been cancelled
Clients CI / test-nim (push) Has been cancelled
Clients CI / test-rust (push) Has been cancelled

This commit is contained in:
2026-05-25 18:49:26 +03:00
parent eb62b381a1
commit 0c7847abba
2 changed files with 253 additions and 275 deletions
+127 -138
View File
@@ -1,36 +1,125 @@
# Backup и Възстановяване # Backup и Възстановяване
BaraDB предоставя няколко стратегии за backup — от пълни snapshot-ове до инкрементални и online consistent backups. BaraDB предоставя няколко стратегии за backup — от пълни snapshot-ове до инкрементални, online consistent backups и multi-database архивиране.
> ⚠️ **Настройка с множество бази данни**
> BaraDB поддържа множество бази данни (`CREATE DATABASE`). Всяка база има собствена изолирана data директория (напр. `data/databases/<име>/`). Командите за backup, repair, checkpoint и migration работят върху **една директория наведнъж**. Ако използвате множество бази, пускайте командите за всяка база отделно или архивирайте цялата `data/databases/` директория.
## Архитектура ## Архитектура
``` ```
┌─────────────────────────────────────────┐ ┌─────────────────────────────────────────┐
│ Data Directory │ Data Root
── MANIFEST (atomic catalog) ── databases/
├── sstables/ (SSTable v3 CRC) ├── default/
│ ├── 1.sst ├── MANIFEST
│ │ ── 2.sst ── sstables/
│ └── wal/ └── wal/ │
│ ├── wal.log (активен сегмент) │ ├── mydb/
└── wal_archive/ (ротирани сегменти │ ├── MANIFEST │
│ │ ├── sstables/ │
│ │ └── wal/ │
│ └── ... │
└─────────────────────────────────────────┘ └─────────────────────────────────────────┘
``` ```
## Backup Инструмент ## Backup Инструмент
Backup инструментът е в `src/barabadb/core/backup.nim`. Компилирайте го преди употреба:
```bash ```bash
nim c -o:build/backup src/barabadb/core/backup.nim nim c -o:build/backup src/barabadb/core/backup.nim
``` ```
## SSTable Integrity (v3 CRC Footer) ## Multi-Database Backup (Препоръчително)
Всеки SSTable файл, записан от BaraDB, включва CRC32 footer: ### Архивиране на всички бази
```bash
./build/backup backup --all-databases --data-root=./data/databases --output=all_$(date +%s).tar.gz
```
Архивът съдържа:
- `backup.json` — метаданни (версия, timestamp, списък бази)
- `databases/<име>/` — всяка база със своя MANIFEST, SSTables и WAL
### Backup на единична база
```bash
./build/backup backup --database=default --data-root=./data/databases --output=default_$(date +%s).tar.gz
```
### Възстановяване на всички бази
```bash
./build/backup restore --input=all_1234567890.tar.gz --all-databases --data-root=./data/databases
```
### Възстановяване на единична база
```bash
./build/backup restore --input=default_1234567890.tar.gz --database=default --data-root=./data/databases
```
## Legacy Single-Directory Backup
За обратна съвместимост със стари инсталации (една база в `data/server`):
```bash
./build/backup backup --data-dir=./data/server --output=legacy_$(date +%s).tar.gz
./build/backup restore --input=legacy_1234567890.tar.gz --data-dir=./data/server
```
## Инкрементален Backup
```bash
./build/backup incremental --database=default --data-root=./data/databases --output=inc_$(date +%s).tar.gz
```
Включва само:
- `MANIFEST`
- Активни SSTables (от MANIFEST)
- Текущ WAL (`wal/wal.log`)
- WAL архив (`wal/wal_archive/*.log`)
Всички SSTables се **проверяват с CRC** преди архивиране.
## Online Consistent Backup
```bash
./build/backup backup --online --database=default --data-root=./data/databases --output=online_$(date +%s).tar.gz
```
Еквивалентно на:
1. `checkpoint` (freeze memtable, flush, rotate WAL)
2. `incremental backup`
Безопасно за пускане докато сървърът работи.
## HTTP API Backup
Backup/restore е достъпен и през REST API (изисква admin JWT токен):
```bash
# Backup на всички бази
curl -X POST http://localhost:9912/backup \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"all": true}'
# Backup на единична база
curl -X POST http://localhost:9912/backup \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"database": "default"}'
# Списък с архиви
curl http://localhost:9912/backups \
-H "Authorization: Bearer <token>"
# Restore
curl -X POST http://localhost:9912/restore \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"input": "backup_1234567890.tar.gz", "all": true}'
```
## SSTable Integrity (v3 CRC Footer)
``` ```
[Header] 36 байта [Header] 36 байта
@@ -43,36 +132,18 @@ nim c -o:build/backup src/barabadb/core/backup.nim
dataCrc32, indexCrc32, bloomCrc32, reserved dataCrc32, indexCrc32, bloomCrc32, reserved
``` ```
Това позволява независима проверка на всеки SSTable:
```bash
# Чрез Nim API
import barabadb/storage/lsm
let (ok, msg) = verifySSTable("data/databases/default/sstables/1.sst")
```
## Storage Repair (`baradadb repair`) ## Storage Repair (`baradadb repair`)
При съмнение за повреда, пуснете repair инструмента за конкретна база данни:
```bash ```bash
# Dry run — само преглед # Dry run — само преглед
./build/baradadb repair --data-dir=./data/databases/default --dry-run ./build/baradadb repair --data-dir=./data/databases/default --dry-run
# Пълен ремонт — проверка, преместване на битите файлове, WAL replay # Пълен ремонт
./build/baradadb repair --data-dir=./data/databases/default ./build/baradadb repair --data-dir=./data/databases/default
``` ```
**Какво прави repair:**
1. Сканира всички `sstables/*.sst` и проверява CRC
2. Премества корумпираните SSTables в `<data-dir>/corrupt/`
3. Пуска WAL replay за възстановяване на незаписани данни
4. Докладва резултати
## MANIFEST Каталог ## MANIFEST Каталог
Файлът `MANIFEST` е единственият източник на истина за активните SSTables. Обновява се атомично при всеки flush и compaction.
```json ```json
{ {
"version": 1, "version": 1,
@@ -84,137 +155,55 @@ let (ok, msg) = verifySSTable("data/databases/default/sstables/1.sst")
} }
``` ```
Предимства:
- **Консистентен изглед** — няма orphan SSTables след crash
- **Бързо стартиране** — зарежда от MANIFEST вместо scan на директория
- **Откриване на orphans** — `checkStorageConsistency()` докладва излишни/липсващи файлове
При настройка с множество бази данни, всяка база поддържа собствен независим MANIFEST в своята data директория.
## WAL Ротация
Write-Ahead Log се ротира при достигане на 64MB:
```
wal/wal.log → активен сегмент
wal/wal_archive/
├── wal.000001.log
├── wal.000002.log
└── wal.000003.log
```
Ротацията се случва:
- На всеки 1000 WAL записа (лека проверка на размер)
- При всеки `flush` / `checkpoint`
## Checkpoint ## Checkpoint
Checkpoint създава консистентна граница на storage без спиране на сървъра:
```bash ```bash
./build/baradadb checkpoint --data-dir=./data/databases/default ./build/baradadb checkpoint --data-dir=./data/databases/default
``` ```
**Как работи:** **Как работи:**
1. Freeze на memtable (swap към immutable, нов memtable за writes) 1. Freeze на memtable (< 1ms)
2. Flush на frozen memtable към SSTable 2. Flush към SSTable
3. Ротация на WAL 3. Ротация на WAL
4. Запис на MANIFEST 4. Запис на MANIFEST
Freeze-ът отнема **< 1ms**; flush-ът продължава паралелно с writes.
## Backup Команди
> Компилирайте backup инструмента първо: `nim c -o:build/backup src/barabadb/core/backup.nim`
### Пълен Backup (tar.gz)
```bash
./build/backup backup --data-dir=./data/databases/default --output=backup_$(date +%s).tar.gz
```
Архивира цялата data директория на посочената база данни.
### Инкрементален Backup
```bash
./build/backup incremental --data-dir=./data/databases/default --output=backup_inc_$(date +%s).tar.gz
```
Включва само:
- `MANIFEST`
- Активни SSTables (от MANIFEST)
- Текущ WAL (`wal/wal.log`)
- WAL архив (`wal/wal_archive/*.log`)
Всички SSTables се **проверяват с CRC** преди архивиране.
### Online Consistent Backup
```bash
./build/backup backup --online --data-dir=./data/databases/default --output=backup_online_$(date +%s).tar.gz
```
Еквивалентно на:
1. `checkpoint`
2. `incremental backup`
Безопасно за пускане докато сървърът работи. Checkpoint-ът създава консистентен snapshot, след което инкременталният backup го архивира.
## Миграция на SSTable Версии ## Миграция на SSTable Версии
Ако имате legacy v1/v2 SSTables, мигрирайте ги към v3 за всяка база данни:
```bash ```bash
# Преглед
./build/baradadb migrate --data-dir=./data/databases/default --dry-run ./build/baradadb migrate --data-dir=./data/databases/default --dry-run
# Миграция
./build/baradadb migrate --data-dir=./data/databases/default ./build/baradadb migrate --data-dir=./data/databases/default
``` ```
Миграцията пренаписва всеки legacy SSTable в текущия v3 формат (CRC footer) и обновява MANIFEST.
## Процедури за Възстановяване ## Процедури за Възстановяване
### Сценарий 1: Открит е Корумпиран SSTable ### Сценарий 1: Корумпиран SSTable
```bash ```bash
# Repair премества битите файлове и пуска WAL replay
./build/baradadb repair --data-dir=./data/databases/default ./build/baradadb repair --data-dir=./data/databases/default
# Проверка на консистентност
./build/baradadb repair --data-dir=./data/databases/default --dry-run
``` ```
### Сценарий 2: Възстановяване от Backup (Единична База) ### Сценарий 2: Възстановяване от Multi-Database Backup
```bash ```bash
# Спиране на сървъра # 1. Разархивиране
# Разархивиране на backup в директорията на базата ./build/backup restore --input=backup_latest.tar.gz --all-databases --data-root=./data/databases
tar -xzf backup_1234567890.tar.gz -C ./data/databases/default
# Рестарт — LSMTree зарежда от MANIFEST # 2. Repair за всяка база
./build/baradadb
```
### Сценарий 3: Възстановяване на Всички Бази
Ако сте архивирали цялото `data/databases/` дърво:
```bash
# 1. Разархивиране на последния backup
tar -xzf backup_latest.tar.gz -C ./data
# 2. Repair за всяка база за replay на наличния WAL
for db in ./data/databases/*/; do for db in ./data/databases/*/; do
./build/baradadb repair --data-dir="$db" --dry-run ./build/baradadb repair --data-dir="$db" --dry-run
done done
# 3. Стартиране на сървъра # 3. Стартиране
./build/baradadb ./build/baradadb
``` ```
### Сценарий 3: Ръчно разархивиране
```bash
tar -xzf backup_latest.tar.gz -C ./data
# Архивът съдържа: databases/<име>/ + backup.json
```
## Изисквания за Съхранение ## Изисквания за Съхранение
| Тип Backup | Размер | Честота | Задържане | | Тип Backup | Размер | Честота | Задържане |
@@ -225,9 +214,9 @@ done
## Най-добри Практики ## Най-добри Практики
1. **Пускайте repair след некоректно спиране**`./build/baradadb repair` 1. **Използвайте `--all-databases`** за пълен backup в multi-DB сетъп
2. **Мигрирайте legacy SSTables**`./build/baradadb migrate` 2. **Тествайте възстановяването редовно** — Backup, който не може да бъде възстановен, е безполезен
3. **Тествайте възстановяването редовно** — Backup, който не може да бъде възстановен, е безполезен 3. **Пускайте repair след некоректно спиране**
4. **Използвайте incremental + checkpoint** — За чести консистентни snapshot-ове 4. **Съхранявайте backups извън локацията** — S3, GCS или друг сървър
5. **Съхранявайте backups извън локацията** — S3, GCS или друг сървър 5. **Използвайте incremental + checkpoint** — За чести консистентни snapshot-ове
6. **Следете MANIFEST sequence** — Трябва да расте монотонно с flush-овете 6. **Мониторирайте `/backups` endpoint** — През админ панела или API
+126 -137
View File
@@ -1,36 +1,125 @@
# Backup & Recovery # Backup & Recovery
BaraDB provides multiple backup strategies ranging from full snapshots to incremental and online consistent backups. BaraDB provides multiple backup strategies ranging from full snapshots to incremental, online consistent backups, and multi-database archiving.
> ⚠️ **Multi-Database Setup**
> BaraDB supports multiple databases (`CREATE DATABASE`). Each database has its own isolated data directory (e.g. `data/databases/<name>/`). Backup, repair, checkpoint, and migration commands operate on **one directory at a time**. If you use multiple databases, run the commands for each database separately or back up the entire `data/databases/` parent directory.
## Architecture ## Architecture
``` ```
┌─────────────────────────────────────────┐ ┌─────────────────────────────────────────┐
│ Data Directory │ Data Root
── MANIFEST (atomic catalog) ── databases/
├── sstables/ (SSTable v3 CRC) ├── default/
│ ├── 1.sst ├── MANIFEST
│ │ ── 2.sst ── sstables/
│ └── wal/ └── wal/ │
│ ├── wal.log (active segment) │ ├── mydb/
└── wal_archive/ (rotated segments │ ├── MANIFEST
│ │ ├── sstables/ │
│ │ └── wal/ │
│ └── ... │
└─────────────────────────────────────────┘ └─────────────────────────────────────────┘
``` ```
## Backup Tool ## Backup Tool
The backup tool is shipped as `src/barabadb/core/backup.nim`. Build it before use:
```bash ```bash
nim c -o:build/backup src/barabadb/core/backup.nim nim c -o:build/backup src/barabadb/core/backup.nim
``` ```
## SSTable Integrity (v3 CRC Footer) ## Multi-Database Backup (Recommended)
Every SSTable file written by BaraDB includes a CRC32 footer: ### Backup all databases
```bash
./build/backup backup --all-databases --data-root=./data/databases --output=all_$(date +%s).tar.gz
```
The archive contains:
- `backup.json` — metadata (version, timestamp, database list)
- `databases/<name>/` — each database with its MANIFEST, SSTables, and WAL
### Backup a single database
```bash
./build/backup backup --database=default --data-root=./data/databases --output=default_$(date +%s).tar.gz
```
### Restore all databases
```bash
./build/backup restore --input=all_1234567890.tar.gz --all-databases --data-root=./data/databases
```
### Restore a single database
```bash
./build/backup restore --input=default_1234567890.tar.gz --database=default --data-root=./data/databases
```
## Legacy Single-Directory Backup
For backward compatibility with older installations (single database in `data/server`):
```bash
./build/backup backup --data-dir=./data/server --output=legacy_$(date +%s).tar.gz
./build/backup restore --input=legacy_1234567890.tar.gz --data-dir=./data/server
```
## Incremental Backup
```bash
./build/backup incremental --database=default --data-root=./data/databases --output=inc_$(date +%s).tar.gz
```
Includes only:
- `MANIFEST`
- Active SSTables (from MANIFEST)
- Current WAL (`wal/wal.log`)
- WAL archive (`wal/wal_archive/*.log`)
All SSTables are **CRC-verified** before archiving.
## Online Consistent Backup
```bash
./build/backup backup --online --database=default --data-root=./data/databases --output=online_$(date +%s).tar.gz
```
Equivalent to:
1. `checkpoint` (freeze memtable, flush, rotate WAL)
2. `incremental backup`
Safe to run while the server is running.
## HTTP API Backup
Backup/restore is also available via REST API (requires admin JWT token):
```bash
# Backup all databases
curl -X POST http://localhost:9912/backup \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"all": true}'
# Backup single database
curl -X POST http://localhost:9912/backup \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"database": "default"}'
# List backups
curl http://localhost:9912/backups \
-H "Authorization: Bearer <token>"
# Restore
curl -X POST http://localhost:9912/restore \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"input": "backup_1234567890.tar.gz", "all": true}'
```
## SSTable Integrity (v3 CRC Footer)
``` ```
[Header] 36 bytes [Header] 36 bytes
@@ -43,36 +132,18 @@ Every SSTable file written by BaraDB includes a CRC32 footer:
dataCrc32, indexCrc32, bloomCrc32, reserved dataCrc32, indexCrc32, bloomCrc32, reserved
``` ```
This enables independent verification of each SSTable:
```bash
# Via Nim API
import barabadb/storage/lsm
let (ok, msg) = verifySSTable("data/databases/default/sstables/1.sst")
```
## Storage Repair (`baradadb repair`) ## Storage Repair (`baradadb repair`)
If corruption is suspected, run the repair tool against a specific database directory:
```bash ```bash
# Dry run — preview only # Dry run — preview only
./build/baradadb repair --data-dir=./data/databases/default --dry-run ./build/baradadb repair --data-dir=./data/databases/default --dry-run
# Full repair — verify, move corrupt files, replay WAL # Full repair
./build/baradadb repair --data-dir=./data/databases/default ./build/baradadb repair --data-dir=./data/databases/default
``` ```
**What repair does:**
1. Scans all `sstables/*.sst` and verifies CRC
2. Moves corrupt SSTables to `<data-dir>/corrupt/`
3. Replays WAL to recover unflushed committed data
4. Reports results
## MANIFEST Catalog ## MANIFEST Catalog
The `MANIFEST` file is the single source of truth for active SSTables. It is updated atomically on every flush and compaction.
```json ```json
{ {
"version": 1, "version": 1,
@@ -84,129 +155,40 @@ The `MANIFEST` file is the single source of truth for active SSTables. It is upd
} }
``` ```
Benefits:
- **Consistent view** — no orphan SSTables after crash
- **Fast startup** — load from MANIFEST instead of directory scan
- **Orphan detection** — `checkStorageConsistency()` reports extra/missing files
In a multi-database setup, each database maintains its own independent MANIFEST inside its data directory.
## WAL Rotation
The Write-Ahead Log rotates when it reaches 64MB:
```
wal/wal.log → active segment
wal/wal_archive/
├── wal.000001.log
├── wal.000002.log
└── wal.000003.log
```
Rotation happens:
- Every 1000 WAL entries (lightweight size check)
- On every `flush` / `checkpoint`
## Checkpoint ## Checkpoint
A checkpoint creates a consistent storage boundary without stopping the server:
```bash ```bash
./build/baradadb checkpoint --data-dir=./data/databases/default ./build/baradadb checkpoint --data-dir=./data/databases/default
``` ```
**How it works:** **How it works:**
1. Freeze memtable (swap to immutable, new memtable for writes) 1. Freeze memtable (< 1ms)
2. Flush frozen memtable to SSTable 2. Flush to SSTable
3. Rotate WAL 3. Rotate WAL
4. Write MANIFEST 4. Write MANIFEST
The freeze takes **< 1ms**; the flush proceeds concurrently with writes.
## Backup Commands
> Build the backup tool first: `nim c -o:build/backup src/barabadb/core/backup.nim`
### Full Backup (tar.gz)
```bash
./build/backup backup --data-dir=./data/databases/default --output=backup_$(date +%s).tar.gz
```
Archives the entire data directory of the specified database.
### Incremental Backup
```bash
./build/backup incremental --data-dir=./data/databases/default --output=backup_inc_$(date +%s).tar.gz
```
Includes only:
- `MANIFEST`
- Active SSTables (from MANIFEST)
- Current WAL (`wal/wal.log`)
- WAL archive (`wal/wal_archive/*.log`)
All SSTables are **CRC-verified** before archiving.
### Online Consistent Backup
```bash
./build/backup backup --online --data-dir=./data/databases/default --output=backup_online_$(date +%s).tar.gz
```
Equivalent to:
1. `checkpoint`
2. `incremental backup`
Safe to run while the server is running. The checkpoint creates a consistent snapshot, then the incremental backup archives it.
## SSTable Version Migration ## SSTable Version Migration
If you have legacy v1/v2 SSTables, migrate them to v3 per database:
```bash ```bash
# Preview
./build/baradadb migrate --data-dir=./data/databases/default --dry-run ./build/baradadb migrate --data-dir=./data/databases/default --dry-run
# Migrate
./build/baradadb migrate --data-dir=./data/databases/default ./build/baradadb migrate --data-dir=./data/databases/default
``` ```
Migration rewrites each legacy SSTable with the current v3 format (CRC footer) and updates the MANIFEST.
## Recovery Procedures ## Recovery Procedures
### Scenario 1: Corrupt SSTable Detected ### Scenario 1: Corrupt SSTable
```bash ```bash
# Repair moves corrupt files and replays WAL
./build/baradadb repair --data-dir=./data/databases/default ./build/baradadb repair --data-dir=./data/databases/default
# Verify consistency
./build/baradadb repair --data-dir=./data/databases/default --dry-run
``` ```
### Scenario 2: Restore from Backup (Single Database) ### Scenario 2: Restore from Multi-Database Backup
```bash ```bash
# Stop the server # 1. Extract
# Extract backup into the database directory ./build/backup restore --input=backup_latest.tar.gz --all-databases --data-root=./data/databases
tar -xzf backup_1234567890.tar.gz -C ./data/databases/default
# Restart — LSMTree loads from MANIFEST # 2. Repair each database
./build/baradadb
```
### Scenario 3: Restore All Databases
If you back up the entire `data/databases/` tree:
```bash
# 1. Extract latest backup
tar -xzf backup_latest.tar.gz -C ./data
# 2. Run repair for each database to replay any available WAL
for db in ./data/databases/*/; do for db in ./data/databases/*/; do
./build/baradadb repair --data-dir="$db" --dry-run ./build/baradadb repair --data-dir="$db" --dry-run
done done
@@ -215,6 +197,13 @@ done
./build/baradadb ./build/baradadb
``` ```
### Scenario 3: Manual extraction
```bash
tar -xzf backup_latest.tar.gz -C ./data
# Archive contains: databases/<name>/ + backup.json
```
## Storage Requirements ## Storage Requirements
| Backup Type | Size | Frequency | Retention | | Backup Type | Size | Frequency | Retention |
@@ -225,9 +214,9 @@ done
## Best Practices ## Best Practices
1. **Run repair after unclean shutdown**`./build/baradadb repair` 1. **Use `--all-databases`** for full backups in multi-DB setups
2. **Migrate legacy SSTables**`./build/baradadb migrate` 2. **Test restores regularly** — A backup you can't restore is useless
3. **Test restores regularly** — A backup you can't restore is useless 3. **Run repair after unclean shutdown**
4. **Use incremental + checkpoint** — For frequent consistent snapshots 4. **Store backups offsite** — S3, GCS, or another server
5. **Store backups offsite** — S3, GCS, or another server 5. **Use incremental + checkpoint** — For frequent consistent snapshots
6. **Monitor MANIFEST sequence** — Should grow monotonically with flushes 6. **Monitor `/backups` endpoint** — Via admin panel or API