Filter concepts by levelShowing all levels.

System Design · Section 7

Availability, Reliability and Durability

Level
intermediate
Read
20 min
Concepts
4

Three distinct guarantees a system is measured on — availability (can it be reached), reliability (does it behave correctly), and durability (is stored data preserved) — quantified through the uptime "nines" and their sharply shrinking downtime budgets, earned through a seven-item toolkit of redundancy, failover, health checks, graceful degradation, backups, replication and disaster recovery, and never honestly claimed without first walking the whole request path for single points of failure.

What is true here

  1. Availability = % reachable/usable; reliability = probability of correct behavior; durability = probability data is not lost.
  2. 99% ≈ 3.65 days/yr downtime; 99.9% ≈ 8.76 hr/yr; 99.99% ≈ 52.6 min/yr; 99.999% ≈ 5.26 min/yr — each nine is ~10x tighter.
  3. Redundancy, failover and health checks earn availability; backups and replication earn durability; graceful degradation keeps a system usable during partial failure; disaster recovery covers large-scale loss.
  4. A single un-redundant component anywhere in the request path caps real availability, regardless of redundancy elsewhere — walk the whole path before claiming "highly available."

What you will be able to do

  • Distinguish availability, reliability and durability and give an example failure unique to each
  • Convert an availability percentage into an allowed-downtime budget per year, month or week
  • Name which of the seven techniques (redundancy, failover, health checks, graceful degradation, backups, replication, disaster recovery) defends against a given failure mode
  • Audit a request path end to end for single points of failure before accepting an availability claim

The vocabulary and the numbers

The three guarantees, precisely distinguished, and what each "nine" of availability actually allows.

Availability, reliability and durability

corebeginner

Three related but distinct guarantees: availability is the percentage of time a service can be reached and used; reliability is the probability it behaves correctly while it runs; durability is the probability that data already stored stays intact, even during downtime.

Think of it as

A vending machine that is plugged in and displaying its menu is "available" — you can reach it. If it sometimes gives you the wrong snack, it is available but not reliable. If it loses track of how much money you put in even after a power outage, that is a durability failure, not an availability one — the machine can be back online (available) with no memory of your transaction (not durable). The three answer different questions: can I reach it, does it work correctly, and is what I stored still there.

text
availability = uptime / total_time            (can I reach it?)
reliability  = P(correct behavior over time)   (does it work right?)
durability   = P(stored data is not lost)      (is it still there?)

What we're doing: Show a single incident scenario touching all three guarantees differently, to make the distinction concrete.

three-definitions.txttext
A database node crashes during a write.

  Availability: the service returns errors for 90 seconds
                while a replica is promoted -> availability hit

  Reliability:  during those 90 seconds, some in-flight
                requests silently returned stale reads before
                erroring -> reliability hit

  Durability:   the write itself was already replicated to
                two other nodes before the crash, so no data
                was lost -> durability held
3
The 90-second outage is purely an availability number — the service could not be reached.
6
Stale reads during the failover are a reliability problem — the system was reachable but gave wrong answers.
10
Because the write was already replicated, no committed data was lost — durability held even though availability and reliability both took a hit.

Why this works: The same incident can score very differently on each axis. Conflating them leads to the wrong fix — adding more replicas improves durability, not necessarily availability during a failover, and does nothing for a reliability bug in the application code.

Using "highly available" to mean "never loses data"

Wrong

text
"We're highly available, so your data is safe."

Better

text
"We're highly available (99.95% uptime) and
separately durable (data replicated to 3 nodes,
so it survives a single node failure)."

What you see: A team assumes high availability implies data safety, then loses data in an incident where the service stayed reachable the whole time but wrote to a single, unreplicated disk that failed.

Why: Availability says nothing about what happens to data on disk — a system can be up 99.99% of the time and still lose everything on its first disk failure if durability was never separately engineered.

A database node crashes during a write — two different verdicts

Availability (took a hit)

  • +Service returns errors for 90 seconds
  • +A replica must be promoted first
  • +"Can I reach it?" — no, for 90s

Durability (held)

  • The write was already replicated to 2 nodes
  • No committed data was lost
  • "Is it still there?" — yes
  • Availability (took a hit)
    • Service returns errors for 90 seconds
    • A replica must be promoted first
    • "Can I reach it?" — no, for 90s
  • Durability (held)
    • The write was already replicated to 2 nodes
    • No committed data was lost
    • "Is it still there?" — yes

