System Design for DevOps · Module 05
Reliability, Deployments and Migrations
Keep the system up while everything changes: separate high availability from disaster recovery with RPO and RTO, add resiliency patterns, release without downtime, and plan migrations with rehearsals, cut-over and rollback — including branch by abstraction and the strangler fig.
What you will learn
- Distinguish fault tolerance, high availability and disaster recovery and set RPO/RTO
- Apply timeouts, retries with backoff, circuit breakers and bulkheads
- Release with rolling, blue/green and canary deployments without downtime
- Plan a migration with rehearsals, DNS cut-over, roll-back and roll-forward
- Replace a legacy component step by step with branch by abstraction and the strangler fig
Lessons
- Fault Tolerance, High Availability and Disaster Recovery
High availability removes single points of failure so a component failure causes no outage; disaster recovery restores service after a large event such as a region loss. RPO and RTO set how much data and time you may lose, and drive the DR strategy.
- Resiliency Patterns: Timeouts, Retries, Circuit Breakers
Resiliency is the ability to absorb failures and recover; timeouts bound waiting, retries with exponential backoff and jitter handle transient errors, circuit breakers stop calling a failing dependency, and bulkheads keep one failure from consuming every resource.
- Zero-Downtime Deployments
Rolling updates replace instances gradually, blue/green switches all traffic between two full environments, and canary releases send a small share of traffic to the new version first; readiness probes, draining and backward-compatible changes make all of them safe.
- Planning a Migration: Rehearsal, Cut-over, Rollback
A migration moves a system to new infrastructure or a new database; good plans have a rehearsal, data sync, a defined cut-over (often by DNS), clear go/no-go criteria, and both roll-back and roll-forward paths.
- Branch by Abstraction and the Strangler Fig
Branch by abstraction replaces a component inside a codebase behind an interface while everyone keeps committing to main; the strangler fig replaces a whole system route by route behind a proxy until the old one can be switched off.