High Availability Fundamentals
High Availability Fundamentals
High availability (HA) ensures your application remains operational despite component failures.
Key Metrics
| Metric | Description |
|---|---|
| Availability | % uptime (99.9% = 8.76 hours downtime/year) |
| MTBF | Mean Time Between Failures |
| MTTR | Mean Time To Recovery |
| RTO | Recovery Time Objective |
| RPO | Recovery Point Objective |
Availability Targets
| SLA | Downtime/Year | Use Case |
|---|---|---|
| 99.9% | 8.76 hours | Internal apps |
| 99.95% | 4.38 hours | Business apps |
| 99.99% | 52.6 minutes | Critical systems |
| 99.999% | 5.26 minutes | Mission critical |
HA Architecture
┌─────────────────────────────────────────────────────────────┐
│ Multi-AZ High Availability │
├─────────────────────────────────────────────────────────────┤
│ │
│ Route 53 ──▶ ALB ──┬──▶ AZ-1a ──▶ EC2 + EBS │
│ ├──▶ AZ-1b ──▶ EC2 + EBS │
│ └──▶ AZ-1c ──▶ EC2 + EBS │
│ │
│ RDS Multi-AZ: │
│ Primary (AZ-1a) ──▶ Standby (AZ-1b) │
│ │
│ ElastiCache Multi-AZ: │
│ Primary ──▶ Replica 1 ──▶ Replica 2 │
│ │
│ S3: 11 9's durability (automatic replication) │
└─────────────────────────────────────────────────────────────┘
Multi-AZ Deployment
Multi-AZ Deployment
EC2 Multi-AZ
# Launch instances across AZs
for i in {1..3}; do
aws ec2 run-instances \
--image-id ami-xxx \
--instance-type t3.micro \
--subnet-id subnet-az${i} \
--security-group-ids sg-xxx \
--tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=WebServer-${i}}]"
done
# Auto Scaling across AZs
aws autoscaling create-auto-scaling-group \
--auto-scaling-group-name my-asg \
--vpc-zone-identifier "subnet-az1,subnet-az2,subnet-az3" \
--min-size 3 \
--max-size 10 \
--desired-capacity 3
RDS Multi-AZ
# Enable Multi-AZ
aws rds modify-db-instance \
--db-instance-identifier mydb \
--multi-az \
--apply-immediately
# Aurora Multi-AZ (6 copies across 3 AZs)
aws rds create-db-cluster \
--db-cluster-identifier myaurora \
--engine aurora-mysql \
--backup-retention-period 7
ElastiCache Multi-AZ
# Redis with automatic failover
aws elasticache create-replication-group \
--replication-group-id my-redis \
--multi-az enabled \
--automatic-failover enabled \
--num-cache-clusters 3
Auto Scaling and Load Balancing
Auto Scaling and Load Balancing
Auto Scaling Strategies
# Target tracking (recommended)
aws autoscaling put-scaling-policy \
--auto-scaling-group-name my-asg \
--policy-name cpu-tracking \
--policy-type TargetTrackingScaling \
--target-tracking-configuration '{
"PredefinedMetricSpecification": {
"PredefinedMetricType": "ASGAverageCPUUtilization"
},
"TargetValue": 70.0
}'
# Step scaling
aws autoscaling put-scaling-policy \
--auto-scaling-group-name my-asg \
--policy-name scale-out \
--policy-type StepScaling \
--adjustment-type ChangeInCapacity \
--step-adjustments '[{
"MetricIntervalLowerBound": 0,
"MetricIntervalUpperBound": 20,
"ScalingAdjustment": 1
}, {
"MetricIntervalLowerBound": 20,
"ScalingAdjustment": 2
}]' \
--scaling-adjustment 1
# Scheduled scaling
aws autoscaling put-scheduled-update-group-action \
--auto-scaling-group-name my-asg \
--scheduled-action-name scale-up-morning \
--recurrence '0 8 * * MON-FRI' \
--min-size 5 \
--max-size 10
Health Check Configuration
# ALB health checks
aws elbv2 create-target-group \
--name my-targets \
--health-check-path /health \
--health-check-interval-seconds 15 \
--health-check-timeout-seconds 5 \
--healthy-threshold-count 3 \
--unhealthy-threshold-count 3
Failover Strategies
Failover Strategies
Route 53 Failover
# Primary record
aws route53 change-resource-record-sets \
--hosted-zone-id Z1234567890 \
--change-batch '{
"Changes": [{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "www.example.com",
"Type": "A",
"SetIdentifier": "primary",
"Failover": "PRIMARY",
"TTL": 60,
"ResourceRecords": [{"Value": "192.0.2.1"}],
"HealthCheckId": "xxx"
}
}]
}'
# Secondary record
aws route53 change-resource-record-sets \
--hosted-zone-id Z1234567890 \
--change-batch '{
"Changes": [{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "www.example.com",
"Type": "A",
"SetIdentifier": "secondary",
"Failover": "SECONDARY",
"TTL": 60,
"ResourceRecords": [{"Value": "198.51.100.1"}]
}
}]
}'
Database Failover
RDS Multi-AZ:
Primary → Automatic failover (< 60 seconds)
Aurora:
Primary → Automatic failover (< 30 seconds)
DynamoDB:
Global Tables → Multi-region, multi-active
Disaster Recovery Strategies
Disaster Recovery Strategies
DR Strategy Comparison
| Strategy | RTO | RPO | Cost | Complexity |
|---|---|---|---|---|
| Backup & Restore | Hours | Hours | Low | Low |
| Pilot Light | 10s of min | Minutes | Medium | Medium |
| Warm Standby | Minutes | Seconds | High | High |
| Multi-Site Active | Seconds | Near-zero | Very High | Very High |
Backup and Restore
# Automated backups
aws rds modify-db-instance --backup-retention-period 7
# S3 cross-region replication
aws s3api put-bucket-replication --bucket source-bucket --replication-configuration '...'
# Glacier for long-term backup
aws s3api put-bucket-lifecycle-configuration --bucket my-bucket --lifecycle-configuration '{...}'
Pilot Light
┌─────────────────────────────────────────────────────────────┐
│ Pilot Light DR │
├─────────────────────────────────────────────────────────────┤
│ │
│ Primary Region: │
│ ALB ──▶ EC2 instances ──▶ RDS Primary │
│ │
│ DR Region: │
│ (Minimal) ──▶ RDS Read Replica │
│ AMI ready ──▶ Scale up when needed │
│ │
│ Failover: │
│ 1. Promote RDS replica │
│ 2. Launch EC2 from AMI │
│ 3. Update Route 53 │
└─────────────────────────────────────────────────────────────┘
Warm Standby
# Run minimal capacity in DR region
aws ec2 run-instances --instance-type t3.micro --region eu-west-1
# Keep data in sync
aws rds create-db-instance-read-replica \
--db-instance-identifier mydb-eu \
--source-db-instance-identifier arn:aws:rds:us-east-1:xxx:db:mydb
# Scale up on failover
aws autoscaling set-desired-capacity --auto-scaling-group-name my-dr-asg --desired-capacity 10