В чем разница между Single-AZ и Multi-AZ развертыванием базы данных в AWS?

«В чем разница между Single-AZ и Multi-AZ развертыванием базы данных в AWS?» — вопрос из категории Облачные платформы, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В AWS разница между Single-AZ и Multi-AZ развертыванием базы данных (например, RDS или Aurora) заключается в архитектуре отказоустойчивости и последствиях при сбое зоны доступности (Availability Zone — AZ).

Single-AZ:

  • Архитектура: База данных работает на основном инстансе в одной AZ. Резервные копии (snapshots) могут храниться в S3, но standby-инстанса в другой AZ нет.
  • Влияние сбоя AZ: При отказе всей AZ база данных становится недоступной до тех пор, пока AWS не восстановит инфраструктуру в этой AZ или пока вы вручную не восстановите из снапшота в другой AZ. Это ведёт к простою (downtime).
  • Стоимость: Дешевле, так как используется только один инстанс БД.
  • Использование: Для сред разработки, тестирования или некритичных рабочих нагрузок, где допустим простой.

Multi-AZ:

  • Архитектура: AWS автоматически создаёт и поддерживает синхронную standby-реплику в другой AZ. Данные реплицируются синхронно, обеспечивая целостность.
  • Влияние сбоя AZ: При сбое основной AZ AWS автоматически выполняет failover: DNS-запись инстанса перенаправляется на standby-реплику, которая становится новой основной. Этот процесс обычно занимает 1-2 минуты. Приложение, переподключившись, продолжит работу с минимальным простоем.
  • Стоимость: Дороже (примерно в 2 раза за инстанс БД), так как вы платите за standby-реплику.
  • Использование: Для рабочих (production) нагрузок, где требуется высокая доступность и минимальный RTO (Recovery Time Objective).

Пример создания через AWS CLI и Terraform:

# AWS CLI: Создание RDS PostgreSQL в Multi-AZ
aws rds create-db-instance 
    --db-instance-identifier my-prod-db 
    --engine postgres 
    --db-instance-class db.t3.micro 
    --master-username admin 
    --master-user-password secret99 
    --allocated-storage 20 
    --multi-az  # Ключевой параметр для Multi-AZ
# Terraform (aws_db_instance) для Multi-AZ
resource "aws_db_instance" "prod" {
  identifier        = "my-prod-db"
  engine           = "postgres"
  instance_class   = "db.t3.micro"
  allocated_storage = 20
  username         = "admin"
  password         = var.db_password

  multi_az         = true  # Включаем Multi-AZ
  backup_retention_period = 7
  skip_final_snapshot    = true
}

Важно: Multi-AZ — это решение для отказоустойчивости (High Availability), а не для масштабирования чтения. Для разгрузки запросов на чтение нужно использовать Read Replicas, которые могут быть развернуты в других AZ или регионах.