Dual-write to old and new, backfill history in the background, use CDC to catch up the tail, verify with shadow reads, then flip reads atomically — with a rollback path at every step. You never take the app down; you run both databases in parallel until the new one is provably identical, then cut over.
Architecture
┌── write ──▶ OLD DB (source of truth) ──CDC (Debezium)──┐
App ───┤ ▼
└── write ──▶ NEW DB ◀──── backfill job (historical rows)
│
shadow reads (compare OLD vs NEW) ─▶ diff metrics ─▶ atomic cutover ─▶ NEW is truth
(flip flag; rollback = flip back)