The three guarantees

The three guarantees
TermAnswersFailure looks like
Availability"Can I reach the service right now?"timeouts, connection refused, 503s
Reliability"Does it behave correctly while running?"wrong results, crashes mid-request, silent bugs
Durability"Is data I already stored still there?"data loss after a crash, disk failure, or bad deploy

Together

text
A payments service:

  Available:  the API responds within its SLA 99.95% of the month
  Reliable:   of the requests it accepts, 99.999% return the
              correct charge amount
  Durable:    once a payment record is written, 99.999999999%
              (11 nines) probability it is never lost

Remember: Availability = can you reach it; reliability = does it work correctly; durability = is stored data preserved. Different questions, different failure modes.

See also: uptime nines · redundancy toolkit

Uptime "nines" and what they allow

corebeginner

Each additional "nine" of availability shrinks allowed downtime by roughly 10x. 99% allows about 3.65 days of downtime a year; 99.999% ("five nines") allows about 5 minutes — and each step up costs disproportionately more engineering effort.

Think of it as

A year has 525,600 minutes. "Percentage available" times that many minutes tells you the downtime budget. Going from 99% to 99.9% is not a 0.9% improvement in difficulty — it is a 10x reduction in the room for error, which usually requires a qualitatively different architecture (automated failover, multi-region redundancy) rather than just "being more careful."

text
allowed downtime = total_time × (1 - availability)

525,600 minutes/year × (1 - 0.999) ≈ 525.6 min ≈ 8.76 hours

What we're doing: Compute the downtime budget for a real target and show how little room 99.99% actually leaves.

uptime-nines.txttext
SLA target: 99.99% availability.

  Yearly budget:  525,600 min × 0.0001  ≈ 52.6 minutes
  Monthly budget: 43,800 min × 0.0001   ≈ 4.4 minutes
  Weekly budget:  10,080 min × 0.0001   ≈ 1.0 minute

One unplanned 10-minute outage uses about 19% of
the ENTIRE year's downtime budget.
3
The yearly budget converts directly from the availability percentage and the number of minutes in a year.
8
A single 10-minute outage against a 52.6-minute yearly budget is a large fraction of the entire year's allowance — 99.99% leaves very little room for even one incident.

Why this works: Availability targets sound similar as percentages (99% vs 99.99% looks like a small gap) but translate to wildly different operational realities — the difference between "restart it by hand next business day" and "no human can be in the loop."

Promising "99.99%" without the architecture to support it

Wrong

text
"We'll commit to 99.99% uptime." (single
region, single database, manual failover process)

Better

text
"99.99% requires automated failover and
multi-zone redundancy — with our current single-
region setup, 99.9% is the honest target."

What you see: The team commits to a five-minutes-a-year downtime budget, then a single manual database failover during an incident consumes the entire year's allowance in one event.

Why: Each additional nine is not a small stretch goal — it requires categorically different infrastructure (automated failover, redundancy across failure domains). Promising a nines target the architecture cannot support sets up a guaranteed SLA breach.

Each nine: 10x less downtime, 10x more engineering effort
99% (~3.65 days/yr)
single instance, manual recovery
99.9% (~8.76 hr/yr)
monitoring + fast on-call
99.99% (~52.6 min/yr)
automated failover, multi-zone
99.999% (~5.26 min/yr)
multi-region, near-instant failover
  • 99% (~3.65 days/yr): Low effort, More downtime allowed — single instance, manual recovery
  • 99.9% (~8.76 hr/yr): between Low effort and High effort, between More downtime allowed and Almost none allowed — monitoring + fast on-call
  • 99.99% (~52.6 min/yr): between Low effort and High effort, Almost none allowed — automated failover, multi-zone
  • 99.999% (~5.26 min/yr): High effort, Almost none allowed — multi-region, near-instant failover

Availability targets and allowed downtime

Availability targets and allowed downtime
AvailabilityDowntime / yearDowntime / monthTypical requirement
99% ("two nines")~3.65 days~7.3 hourssingle instance, manual recovery acceptable
99.9% ("three nines")~8.76 hours~43.8 minutesmonitoring + fast on-call response
99.99% ("four nines")~52.6 minutes~4.4 minutesautomated failover, multi-zone redundancy
99.999% ("five nines")~5.26 minutes~26 secondsmulti-region, near-instant automated failover

Together

