Today the engine migrates into search and serving stores — OpenSearch,
Elasticsearch, Meilisearch, and Redis. Relational targets (PostgreSQL,
MySQL) are on the connector roadmap.
How the mechanics make it safe
The ordering is what removes the downtime, and it is worth understanding:- The replication cursor is captured first. Before any data is read, the engine records its position in the source’s change stream (creating the replication slot, binlog position, or change-stream token).
- Bootstrap streams the existing data. Every current row flows through the same projection and delivery code as live changes — same document shapes, same deterministic ids — at bulk speed (measured up to ~1M documents/minute into Meilisearch; see Performance).
- Tailing resumes from the captured cursor. Anything written during the bootstrap was retained by the source’s log and is replayed after it. Nothing that happened mid-copy is lost, and replays are harmless: deterministic ids make every write idempotent.
- The cursor only advances on sink-confirmed durability, so a crash at any point resumes exactly — never skipping, never duplicating.
Cutover
Cutover is a client-side switch, not a data operation:- Watch the pipeline until it is tailing with near-zero cursor age
(
ventstreamctl agents statusin managed mode, or the engine’s health endpoint standalone). - Point readers at the new store. The pipeline keeps both sides in sync while old readers drain, so the switch can be gradual — per service, per tenant, or behind a flag.
- When nothing reads the old path anymore, stop the pipeline (or keep it: a permanently-synced projection is the same pipeline left running).
Rollback
Because the source was never modified, rollback is pointing readers back at it. The migration pipeline can keep running throughout — the target simply stays warm for the next attempt.Run it
The quickstart is the migration recipe — a minimal config withbootstrap: mode: snapshot performs steps 1–3 automatically: