askill
dual-write

dual-writeSafety 92Repository

Dual write (double write) migration pattern for safely transitioning between data stores. Use when planning or implementing database migrations, switching storage backends, migrating to new schemas, or reviewing code that writes to multiple systems simultaneously.

14 stars
1.2k downloads
Updated last week

Package Files

Loading files...
SKILL.md

Dual Write Migration Pattern

Dual write keeps two data stores in sync by writing to both the old and new system on every mutation. This enables gradual migration with rollback safety.

When to Use This Skill

Use this skill when...Use shadow-mode instead when...
Migrating between databases or schemasValidating read-path behavior under real traffic
Switching storage backends (SQL to NoSQL, etc.)Testing a new service without writing to it
Need both systems to stay authoritative during transitionOnly need to compare responses, not persist data
Planning zero-downtime data migrationsMirroring traffic to a staging environment
Reviewing code that writes to multiple data storesEvaluating performance of a replacement system

Core Concepts

Migration Phases

PhasePrimary readsPrimary writesSecondary writesDuration
1. PrepareOldOldNoneSetup
2. Dual writeOldOld + NewNew (async or sync)Migration window
3. BackfillOldOld + NewNewUntil parity
4. Shadow readOld + New (compare)Old + NewNewValidation
5. CutoverNewNewOld (optional)Transition
6. CleanupNewNewNoneFinal

Write Strategies

StrategyConsistencyLatency impactFailure mode
SynchronousStrongHigher (2x write)Fail if either store fails
Async secondaryEventualMinimalSecondary may lag
Outbox patternEventualMinimalRequires message broker
Change data captureEventualNone (DB-level)Requires CDC infrastructure

Implementation Architecture

Synchronous Dual Write

Client Request
    │
    ▼
┌─────────────┐
│  Application │
│    Layer     │
└──────┬──────┘
       │ write(data)
       ▼
┌─────────────┐
│  Dual Write  │
│  Adapter     │
├──────┬──────┤
│      │      │
▼      │      ▼
Old DB │   New DB
       │
   Compare on
   read (optional)

Key Components

ComponentResponsibility
Write adapterRoutes writes to both stores, handles failures
Read comparatorReads from both, logs discrepancies, returns primary
Backfill jobCopies historical data from old to new store
ReconciliationDetects and resolves drift between stores
Feature flagsControls which phase is active per entity/tenant

Implementation Patterns

Write Adapter Pattern

The write adapter wraps both stores behind a single interface:

  1. Accept the write request
  2. Write to the primary (old) store first
  3. Write to the secondary (new) store
  4. If secondary fails: log the failure, enqueue for retry, do not fail the request
  5. Return the primary store's result to the caller

Read Comparison Pattern

During the shadow read phase:

  1. Read from the primary (old) store — this is the authoritative response
  2. Read from the secondary (new) store asynchronously
  3. Compare results field by field
  4. Log discrepancies with context (entity ID, field, old value, new value)
  5. Return the primary store's result
  6. Track comparison metrics (match rate, common divergence fields)

Backfill Strategy

  1. Snapshot the old store at a known point in time
  2. Begin dual writes for all new mutations
  3. Copy historical records in batches (oldest first or by priority)
  4. Track backfill progress per entity type
  5. Reconcile records modified during backfill (dual write wins over backfill)

Failure Handling

Failure scenarioResponseRecovery
Secondary write failsLog, continue, enqueue retryAsync retry with backoff
Primary write failsFail the request (do not write to secondary)Standard error handling
Both failFail the requestStandard error handling
Secondary write timeoutLog, continueAsync verification and repair
Inconsistency detectedLog with full contextManual or automated reconciliation

Consistency Guarantees

  • Primary store is always the source of truth until cutover
  • Secondary store may lag during async dual write
  • Reconciliation jobs detect and repair drift
  • Cutover only happens when match rate reaches threshold (e.g., 99.9%)

Cutover Decision Criteria

MetricThresholdHow to measure
Read comparison match rate> 99.9%Shadow read comparison logs
Backfill completion100%Backfill progress tracker
Secondary write success rate> 99.95%Write adapter metrics
P99 latency impact< 20% increaseApplication metrics
Reconciliation gap0 unresolvedReconciliation job output

Common Pitfalls

PitfallMitigation
Ordering issues between storesUse idempotent writes, include version/timestamp
Transaction boundaries differDesign writes to be independently valid
Schema mismatch between storesMap fields explicitly, handle nullability differences
Backfill conflicts with live writesLive dual writes take precedence over backfill
Performance degradationStart with async secondary writes
Partial failures leave inconsistencyReconciliation job as safety net
Forgetting to dual-write in all code pathsCentralize through write adapter, audit call sites

Rollback Plan

PhaseRollback actionData impact
Dual writeStop writing to new storeNo data loss
Shadow readStop comparing readsNo data loss
Cutover (reads)Switch reads back to oldNo data loss if still dual-writing
Cutover (writes)Reverse write orderMay need reconciliation
CleanupCannot rollbackOld store decommissioned

Monitoring Checklist

  • Write success rate per store
  • Write latency per store (P50, P95, P99)
  • Read comparison match rate
  • Backfill progress percentage
  • Reconciliation queue depth
  • Error rate by failure type
  • Feature flag state per tenant/entity

Agentic Optimizations

ContextApproach
Code reviewCheck that all write paths go through the dual-write adapter
Architecture reviewVerify failure handling, rollback plan, and cutover criteria
ImplementationStart with write adapter + async secondary, add comparison later
TestingSimulate secondary failures, verify primary is unaffected

Quick Reference

TermDefinition
Primary storeThe authoritative data store (old system during migration)
Secondary storeThe new data store being migrated to
BackfillCopying historical data from primary to secondary
ReconciliationDetecting and repairing differences between stores
CutoverSwitching the primary designation from old to new
Match ratePercentage of shadow reads that return identical results
Write adapterAbstraction layer that routes writes to both stores

Install

Download ZIP
Requires askill CLI v1.0+

AI Quality Score

94/100Analyzed 2/24/2026

Excellent skill document covering the dual-write migration pattern comprehensively. Well-structured with clear when-to-use guidance, migration phases, implementation patterns, failure handling, cutover criteria, and monitoring. Uses tables and diagrams effectively. The content is generic industry knowledge applicable to any database migration, despite being in a repo-specific path. High actionability and completeness make it highly useful for implementing or reviewing dual-write migrations.

92
95
90
95
95

Metadata

Licenseunknown
Version-
Updatedlast week
Publisherlaurigates

Tags

databaseobservability