← Back to Cloud and Distributed Systems

High-Availability System Design

High-availability design through redundancy, failover, and degraded operation.

Cloud and Distributed SystemsHigh AvailabilitySystems Atlas

High availability means a system continues to serve useful requests despite node failures, maintenance, or local infrastructure faults. It does not mean perfect correctness, zero latency, or zero data loss in every failure mode. A system may stay available while serving stale reads, rejecting writes, or running in a reduced-capability mode. That distinction matters because availability targets are set against user-visible behaviour, not architectural slogans.

Start with the failure budget

An availability target such as 99.99 percent gives a hard operational budget for downtime. The number is only meaningful if you define what counts as unavailable. A checkout service that returns HTTP 200 with an error message embedded in the page is still down from the user’s perspective. A read API that works while writes are paused may be partially available, depending on the service objective.

Once the target is clear, identify the components whose failure would violate it. Load balancers, application nodes, databases, caches, DNS, certificate renewal, and deployment systems all belong on that list. High availability begins by removing single points of failure, not by adding replicas at random.

Replicate across real failure domains

Two copies on the same host are not redundant. Two nodes in the same rack may still fail together if the rack loses power or top-of-rack networking. Design replicas across genuine failure domains such as separate virtual machines, availability zones, or data centres, depending on the target and budget.

Stateless application tiers are usually the easiest part. Put several instances behind health-checked load balancing and make instances disposable. Stateful systems are harder because they must keep or reconstruct data while nodes fail. Database replication, durable queues, and distributed caches each introduce their own tradeoffs around lag, quorum, and failover speed.

Choose a failover model deliberately

Active-passive designs keep one node serving traffic while another stands by. They are simpler to reason about, but failover can be slow and the passive node may drift if replication or configuration management is weak. Active-active designs spread traffic across several live nodes and improve resource use, but they push complexity into conflict handling, coordination, and data consistency.

Replication mode matters. Synchronous replication can protect against data loss but increases write latency and may reduce availability during network trouble. Asynchronous replication is usually faster, but a failover can lose the most recent committed work if the standby is behind. The correct choice depends on whether the service values continuity, freshness, or durability most in that moment.

Engineer degraded modes, not just happy failover

Real incidents are messy. Dependency timeouts can exhaust thread pools. Retry storms can amplify load on a struggling database. A healthy secondary can still be useless if clients cache the old endpoint or if background jobs continue writing to the failed primary. High-availability design therefore needs circuit breakers, request shedding, backpressure, idempotent retries, and clear leadership rules for state-changing operations.

For user-facing systems, degraded service is often better than total failure. Read-only mode, cached responses, queueing writes for later replay, or temporarily disabling non-critical features can preserve the core user journey while the system heals.

Operations decide whether the design works

Runbooks, health checks, and drills are part of the architecture. Automatic failover without fencing can create split brain. Manual failover without tested procedures is often too slow. Monitoring must distinguish between local process health, dependency health, and end-to-end user success. Recovery time and recovery correctness both matter.

High availability fits systems where interruption is expensive: payments, customer login, fulfilment, and internal operational control planes. It is worth the cost when downtime hurts the business more than the extra infrastructure, coordination, and testing needed to stay up.