Engineering concepts

Redundancy in Software Systems

What redundancy means in engineering, when to add spare capacity vs duplication, and how it improves reliability without wasting cost.

By Pawan Bisht

Redundancy is having more than one way to perform a critical function so that a single failure does not take the whole system down. Search engines love clear definitions — this article explains redundancy for builders, not buzzwords.

Why redundancy matters

  • Hardware fails silently (disks, NICs, power).
  • Deployments introduce bugs — rolling back needs healthy instances.
  • Traffic spikes need headroom, not perfect sizing.
  • 99.9% Uptime target
  • ~43m Allowed downtime / mo
  • 1 node N+1 spare
  • 2+ Regions (geo)

Common redundancy patterns

Active / active

All nodes serve traffic. Load balancers spread work. Fast failover but needs careful data consistency.

Active / passive

Standby waits until health checks fail. Cheaper, but failover time depends on detection + promotion.

N+1 capacity

Run N nodes worth of load on N+1 machines. One failure still leaves enough capacity for peak.

Without redundancy

  • Single AZ
  • One DB primary
  • Blast radius = entire app

With redundancy

  • Multi-AZ replicas
  • Read replicas + failover
  • Isolated failure domains
PatternCostFailover speed
Multi-instance behind LBMediumSeconds
Hot standby DBHighMinutes
Cross-region active-activeVery highSub-second (with tradeoffs)

Minimal health-check loop

const backends = ['10.0.0.1', '10.0.0.2', '10.0.0.3'];
const healthy = new Set(backends);

async function ping(host) {
  try {
    const res = await fetch(`http://${host}/health`, { signal: AbortSignal.timeout(800) });
    return res.ok;
  } catch {
    return false;
  }
}

setInterval(async () => {
  for (const host of backends) {
    (await ping(host) ? healthy.add(host) : healthy.delete(host));
  }
}, 5000);

export function pickBackend() {
  const pool = backends.filter((h) => healthy.has(h));
  if (!pool.length) throw new Error('no redundant path left');
  return pool[Math.floor(Math.random() * pool.length)];
}

Everything fails all the time.

Werner Vogels, AWS
RTO
Recovery Time Objective — how long you can be down.
RPO
Recovery Point Objective — how much data loss is acceptable.
Blast radius
How much of the system one failure can affect.
  • Health checks on every redundant tier
  • Automated failover tested quarterly
  • Runbooks for manual promotion

Is redundancy the same as backup?

Backups recover past data; redundancy keeps live service available during failure. You usually want both.

When is redundancy overkill?

For low-criticality internal tools with tolerant users, a single region and good backups may be enough.

What do you redundant first in a greenfield API?

  • Stateless app instances
  • Database replicas
  • Cache layer
  • Second region
  1. Instance fails LB stops routing; clients retry.
  2. Auto-scale replaces node Capacity restored if pool was N+1.
  3. Postmortem Verify monitoring caught the failure.

Google SRE Book — Chapter on HA Classic reference on reliability patterns.

#redundancy, #ha, #sre, #fault-tolerance

Share what you studied

Add your own engineering topic as JSON — copy article.template.json, use the block types from BLOG_CONTENT.md, and open a PR.