text
A year has 525,600 minutes.

  99%     downtime = 525,600 × 0.01     ≈ 5,256 min ≈ 3.65 days
  99.9%   downtime = 525,600 × 0.001    ≈ 525.6 min ≈ 8.76 hours
  99.99%  downtime = 525,600 × 0.0001   ≈ 52.56 min
  99.999% downtime = 525,600 × 0.00001  ≈ 5.26 min

Remember: 99% ≈ 3.65 days/yr down · 99.9% ≈ 8.76 hr/yr · 99.99% ≈ 52.6 min/yr · 99.999% ≈ 5.26 min/yr — each nine is ~10x tighter.

See also: three definitions · redundancy toolkit

Advertisement

Earning the guarantees

The concrete toolkit behind availability and durability, and the discipline that keeps a claim honest.

The redundancy and recovery toolkit

standardintermediate

Seven concrete techniques back the three guarantees: redundancy (extra capacity), failover (switching to it), health checks (detecting failure), graceful degradation (partial function over total failure), backups and replication (protecting data), and disaster recovery (a plan for large-scale loss).

Think of it as

Each technique defends a specific failure mode. Redundancy means nothing without health checks to detect a failure and failover to act on it. Graceful degradation is what a system does when it cannot avoid a partial failure — serve what it can instead of failing entirely. Backups and replication both protect data, but differently: replication keeps a live, current copy for fast failover; backups keep a point-in-time copy for recovering from corruption or a mistake replication would just copy too. Disaster recovery is the plan for when redundancy itself is exhausted — a whole region down, not just one node.

text
redundancy + health checks + failover  -> stays available
graceful degradation                    -> stays usable when partial
backups + replication                   -> stays durable
disaster recovery                       -> survives large-scale loss

What we're doing: Show all seven techniques applied together in one incident, and what each one specifically prevented.

redundancy-toolkit.txttext
An availability zone loses power.

  Redundancy:     app servers and DB replicas exist in 2 other zones
  Health checks:  load balancer detects the zone's servers stop
                  responding within 10 seconds
  Failover:       traffic reroutes to the healthy zones automatically
  Graceful
  degradation:    the recommendations service (in the failed zone)
                  is skipped; the rest of the page still renders
  Replication:    the DB replica in a healthy zone is promoted,
                  no committed writes are lost
  Backups:        unrelated — used later to confirm no silent
                  corruption occurred during the failover
  Disaster
  recovery plan:  not invoked — a single zone loss was absorbed
                  by redundancy; DR is reserved for a full region loss
3
Redundancy across zones is what makes any of the rest of this possible.
5
Health checks are the detection mechanism — without them, failover has nothing to trigger on.
9
Graceful degradation keeps the page usable even though one non-critical dependency is down.
12
Replication with a promotable replica is what prevents this from becoming a durability incident, not just an availability one.
17
Disaster recovery is reserved for a scale of failure redundancy alone cannot absorb — this incident never reached that threshold.

Why this works: These seven techniques are not interchangeable — each defends a distinct failure mode, and a real incident usually exercises several of them together. Naming which technique handled which part of an incident is what makes a postmortem specific instead of vague.

Having redundancy with no health checks or failover to use it

Wrong

text
"We have a standby database ready to go."
(nothing automatically detects a failure or
triggers a switch to it)

Better

text
"We have a standby database, automated health
checks every 5s, and failover that promotes it
within 30s of a detected failure."

What you see: A standby exists but the primary silently fails at 3am, and nothing switches over until an engineer notices hours later — the redundancy was real but useless without detection and an automatic switch.

Why: Redundancy alone is inert — it only improves availability once paired with health checks to detect a failure and failover to act on the detection automatically, without waiting on a human.

Seven techniques, four guarantees, one incident

Stays available

Redundancy

App servers and replicas already running in two other zones

Health checks

The load balancer notices the zone stop responding within 10 seconds

Failover

Traffic reroutes to the healthy zones without waiting for a human

Stays usable

Graceful degradation

Recommendations lived in the failed zone and are skipped; the page still renders

Stays durable

Replication

A replica in a healthy zone is promoted; no committed writes are lost

Backups

A point-in-time copy — it recovers the corruption replication would have copied

Survives the big one

Disaster recovery

