Skip to content

Multi-Database Sync

This is the whole point of walrust. One process, many databases, minimal memory.

Pass multiple database paths:

Terminal window
walrust watch \
/data/users.db \
/data/orders.db \
/data/analytics.db \
-b my-bucket

Or use a glob:

Terminal window
walrust watch /data/tenants/*.db -b my-bucket

For more control, use a config file:

[s3]
bucket = "my-bucket"
endpoint = "https://fly.storage.tigris.dev"
[[databases]]
path = "/data/users.db"
prefix = "users"
[[databases]]
path = "/data/orders.db"
prefix = "orders"
[[databases]]
path = "/data/tenants/*.db"
prefix = "tenants"

Then:

Terminal window
walrust watch --config walrust.toml

Each database gets its own prefix:

s3://my-bucket/
├── users/
│ ├── 00000001-00000001.ltx
│ └── manifest.json
├── orders/
│ ├── 00000001-00000001.ltx
│ └── manifest.json
└── tenants/
├── acme/
│ └── ...
└── globex/
└── ...

Here’s why you’re here:

DatabasesLitestreamWalrust
133 MB12 MB
10330 MB12 MB
1003.3 GB~15 MB

Walrust shares one S3 client and one file watcher across all databases. Each database adds ~500KB of state tracking. It’s basically free.

Restore any single database without touching the others:

Terminal window
walrust restore users -o /data/users-restored.db -b my-bucket
walrust restore tenants/acme -o /data/acme-restored.db -b my-bucket

Override settings per database in the config:

[[databases]]
path = "/data/critical.db"
prefix = "critical"
snapshot_interval = 300 # every 5 minutes
[[databases]]
path = "/data/logs.db"
prefix = "logs"
snapshot_interval = 3600 # every hour is fine

With glob patterns, walrust picks up new databases automatically:

[[databases]]
path = "/data/tenants/*.db"
prefix = "tenants"

New tenant shows up? New database file appears? Walrust starts backing it up. No restart needed.

(Okay, you might need to restart. But the config is ready for it.)