All chapters in this track
- 01Chapter 1: Why Reliability and Scale Matter
- 02Chapter 2: Reliability Vocabulary: SLAs, SLOs, SLIs, and Error Budgets
- 03Chapter 3: Redundancy and Fault Tolerance: Eliminating Single Points of Failure
- 04Chapter 4: Horizontal vs. Vertical Scaling, and Load Balancing/Auto-Scaling
- 05Chapter 5: Caching for Scale: Cache Stampede and Invalidation at Scale
- 06Chapter 6: Database Scaling: Replication, Partitioning, Read Replicas, Connection Pooling
- 07Chapter 7: Resilience Patterns: Timeouts, Retries, Circuit Breakers, Bulkheads, Load Shedding
- 08Chapter 8: Observability: Metrics, Logging, Distributed Tracing, and Actionable Alerts
- 09Chapter 9: Incident Response: Severity, Incident Command, Communication, Blameless Postmortems
- 10Chapter 10: Chaos Engineering: Proactively Testing for Failure
- 11Chapter 11: Capacity Planning and Load Testing
- 12Chapter 12: Core Trade-offs: Consistency vs. Availability, Cost vs. Redundancy, Simplicity vs. Resilience
- 13Chapter 13: Incident Case Study: The Cascading Failure
- 14Chapter 14: Incident Case Study: The Silent Data Corruption
- 15Chapter 15: Common Interview Questions About Reliability and Scaling
Chapter 3 of 15
Chapter 3: Redundancy and Fault Tolerance: Eliminating Single Points of Failure
Why this matters
The companion System Design book's Chapter 12 introduced redundancy and failover at the component level. This chapter goes further: redundancy needs to be applied across multiple, independent dimensions simultaneously, because a system redundant in one dimension but not another still has a real single point of failure — just a less obvious one.
Redundancy across multiple, independent dimensions
[BEGINNER] A system with multiple server instances (redundant at the instance level) can still fail entirely if all those instances happen to be in the same physical data center that loses power — this is redundancy that looks complete but isn't, because it doesn't account for a failure dimension one level up:
Instance-level redundancy only:
Server 1 (Data Center A) + Server 2 (Data Center A) + Server 3 (Data Center A)
-- redundant against a SINGLE SERVER failing, but NOT against
Data Center A losing power/network/cooling entirely.
Multi-AZ (Availability Zone) redundancy:
Server 1 (AZ-1) + Server 2 (AZ-2) + Server 3 (AZ-3)
-- redundant against a single AZ's infrastructure failing entirely,
since AZs are physically/logically isolated from each other.
Multi-region redundancy:
Full deployment in Region A + full deployment in Region B
-- redundant against an entire REGION becoming unavailable (a
region-wide cloud provider outage, a natural disaster affecting
a whole geographic area) -- the highest, most expensive tier.
[SENIOR INSIGHT] Each additional dimension of redundancy protects against a real, if progressively rarer, failure mode — and each additional dimension has a real, escalating cost (more infrastructure, more complexity, potentially cross-region data synchronization challenges directly connecting to Chapter 12's CAP-theorem-driven consistency trade-offs). This is exactly Chapter 2's calibration principle in concrete form: multi-region redundancy is genuinely warranted for a system where a full regional outage would be catastrophic; it's disproportionate, unjustified cost for a system whose SLO doesn't require surviving that specific, rare failure mode.
N+1 versus N+2 redundancy
[BEGINNER] N+1 redundancy means having exactly one more unit of capacity than the minimum needed — if 3 servers are needed to handle load, run 4, so that one can fail while the remaining 3 still handle full load. N+2 redundancy provides an additional margin — running 5, so that even with one server down for maintenance and a second server failing unexpectedly, the system still has enough capacity.
N+1: 3 needed + 1 spare = 4 running. Tolerates ONE failure at a time.
N+2: 3 needed + 2 spare = 5 running. Tolerates a PLANNED maintenance
removal AND a simultaneous, unplanned failure -- a real, if less
common, scenario worth explicitly planning for in systems where
that combination's occurrence would be genuinely catastrophic.
[IN PRACTICE] The choice between N+1 and N+2 (or higher) is, again, a direct application of Chapter 2's SLO-driven calibration: a system targeting "three nines" typically doesn't need N+2's extra margin; a system targeting "five nines," where even a rare combination of planned maintenance and unplanned failure occurring simultaneously would meaningfully threaten the target, often does.
Fault tolerance versus fault avoidance
[SENIOR INSIGHT] It's worth distinguishing two related but different strategies precisely: fault avoidance tries to prevent failures from happening at all (rigorous testing, careful code review, high-quality components) — valuable, but can never reduce failure probability to exactly zero, since some failures (hardware degradation, an unforeseeable edge case, a natural disaster) are outside any amount of avoidance effort's control. Fault tolerance (this chapter's actual focus) accepts that failures will happen regardless of avoidance effort, and designs the system to continue operating correctly despite them. A mature reliability practice needs both — fault avoidance reduces how often fault tolerance mechanisms need to activate, but fault tolerance is what actually determines whether an inevitable failure becomes a user-visible outage or a non-event.
Fault avoidance: rigorous testing (companion SDLC book, Chapter 7),
code review (companion Code Reviews book), careful deployment practices
(companion System Design book, Chapter 9) -- reduces failure FREQUENCY.
Fault tolerance: redundancy, failover, graceful degradation (companion
System Design book, Chapter 12), circuit breakers (Chapter 7 of this
book) -- reduces failure IMPACT, given that failures will still occur
despite avoidance efforts.
Common mistakes
- Achieving redundancy at only one dimension (instance-level) while remaining vulnerable at a higher dimension (data center, region), producing a system that looks well-protected but retains a real, if less obvious, single point of failure.
- Choosing N+1 redundancy for a system whose availability target genuinely requires N+2's margin (or the reverse — over-provisioning N+2 for a system that doesn't need it) without connecting the choice to Chapter 2's SLO-driven calibration.
- Investing exclusively in fault avoidance (more testing, more review) while neglecting fault tolerance, leaving the system with no good way to handle the failures that avoidance efforts inevitably fail to prevent.
- Investing exclusively in fault tolerance while neglecting fault avoidance, unnecessarily activating expensive failover/redundancy mechanisms for failures that better testing or review practices could have prevented from occurring in the first place.
Discussion / interview questions
-
"Why might a system with multiple redundant server instances still have a single point of failure?" Strong answer: If all instances are redundant only at the instance level but share a higher-level dependency (the same data center, the same availability zone), a failure at that higher level (power outage, AZ-wide infrastructure failure) takes down every instance simultaneously — redundancy needs to be applied across the specific dimension that matters for the failure modes actually being protected against.
-
"What's the difference between N+1 and N+2 redundancy, and when would you choose one over the other?" Strong answer: N+1 provides exactly one spare unit of capacity, tolerating a single failure at a time; N+2 provides two, tolerating a planned maintenance removal combined with a simultaneous unplanned failure — the choice should be driven by the system's actual availability target (Chapter 2), not chosen arbitrarily.
-
"What's the difference between fault avoidance and fault tolerance, and why does a mature reliability practice need both?" Strong answer: Fault avoidance reduces how often failures happen (testing, code review, careful deployment); fault tolerance determines what happens when a failure occurs anyway (redundancy, failover, graceful degradation) — avoidance can never reach zero failure probability, so tolerance is what actually determines whether an inevitable failure becomes a user-visible outage.
-
"Would every system benefit from multi-region redundancy?" Strong answer: No — multi-region redundancy has a real, significant cost (infrastructure, cross-region data synchronization complexity, consistency trade-offs) that's only justified for systems whose availability target genuinely requires surviving a full regional outage; applying it uniformly regardless of actual need is disproportionate, unjustified cost.
Chapter summary / cheat sheet
- Redundancy must be applied across the specific dimension(s) relevant to the failure modes being protected against (instance, availability zone, region) — redundancy at one dimension doesn't protect against failure at a higher one.
- N+1 tolerates one failure at a time; N+2 tolerates a planned removal plus a simultaneous unplanned failure — the choice should be driven by the system's actual SLO (Chapter 2), not chosen arbitrarily.
- Fault avoidance (reduce failure frequency: testing, review) and fault tolerance (reduce failure impact: redundancy, failover) are complementary, not substitutes for each other — a mature practice needs both.
- Every dimension and tier of redundancy has a real, escalating cost that should be justified by genuine business need and the system's actual reliability target, not applied uniformly or chosen for its own sake.