Failure Modes & Fault Tolerance in Distributed Systems
What actually goes wrong when a node in a distributed system fails, and the two workhorse techniques — replication and checkpointing — used to survive it.
Intermediate
| Failure mode | What happens | Why it's easier or harder |
|---|---|---|
| Fail-stop | A node halts permanently, but other nodes can detect that it has stopped (e.g. via a heartbeat that stops responding). | Easiest — the failure is clean and detectable. |
| Crash | A node halts silently; other nodes can't immediately tell whether it's dead or just slow. | Harder — requires timeouts and health checks to distinguish "dead" from "delayed." |
| Omission | A node fails to send a message (send omission) or fails to receive/acknowledge one (receive omission). | Requires retry and acknowledgment logic to detect and recover. |
| Temporal | The node produces a correct result, but too late to be useful — often from clock drift or an overloaded queue. | Correctness isn't the problem; timeliness is, which is a different class of bug to catch. |
| Byzantine | The node behaves arbitrarily — sending conflicting messages to different peers, returning wrong results, or acting maliciously. | Hardest — requires consensus protocols specifically designed to tolerate lying or malfunctioning participants. |
| Update strategy | Behavior | Trade-off |
|---|---|---|
| Synchronous replication | All replicas confirm the update before it's considered complete. | Strong consistency, but write latency grows and availability drops if a replica is slow or unreachable. |
| Asynchronous replication | The primary accepts the update immediately; replicas catch up afterward. | Low write latency and high availability, but reads can return stale data until replicas converge. |