Distributed System Failures: Partitions Explained

Updated on
11 min read

Distributed system failures are difficult because a component can be alive, unreachable, slow, or only partly informed at the same time. This guide explains network partitions and partial failures for developers, SREs, and architects who need to make reliable decisions when nodes cannot communicate. You will learn what a partition looks like, why timeouts cannot prove that a service is dead, how replicated systems choose safety or availability, and how to test failure handling without guessing.

What Are Distributed System Failures?

A distributed system is a group of independent processes that coordinate over a network. A failure occurs when one of those processes, its storage, or the communication path no longer provides the behavior other components expect. Unlike a single-machine crash, the failure may be visible to only some participants.

The most important case is a network partition: two or more groups of nodes continue running but cannot exchange messages reliably. A partition can be a complete disconnection, packet loss, asymmetric routing, a firewall rule, or a link so slow that requests expire. The nodes on each side may still accept local work, which makes the incident harder to reason about.

The MIT 6.824 distributed systems course treats failures and replication as core design problems rather than unusual exceptions. That framing matters: a system is not reliable because failures are rare; it is reliable because its behavior during failures is defined and tested.

Why Partitions Exist

Networks do not provide a single, instantaneous view of reality. Packets can be delayed, duplicated, reordered, or dropped. A switch, router, virtual network interface, load balancer, DNS dependency, or security policy can fail independently of the application nodes it connects.

Other causes often look like partitions from the application’s perspective:

  • Process pauses: Garbage collection, CPU starvation, or a virtual machine pause can make a healthy process miss heartbeats.
  • Resource exhaustion: A full connection pool, overloaded disk, or exhausted file-descriptor limit can prevent replies while the host remains powered on.
  • Asymmetric reachability: Node A can send to node B, but B cannot send back. One side may conclude that the other has failed.
  • Slow dependencies: A database or service may respond after the caller’s deadline. The caller sees a timeout even though the operation may have completed.
  • Configuration faults: A changed route, certificate, ACL, or service-discovery record can isolate one zone without taking its machines offline.

The result is a partial failure. Some requests succeed, some clients cannot reach the service, and different replicas may have different information. A binary “up or down” health check cannot represent this state.

How a Partition Changes System Behavior

Consider three replicas that coordinate ownership of an account or job. Before a partition, they can exchange heartbeats and agree on the latest state. During a partition, the replicas must decide whether to continue serving, reject uncertain work, or serve local data that may be stale.

Decision What the system protects Typical behavior during a partition Cost
Preserve consistency A single agreed history Require a quorum or leader; reject writes without one Reduced availability
Preserve availability Responses from reachable nodes Continue local reads or writes Conflicts or stale results
Serve stale reads Fast access to earlier state Return a known version with freshness metadata Clients may see old data
Fail closed Safety and explicit recovery Return an error instead of guessing Requires retries or operator action
Fail open Continuity of a lower-risk function Permit limited work without confirmation Must reconcile or audit later

This is the operational meaning behind the CAP theorem discussion: when a partition is present, a replicated system cannot guarantee both immediate availability and a single, consistent result for every operation. CAP does not say that a system always chooses only two properties, nor does it describe ordinary latency trade-offs when no partition exists. It describes a constraint under partition.

Safety and liveness

Two useful questions make failure behavior concrete:

  • Safety: Can the system ever return an invalid result, lose an acknowledged write, or assign the same exclusive job to two owners?
  • Liveness: Will a request eventually complete when enough components are working?

A strongly consistent lock service may sacrifice liveness when it cannot contact a quorum, because granting a lock without a current authority would be unsafe. A cache may sacrifice freshness and return an older value because serving a slightly stale profile is preferable to failing every page view. The correct choice depends on the operation, not on a universal “always available” rule.

Failure Detection Is an Inference

Distributed nodes cannot directly observe whether a remote process crashed or whether the network simply dropped the response. A timeout proves only that a response did not arrive before the deadline. It does not prove that the remote operation was not performed.

This distinction creates several common hazards. The broader CAP theorem explains why a partition forces a replicated system to choose between preserving a single current history and continuing to answer requests:

  1. A client submits a payment or job.
  2. The server commits it.
  3. The response is lost during the partition.
  4. The client retries and creates a duplicate.

Use request identifiers and idempotency keys when repeating an operation must not create a second effect. A server can record that key with the operation result and return the original result to a safe retry. For non-idempotent actions, use a durable workflow or reconciliation process rather than assuming that a timeout means “nothing happened.”

Heartbeats and leases help detect suspected failure, but they need bounded assumptions. A heartbeat interval that is shorter than normal garbage-collection pauses causes false failovers. A lease granted by a node whose clock is wrong can be unsafe. Use monotonic timers for local deadlines, include a lease owner and epoch in authoritative records, and make stale leaders unable to commit after losing authority.

The IETF RFC 1122 host requirements documents how Internet hosts should handle communication behavior such as retransmission and unreachable destinations. Those transport-level mechanisms improve delivery, but they do not turn an unreliable network into a reliable distributed coordination system. Application protocols still need deadlines, retry policy, and duplicate protection.

Replication and Consensus During Partitions

