Мультирегиональный деплой веб-приложения
Мультирегиональный деплой снижает задержку для пользователей в разных географических зонах, обеспечивает отказоустойчивость при региональных сбоях и может быть требованием по локализации данных (GDPR, 152-ФЗ).
Архитектурные паттерны
Active-Passive — один регион основной, второй получает трафик только при сбое. Просто, но failover не мгновенный (15–60 секунд).
Active-Active — оба региона принимают трафик одновременно. Сложнее: нужна синхронизация данных, решение конфликтов записи.
Read Replicas — записи только в основном регионе, чтение из ближайшего. Подходит для большинства веб-приложений с read-heavy нагрузкой.
AWS Multi-Region с Route 53
# Terraform: два EKS кластера
module "eks_eu" {
source = "terraform-aws-modules/eks/aws"
region = "eu-west-1"
cluster_name = "myapp-eu"
cluster_version = "1.29"
vpc_id = module.vpc_eu.vpc_id
subnet_ids = module.vpc_eu.private_subnets
managed_node_groups = {
main = {
instance_types = ["m6i.xlarge"]
min_size = 2
max_size = 10
desired_size = 3
}
}
}
module "eks_us" {
source = "terraform-aws-modules/eks/aws"
region = "us-east-1"
# аналогично
}
# Route 53: Latency-based routing
resource "aws_route53_record" "api" {
zone_id = var.hosted_zone_id
name = "api.mysite.com"
type = "A"
set_identifier = "eu-west-1"
latency_routing_policy {
region = "eu-west-1"
}
alias {
name = aws_lb.eu.dns_name
zone_id = aws_lb.eu.zone_id
evaluate_target_health = true
}
}
База данных: репликация между регионами
PostgreSQL с логической репликацией:
-- PRIMARY (eu-west-1)
CREATE PUBLICATION myapp_pub FOR ALL TABLES;
-- REPLICA (us-east-1)
CREATE SUBSCRIPTION myapp_sub
CONNECTION 'host=eu-primary.rds.amazonaws.com user=replicator password=secret dbname=myapp'
PUBLICATION myapp_pub;
AWS Aurora Global Database — управляемый вариант:
Primary Region: eu-west-1 (запись + чтение)
Secondary: us-east-1 (только чтение, ~1s lag)
Secondary: ap-southeast-1 (только чтение)
Failover Aurora Global: ~1 минута, автоматически через Route 53.
Kubernetes: мультирегиональный деплой
# ArgoCD ApplicationSet: деплой в несколько кластеров
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: myapp
namespace: argocd
spec:
generators:
- list:
elements:
- cluster: eks-eu-west-1
region: eu-west-1
db_host: aurora-eu.cluster.rds.amazonaws.com
- cluster: eks-us-east-1
region: us-east-1
db_host: aurora-us.cluster.rds.amazonaws.com
template:
metadata:
name: 'myapp-{{region}}'
spec:
project: default
source:
repoURL: https://github.com/myorg/myapp
targetRevision: HEAD
path: helm/myapp
helm:
values: |
region: {{region}}
database:
host: {{db_host}}
destination:
server: '{{cluster}}'
namespace: myapp
Stateless приложение
Для мультирегионального деплоя приложение должно быть stateless:
// НЕ хранить состояние в памяти процесса
// ПЛОХО:
const sessions = new Map<string, Session>(); // теряется при перезапуске
// ХОРОШО: Redis (с репликацией)
import { Redis } from '@upstash/redis';
const redis = new Redis({
url: process.env.UPSTASH_REDIS_URL!, // Upstash поддерживает мультирегион
token: process.env.UPSTASH_REDIS_TOKEN!,
});
async function getSession(sessionId: string): Promise<Session | null> {
return redis.get<Session>(`session:${sessionId}`);
}
Vercel/Netlify: Edge Network
Для Next.js/Nuxt самый простой мультирегиональный деплой — Vercel Edge Network:
// Серверные компоненты и API routes деплоятся как Edge Functions
// автоматически в 30+ регионах
// app/api/config/route.ts
export const runtime = 'edge'; // деплой на edge nodes по всему миру
export async function GET() {
const region = process.env.VERCEL_REGION ?? 'unknown';
return Response.json({ region });
}
Overhead на latency для EU→US: 100–150ms. Edge deployment: 5–20ms к пользователю.
Мониторинг мультирегионального деплоя
# Prometheus: метрики по регионам
labels:
region: eu-west-1
cluster: eks-eu
# Grafana dashboard: Request Rate by Region, Latency by Region
# Alertmanager: alert если один регион недоступен
Настройка Active-Active мультирегионального деплоя в двух AWS регионах с Aurora Global Database — 5–10 рабочих дней.







