| Author: Abdullah Ahmed | Category: Software Consulting
The migration rehearsal finishes successfully. The new application starts, the copied database passes a row-count check, and the team can sign in. Then someone asks what happens to an order submitted through a partner connection while traffic is switching. The room goes quiet.
Business continuity depends on the behaviour of the whole transaction, including data changes, background jobs, external integrations, and recovery. Keeping a web server reachable is only one part of planning a zero-downtime migration.
Treat zero downtime as an engineering objective with a defined scope, not an unconditional promise. Some systems can support uninterrupted operations through a staged transition. Others need a brief restriction on particular writes, an agreed degraded mode, or a maintenance window. The planning work should expose that distinction early.
Define continuity in business terms
List the operations that must remain available: accepting an order, checking a balance, booking an appointment, publishing an update, or recording a completed job. Specify what users should experience if a dependency is temporarily unavailable. A durable acknowledgement that work is queued may be acceptable for one process and unacceptable for another.
Separate availability from correctness. A service that returns success while losing an update has not preserved the business operation. Likewise, a migration that keeps reads available but prevents urgent changes may still breach the agreed continuity requirement.
Agree on acceptable delay, permitted degradation, and data-loss tolerance with the process owner. Record how each will be measured during the change. Avoid relying on a single infrastructure uptime percentage to represent several very different business outcomes.
Include internal users. Staff may need exports, reconciliation reports, or approval tools even when customer-facing pages work. A migration plan should state which capabilities are protected at each phase and who can approve a temporary limitation.
Map everything that writes to the system
The main application is rarely the only writer. Scheduled jobs, partner feeds, support scripts, administrative tools, and data pipelines may update the same records. Find them through configuration, logs, code searches, and conversations with operational teams.
For each writer, record the interface, owner, schedule, credentials, and retry behaviour. A nightly import can remain invisible during a daytime rehearsal and still corrupt the new state after cutover. A partner may retry an old request long after your own client has moved.
Trace outbound effects too. Emails, payment instructions, shipment requests, and exported files cannot always be undone by restoring a database. Decide which component owns each effect during coexistence so that old and new workers do not both perform it.
Build a dependency map with named responsibilities. It need not be elaborate, but it should let the migration lead answer who controls a connection and how to pause or redirect it. Unknown ownership is a concrete readiness problem.
Choose the unit of migration
Moving an entire application at once concentrates coordination into one event. Moving a bounded capability, tenant group, or read path can reduce the initial scope, provided the data model and routing support that separation.
A tenant-by-tenant migration may work when tenant data is independently owned. It becomes harder when tenants share stock, billing, or cross-account reporting. Follow the actual business relationships rather than assuming that a convenient routing key creates a safe boundary.
For each unit, define how requests reach the correct implementation and how staff identify its current location. Keep routing decisions stable for the duration of a transaction. Switching halfway through a multi-step operation can expose incompatible state.
Use a small but representative first cohort. Selecting only inactive accounts gives limited evidence about order updates, concurrent edits, and background processing. The first live group should exercise relevant behaviour while keeping the potential disruption manageable.
Expand compatibility before switching behaviour
Old and new application versions may need to coexist. A schema change that immediately removes a field can break the old version before traffic has fully moved. Compatibility planning therefore belongs ahead of deployment scheduling.
Danilo Sato's explanation of parallel change describes an expand, migrate, and contract sequence. Add support for the new interface, move consumers, and remove the old interface after migration. The same planning principle is useful when coordinating application and data changes, although the database-specific operations still need their own validation.
For example, introduce a new structured address representation while retaining the old fields that existing consumers require. Decide how values are populated and reconciled during the transition. Only remove the old representation once every relevant reader and writer has moved and the rollback window has closed.
Test compatibility in both directions. Can the new code read records produced by the old code? Can the old code tolerate records produced after the new release? A deployment rollback is useful only if the previous application can still operate on the current data.
Plan data movement as an ongoing process
An initial copy captures one point in time. If the source continues accepting changes, the target must receive the subsequent inserts, updates, and deletions before it becomes authoritative. Define the mechanism, ordering assumptions, and evidence used to establish that it has caught up.
Change capture or application-level replication can support this work, but neither removes the need to understand transactions. Several related records may represent one business change. Applying only part of that change can produce a target state that looks populated but is not usable.
Monitor replication lag in terms meaningful to the cutover. A timestamp alone may hide a stuck partition or skipped record. Track errors and progress markers, and reconcile selected business aggregates as well as record counts.
Protect the source from the backfill. Large reads can compete with live traffic, and target writes can overwhelm shared infrastructure. Rehearse with realistic volumes, introduce rate controls, and define when to pause copying if customer operations deteriorate.
Avoid casual dual writes
Writing to the old and new systems from one request sounds simple until one write succeeds and the other fails. Retrying the entire request can create duplicates or overwrite a more recent value. Before choosing dual writes, define the authority and recovery protocol.
Prefer a design with one authoritative writer for a given record at a time, with controlled replication to the other system. If the business requires multiple active writers, the conflict rules need to be explicit and tested. That is a larger design commitment than a temporary migration script.
Distinguish moving reads from moving writes. Read traffic can sometimes be compared against both implementations without changing ownership. Transferring writes changes where new truth originates and therefore changes what rollback requires.
Maintain a migration ledger that identifies each moved unit, its source checkpoint, validation state, and authority owner. This is more useful during an incident than a general statement that the migration is “mostly complete.”
Reconcile meaning, not just row counts
Equal counts do not prove equivalent business state. A date conversion may shift an appointment, a status mapping may reopen a cancelled order, or a missing relationship may disconnect an invoice from its customer.
Create checks around business invariants: every active order belongs to a valid account, totals reconcile within the agreed rules, completed jobs retain their completion dates, and permission assignments remain correct. Include deleted or inactive records where their history matters.
Use representative sampled comparisons for complex objects alongside automated totals. Ask operational staff to inspect cases they recognise, especially exceptions. Their judgement can expose semantic mistakes that a schema-level comparison misses.
Record discrepancies with an owner and disposition. Some differences may be intentional cleanup; others must block cutover. The migration lead should not have to decide during the live change whether an unexplained mismatch is acceptable.
Rehearse the actual cutover sequence
A rehearsal should exercise the runbook, access permissions, monitoring, and communications as well as the software. Use a production-like environment and data volumes where possible, with appropriate protection for sensitive information.
- Confirm the migration unit, responsible people, and stop conditions.
- Verify target health, compatibility, replication progress, and reconciliation results.
- Control or drain affected writers and establish the final ownership checkpoint.
- Switch routing and resume operations through the new owner.
- Verify representative business transactions and watch for delayed failures.
- Record the outcome and maintain the agreed rollback capability.
The exact sequence depends on the architecture. Some designs can transfer ownership without pausing writes; others require a bounded queue or short restriction. The rehearsal must prove the chosen mechanism rather than relying on a generic checklist.
Time each activity and identify operations that require special access. A missing permission or an unavailable partner contact can dominate the change window. Keep the runbook commands specific enough to execute, with an independent check for dangerous steps.
Distinguish rollback from recovery after new writes
Before the new system accepts authoritative writes, switching traffic back may be relatively straightforward. After new writes occur, the old system may be stale or unable to represent the new data. Redirecting traffic alone can lose work.
Define the point at which simple rollback ends. Beyond it, the plan may require reverse replication, a reconciled data transfer, or a forward fix. Test whichever route you claim to support, including what happens to external effects already performed.
Make rollback conditions observable: a sustained increase in failed business transactions, unexplained reconciliation differences, or an integration that cannot complete within its operating deadline. Assign one person authority to call the stop and another to execute the data recovery steps.
Keep the old environment protected during the observation period. Prevent accidental writes from reactivating competing ownership. Retaining an old database is not sufficient if forgotten jobs or credentials can still change it.
Budget for coexistence and operational attention
A staged migration temporarily carries two systems, additional telemetry, reconciliation jobs, and support work. Include those costs in the project plan. Compressing the coexistence period without evidence can save infrastructure expense while increasing operational risk.
Reserve staff capacity for the days after cutover. Delayed jobs, month-end processing, and infrequent partner workflows may reveal problems after initial smoke tests pass. Decide which business cycle must complete before the migration is considered stable.
Train support staff to distinguish old and new paths and to locate the relevant transaction evidence. Customer reports often arrive with a reference number and a symptom, not an architecture diagram. The support workflow should connect those clues to the migration ledger.
Communicate any planned degradation plainly. If a report will lag or an administrative function will temporarily queue changes, staff need to know the expected behaviour and escalation route. Silence turns a controlled limitation into an apparent incident.
Walk an order through the ownership transfer
Consider an illustrative ordering service moving from an older database to a replacement. During the initial copy, the old service remains the only writer. Changes are captured and applied to the target, while a comparison process checks selected orders and business totals.
The team next sends a limited set of read requests to the new implementation. A disagreement is recorded without changing the authoritative order. This stage can expose mapping and query problems, but it does not yet prove that the new write path is ready.
For the write transfer, the team uses its rehearsed mechanism to stop the old owner accepting new operations for the chosen cohort, drain or durably queue in-flight requests, establish a final replication checkpoint, and enable the new owner. The exact mechanism may introduce a brief delay; the agreed continuity objective determines whether that is acceptable.
Suppose a partner retries an order request during this transition. A stable business operation identifier must allow the active owner to determine whether the order already exists. Routing and data synchronisation should preserve that evidence. Otherwise, the migration can produce a duplicate even though both implementations behave correctly in isolation.
Now suppose the new service accepts an address change and then fails. The recovery plan must account for that new write before the old service resumes authority. This is the scenario to rehearse when someone describes rollback as simply changing a load-balancer setting.
Use a cutover evidence sheet
Keep the live decision compact: current owner, last verified checkpoint, outstanding discrepancies, representative transaction results, and whether the simple rollback window remains open. Link detailed logs and reconciliation reports rather than copying everything into the sheet.
Record the person making each ownership decision and the time it takes effect. This helps support staff interpret requests that cross the change period and gives the recovery team an agreed reference when reconstructing events.
A second person should verify the critical preconditions before the transition. The check should confirm actual system state, not merely that a runbook box was ticked. For example, verify the old scheduled worker is stopped through its operating evidence rather than assuming a command succeeded.
Include long-lived work in the rehearsal
Sessions, uploads, exports, and background tasks may outlive a deployment. Decide whether they complete on the old version, resume on the new version, or restart through a controlled mechanism. Preserve the user's ability to identify their work.
Test a request that begins before cutover and completes afterward. Include external callbacks arriving after the originating application has moved. These cases expose hidden assumptions about shared memory, temporary storage, and callback routing.
Document any work that must finish before retirement. A monthly settlement or infrequent export can depend on old state long after routine traffic has moved. Completion criteria should include those dependencies rather than relying only on a short period of normal web traffic.
Retire the old path deliberately
Decommissioning is part of completion. Confirm that no consumers use the old endpoints, no jobs depend on the old schema, and required historical access has a supported replacement. Remove obsolete credentials and stop paying for infrastructure once the retention and recovery decisions permit it.
Keep the evidence needed to explain the transition: reconciliation outcomes, cutover checkpoints, unresolved issues, and ownership decisions. Store it where future maintainers can find it. A migration that succeeds technically but leaves no operational history creates avoidable uncertainty later.
The most useful next step is a continuity workshop around one real transaction. Follow it from arrival through storage, downstream effects, and recovery. If the team can explain how that transaction survives each migration phase, the zero-downtime objective is becoming an implementable plan.