Replication improves availability and durability, but it introduces the need to decide which copy is authoritative. A system can replicate asynchronously and accept writes on multiple nodes, then reconcile conflicts later. Alternatively, it can use a leader and quorum so only a sufficiently informed group can commit a new value.

Leader-based consensus protocols generally use terms, epochs, or ballots to prevent an old leader from continuing to act after a newer leader is elected. A majority can make progress only when more than half of the voting members can communicate. A minority can remain alive but must not commit conflicting decisions.

The Raft project homepage provides an accessible description of this model and links to an interactive visualization. Raft is not a general cure for every distributed failure: it coordinates a replicated log, while the application still needs to define transactions, timeouts, snapshots, membership changes, and behavior for external side effects.

Quorum formulas make the trade-off visible. With N voting replicas, a majority quorum is usually floor(N / 2) + 1. In a five-node cluster, three reachable members can elect a leader; two isolated members cannot safely do so. Adding replicas can improve failure tolerance, but it also increases coordination and does not help if all replicas share one failed network or power domain.

Common Partition Patterns

Split brain

Two sides each believe they are the leader and accept conflicting writes. Prevent it with quorum-based authority, fencing, epochs, or an external witness. A UI that shows two healthy leaders is not evidence of availability; it may be evidence of a safety failure.

Stale reads

A replica remains reachable to a client but cannot receive updates. Reads succeed while freshness silently degrades. Expose a version, timestamp, or bounded-staleness guarantee when consumers need to make decisions based on recency.

Retry storms

When a dependency slows, many clients retry at once. The extra traffic consumes the remaining capacity and turns a partial failure into a cascading outage. Use bounded exponential backoff with jitter, retry only transient errors, cap attempts, and enforce a per-dependency budget.

Cascading timeouts

If service A waits 30 seconds for B and B waits 30 seconds for C, a small problem can occupy A’s worker pool for a long time. Set deadlines that propagate across calls and reserve capacity for health checks, cancellation, and recovery traffic.

Zombie work

A request can outlive the client that started it. If the work later completes, it may publish an event or mutate state that the caller no longer expects. Carry a request identity and cancellation policy through asynchronous work, and make consumers idempotent.

Designing for Safe Recovery

Start by classifying operations rather than choosing one behavior for the whole application:

  • Financial transfer or exclusive lock: prefer consistency, durable intent records, and explicit failure when authority is uncertain.
  • Search, recommendation, or profile display: serve a cached or slightly stale response when its age is visible and acceptable.
  • Inventory reservation: use a reservation with an expiry and reconciliation, not an unbounded local decrement.
  • Notifications: accept at-least-once delivery with deduplication, because delaying a notification is often better than losing it.

Then make the failure contract observable. Record the dependency, attempt number, deadline, request ID, replica or leader epoch, and final reason for rejection. Metrics should distinguish latency, timeout, connection failure, stale response, rejected quorum, and successful retry. A generic “500 errors” counter is not enough to identify a partition.

Recovery should also be designed. When connectivity returns, replicas may need to catch up, discard an obsolete leader’s uncommitted log, reconcile independently accepted writes, or rebuild a cache. Do not declare recovery when ping succeeds; verify replication lag, leader identity, durable commit position, queue depth, and application-level invariants.

Practical Partition Testing

Fault injection should begin in an isolated environment with a reversible change. On a Linux test host, tc netem can add delay or packet loss to a network interface:

# Inspect the current network emulation state.
sudo tc qdisc show dev eth0

# Add 400 ms of delay and 20% packet loss for a controlled test.
sudo tc qdisc replace dev eth0 root netem delay 400ms loss 20%

# Remove the fault after the test.
sudo tc qdisc del dev eth0 root

For a complete partition, isolate only the test process or namespace rather than applying a fault to a shared production interface. Exercise leader loss, quorum loss, slow acknowledgements, duplicate retries, and recovery. Verify invariants such as “one job has one owner,” “an acknowledged committed value is not lost,” and “replaying the same request ID does not create a second effect.”

Useful checks during an incident include:

date -u
ip route
ss -s
curl --connect-timeout 2 --max-time 5 -v https://service.example/health

Use these commands as evidence, not as a distributed diagnosis by themselves. A successful local health endpoint may only prove that the process is alive; it does not prove quorum, replication, or reachability from every client zone.

Common Misconceptions

“A timeout means the request failed.”

It means the caller did not receive a response before its deadline. The server may have completed the operation. Use idempotency keys, status lookup, or a durable operation log.

“Three replicas eliminate partitions.”

Three replicas can tolerate one unavailable voting member for a majority decision, but they cannot prevent a network partition. Correlated failures, bad routing, or a shared availability zone can isolate all of them.

“Retries make systems reliable.”

Retries can recover from a short transient fault, but uncontrolled retries amplify overload. They need deadlines, backoff, jitter, classification, and an idempotency strategy.

For a broader view of how services coordinate under failure, use this article alongside the MIT distributed systems course, the Raft consensus overview, and RFC 1122.

TBO Editorial

About the Author

TBO Editorial writes about the latest updates about products and services related to Technology, Business, Finance & Lifestyle. Do get in touch if you want to share any useful article with our community.