High availability design patterns in AWS - Time & Space Complexity
We want to understand how the effort to keep a system always running grows as we add more parts to it.
How does adding more servers or resources affect the work needed to maintain high availability?
Analyze the time complexity of deploying a multi-AZ load balanced web service.
aws ec2 run-instances --count n --image-id ami-12345678 --subnet-id subnet-abcde
aws elbv2 create-load-balancer --name my-lb --subnets subnet-abcde subnet-fghij
aws elbv2 register-targets --target-group-arn arn:tg --targets Id=i-12345 Id=i-67890
aws elbv2 create-listener --load-balancer-arn arn:lb --protocol HTTP --port 80 --default-actions Type=forward,TargetGroupArn=arn:tg
This sequence launches n instances across availability zones, sets up a load balancer, and connects instances to it.
Look at what repeats as we add more instances.
- Primary operation: Launching EC2 instances (run-instances) and registering them to the load balancer.
- How many times: The launch and registration happen once per instance, so n times.
As you add more instances, you launch and register more servers one by one.
| Input Size (n) | Approx. Api Calls/Operations |
|---|---|
| 10 | About 10 launches + 10 registrations = 20 calls |
| 100 | About 100 launches + 100 registrations = 200 calls |
| 1000 | About 1000 launches + 1000 registrations = 2000 calls |
Pattern observation: The number of calls grows directly with the number of instances added.
Time Complexity: O(n)
This means the work to deploy and connect instances grows in a straight line as you add more servers.
[X] Wrong: "Adding more servers does not increase deployment time because everything happens at once."
[OK] Correct: Each server requires its own setup and registration, so the total work grows with the number of servers.
Understanding how adding resources affects deployment effort helps you design systems that stay reliable without surprises.
"What if we used an auto-scaling group to manage instances instead of launching each manually? How would the time complexity change?"
Practice
Solution
Step 1: Understand high availability concept
High availability means designing systems to stay online and functional despite failures.Step 2: Match goal with options
Only To keep the application running even if some parts fail describes keeping the app running during failures, which is the goal.Final Answer:
To keep the application running even if some parts fail -> Option BQuick Check:
High availability = keep running despite failures [OK]
- Confusing cost reduction with availability
- Thinking speed alone defines high availability
- Assuming limiting users improves availability
Solution
Step 1: Identify service for traffic distribution
Elastic Load Balancer (ELB) distributes traffic to multiple instances to avoid single points of failure.Step 2: Eliminate other options
Amazon S3 stores files, RDS is a database, Lambda runs code; none distribute traffic.Final Answer:
Elastic Load Balancer (ELB) -> Option DQuick Check:
Traffic distribution = ELB [OK]
- Choosing storage or compute services instead of load balancer
- Confusing Lambda with traffic distribution
- Selecting database services for traffic handling
Solution
Step 1: Understand multi-AZ deployment
Running in multiple AZs means if one AZ fails, others can serve traffic.Step 2: Analyze ELB behavior
ELB routes traffic only to healthy instances, so app stays available in the healthy AZ.Final Answer:
The app continues running using the healthy AZ -> Option CQuick Check:
Multi-AZ + ELB = app stays available [OK]
- Assuming total outage if one AZ fails
- Thinking app slows but serves from failed AZ
- Believing app scales down automatically on failure
Solution
Step 1: Check Auto Scaling group settings
Auto Scaling must replace unhealthy instances to maintain minimum capacity.Step 2: Understand failure impact
If replacement is disabled, failed instance won't be replaced, causing fewer running instances.Final Answer:
Auto Scaling group is not set to replace unhealthy instances -> Option AQuick Check:
Auto Scaling replaces unhealthy = maintain capacity [OK]
- Blaming load balancer for instance count
- Assuming instances launched only in one AZ
- Thinking security groups affect instance count
Solution
Step 1: Understand region failure scope
Multi-AZ protects against AZ failure, but not entire region failure.Step 2: Choose multi-region design
Deploying in multiple regions with Route 53 routing and health checks ensures availability if one region fails.Final Answer:
Deploy instances in multiple regions with Route 53 latency-based routing and health checks -> Option AQuick Check:
Multi-region + Route 53 = survive region failure [OK]
- Thinking multi-AZ covers region failure
- Relying on single instance with Auto Scaling
- Ignoring DNS routing for multi-region failover
Ready to prove it?
Pass the test and this pattern moves unknown