Not invoked here — one zone was absorbed. This is for a whole region

  • An availability zone loses power
  • Stays available — Detect, then act
    • Redundancy — App servers and replicas already running in two other zones
    • Health checks — The load balancer notices the zone stop responding within 10 seconds
    • Failover — Traffic reroutes to the healthy zones without waiting for a human
  • Stays usable — Partial beats total
    • Graceful degradation — Recommendations lived in the failed zone and are skipped; the page still renders
  • Stays durable — The data survives
    • Replication — A replica in a healthy zone is promoted; no committed writes are lost
    • Backups — A point-in-time copy — it recovers the corruption replication would have copied
  • Survives the big one — When redundancy runs out
    • Disaster recovery — Not invoked here — one zone was absorbed. This is for a whole region

Availability and durability techniques

Availability and durability techniques
TechniqueDefends againstExample
Redundancya single component failingtwo app servers instead of one
Failoverthe active component going downtraffic auto-routes to the standby
Health checksnot knowing a component has faileda load balancer pings /health every 5s
Graceful degradationtotal failure when one dependency failsserve cached results if the DB is slow
Backupsdata corruption or accidental deletionnightly snapshot, restorable point-in-time
Replicationlosing the only copy of live datawrites copied to 2+ nodes in real time
Disaster recoverya whole region or datacenter lossdocumented plan + tested failover to another region

Remember: Redundancy + health checks + failover keeps a system available; graceful degradation keeps it usable when partial; backups + replication keep data durable; disaster recovery covers large-scale loss.

See also: three definitions · no spof claim

Never claim high availability without ruling out single points of failure

standardintermediate

A single point of failure (SPOF) is any one component whose failure takes down the whole system. An availability number is only credible once every SPOF in the design has been named and explicitly accepted or removed — not assumed away.

Think of it as

Redundant app servers behind a load balancer look highly available — until the load balancer itself, or the one database behind them, turns out to be a single unreplicated instance. High availability requires every layer in the path to be redundant, because a chain is only as available as its least available link. Naming every SPOF is a checklist exercise: walk the request path end to end and ask, for each component, "what happens if exactly this one thing goes down?"

text
overall availability ≈ the availability of the
LEAST available component in the request path

one un-redundant component undoes redundancy
everywhere else in the design

What we're doing: Walk a request path end to end and find the single point of failure hiding behind an otherwise-redundant design.

no-spof-claim.txttext
Claimed: "highly available — 3 app servers,
load-balanced."

Walk the full request path:
  DNS             -> managed, multi-region        OK
  Load balancer   -> ONE instance, no standby      SPOF
  App servers     -> 3 instances, redundant        OK
  Database        -> 1 primary, no replica          SPOF
  Object storage  -> managed, multi-zone           OK

Two single points of failure found despite the
"highly available" claim: the load balancer and
the database. Either one failing takes the whole
system down regardless of the redundant app tier.
7
A single load balancer instance is a SPOF even though everything behind it is redundant — nothing can reach the redundant servers if it goes down.
9
A single database primary with no replica is a SPOF for both availability and durability — its failure is total, not partial.
12
The original claim only looked at the app tier. Walking the entire path surfaced two SPOFs it missed.

Why this works: Redundancy at one layer creates a false sense of safety if another layer is not checked. The system's real availability is bounded by its single least redundant component, not by whichever layer got the most attention.

Calling a design "highly available" after redundancy at only one layer

Wrong

text
"We run 3 app server instances, so we're
highly available." (load balancer and database
never checked for redundancy)

Better

text
"We walked every layer: DNS, load balancer,
app servers, database, storage. Found 2 SPOFs
(load balancer, database) — fixing those before
calling this highly available."

What you see: The system advertises high availability, then goes fully down when the un-checked database primary fails — the redundant app tier never got a chance to matter.

Why: A single un-redundant component anywhere in the path caps the system's real availability at that component's own availability, no matter how redundant every other layer is. The claim is only honest once every layer has been checked, not just the one that was easiest to make redundant.

Walk the whole path, not just the tier you made redundant

The claim looked at one layer. Walking every layer found two components that each take the whole system down.

  • The request path drawn as five components in a row: DNS, load balancer, app tier, database, object store.
  • DNS is multi-region, the app tier has three instances, and object storage is multi-zone — all redundant.
  • The load balancer is a single instance and the database is a single primary. Both are marked SPOF.
  • Below the diagram: overall availability is approximately the availability of the least redundant component in the path.

Remember: Walk the full request path and name every single point of failure explicitly — an availability claim is only as strong as its least redundant component.

See also: redundancy toolkit · uptime nines

Advertisement