Redundancy, или избыточность, — это принцип проектирования IT-инфраструктуры, при котором ключевые компоненты системы дублируются для обеспечения её непрерывной работы в случае сбоев или отказов. Цель избыточности — исключить единичные точки отказа и повысить устойчивость всей архитектуры.
Избыточность может быть реализована на разных уровнях: аппаратном, сетевом, программном и инфраструктурном. На практике это означает наличие резервных серверов, дисковых массивов, блоков питания, маршрутизаторов, сетевых подключений и даже дата-центров.
Один из наиболее показательных кейсов — сетевой redundancy, особенно в контексте ISP redundancy, когда организация подключена к интернету сразу через нескольких независимых провайдеров. Это позволяет сохранить доступность внешних сервисов даже при полном выходе из строя одной линии связи.
В облачных системах применяется cloud redundancy — дублирование виртуальных машин, баз данных и сервисов в рамках одного региона или между разными зонами доступности. Это минимизирует риск потери данных и обеспечивает быстрое восстановление при сбоях.
Redundancy тесно связана с концепцией High Availability (HA) и служит её технической основой. Без дублирования систем невозможно гарантировать стабильный SLA и восстановление после инцидентов в пределах допустимого времени.
На уровне архитектуры redundancy может включать:
- отказоустойчивые кластеры,
- репликацию данных,
- автоматический failover и балансировку нагрузки,
- активные и пассивные резервные компоненты,
- геораспределённые среды.
Современные инфраструктуры, особенно в критически важных секторах (финансы, телеком, медицина, государственные ИТ-системы), изначально проектируются с учётом избыточности. Это уже не дополнительная функция, а базовый стандарт надёжной, предсказуемой и управляемой IT-среды.
Типы избыточности
1. Active-Active
Оба (или все) компонента работают одновременно и обрабатывают нагрузку. При выходе одного из них система продолжает работу на оставшихся.
Пример: два балансировщика, каждый обслуживает часть трафика.
2. Active-Passive
Один компонент активен, второй находится в режиме ожидания. При сбое активного — пассивный автоматически подхватывает работу (failover).
Пример: основная база данных + реплика, готовая к переключению.
3. N+1 / N+N
- N+1 — система работает на N элементах, плюс один в резерве.
- N+N — все элементы дублируются, нагрузка полностью может быть перераспределена.
Примеры реализации
В облаках:
- AWS:
- Multi-AZ размещение для RDS (автоматический failover между зонами доступности);
- Elastic Load Balancer с несколькими EC2-инстансами в разных зонах.
- Azure:
- Availability Sets и Availability Zones для защиты от отказов на уровне оборудования и ЦОД;
- Geo-redundant storage (GRS) — автоматическая репликация данных между регионами.
- Google Cloud:
- Global Load Balancer с бэкендами в нескольких регионах;
- Cloud SQL high availability с репликацией и автоматическим перезапуском.
В Kubernetes:
- ReplicaSets обеспечивают избыточность подов;
- PodDisruptionBudgets (PDB) гарантируют, что минимальное число подов останется доступным при обновлении;
- Node pools в разных зонах — защита от сбоя одного дата-центра;
- HA control plane — отказоустойчивый управляющий уровень (например, в managed EKS/GKE).
Реальные примеры:
- Terraform-модуль с избыточной инфраструктурой (AWS, EC2 в двух зонах)
- YAML-манифест ReplicaSet в Kubernetes
- Схема failover через DNS + Anycast
1. Terraform: EC2 в двух зонах (N+1 избыточность)
provider "aws" { region = "us-east-1" } resource "aws_instance" "web" { count = 2 ami = "ami-0c55b159cbfafe1f0" instance_type = "t3.micro" availability_zone = element(["us-east-1a", "us-east-1b"], count.index) tags = { Name = "web-${count.index}" } }
📌 Этот код запускает два инстанса в разных зонах AWS. Даже если одна зона выйдет из строя, второй инстанс останется доступным.
2. ReplicaSet в Kubernetes (избыточность подов)
apiVersion: apps/v1 kind: ReplicaSet metadata: name: web-rs spec: replicas: 3 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: nginx image: nginx:1.25 ports: - containerPort: 80
📌 Здесь Kubernetes гарантирует, что в любой момент времени будет работать 3 пода. Если один падает — создаётся новый автоматически.
3. DNS + Anycast (логика failover по географии)
Anycast — это способ назначения одного IP-адреса сразу нескольким узлам в разных географических точках. DNS-сервер или маршрутизатор направляет пользователя к ближайшему или работающему инстансу.
Сценарий:
- Один сервис с IP объявлен в Европе, Азии и США;
203.0.113.1
- Пользователь из Франции получает ответ с ближайшего европейского PoP;
- При отказе узла в Европе трафик перенаправляется в США автоматически — без изменения DNS-записей.
📌 Используется в CDN, глобальных DNS, маршрутизации отказоустойчивых API (например, Cloudflare, Google Public DNS).
Вот ещё одно расширение — полный шаблон избыточной архитектуры с Terraform и Helm, включающий:
- EC2-инстансы в разных зонах (Terraform)
- Kubernetes-кластер с ReplicaSet и PodDisruptionBudget (Helm/YAML)
- DNS failover с AWS Route 53 (Terraform)
1. Terraform: EC2-инстансы с балансировкой и health check
resource "aws_lb" "web_alb" { name = "web-load-balancer" internal = false load_balancer_type = "application" subnets = [aws_subnet.public_a.id, aws_subnet.public_b.id] } resource "aws_lb_target_group" "web_tg" { name = "web-targets" port = 80 protocol = "HTTP" vpc_id = aws_vpc.main.id health_check { path = "/" interval = 30 timeout = 5 healthy_threshold = 2 unhealthy_threshold = 2 } } resource "aws_lb_listener" "http" { load_balancer_arn = aws_lb.web_alb.arn port = "80" protocol = "HTTP" default_action { type = "forward" target_group_arn = aws_lb_target_group.web_tg.arn } } resource "aws_lb_target_group_attachment" "web_instances" { count = 2 target_group_arn = aws_lb_target_group.web_tg.arn target_id = aws_instance.web[count.index].id port = 80 }
2. Helm / Kubernetes: ReplicaSet + PodDisruptionBudget
apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: web-pdb spec: minAvailable: 2 selector: matchLabels: app: web
📌 PDB гарантирует, что как минимум 2 пода будут живы даже при плановом обновлении или удалении узлов.
3. Terraform: Route 53 DNS Failover
resource "aws_route53_health_check" "web" { fqdn = "web.example.com" port = 80 type = "HTTP" resource_path = "/" failure_threshold = 3 request_interval = 30 } resource "aws_route53_record" "web_failover_primary" { zone_id = aws_route53_zone.main.zone_id name = "web.example.com" type = "A" ttl = 60 set_identifier = "primary" failover = "PRIMARY" health_check_id = aws_route53_health_check.web.id records = [aws_instance.web[0].public_ip] } resource "aws_route53_record" "web_failover_secondary" { zone_id = aws_route53_zone.main.zone_id name = "web.example.com" type = "A" ttl = 60 set_identifier = "secondary" failover = "SECONDARY" records = [aws_instance.web[1].public_ip] }
📌 Если основной инстанс не проходит health check — DNS автоматически направляет трафик на вторичный.
И финальный элемент — GitOps-доставка избыточной инфраструктуры через Argo CD, где:
- инфраструктура описана кодом (Terraform, Helm),
- доставка в Kubernetes автоматизирована,
- компоненты разворачиваются с высокой доступностью.
📂 Структура Git-репозитория (mono-repo вариант)
infrastructure/ ├── terraform/ │ ├── main.tf │ ├── variables.tf │ └── route53_failover.tf └── k8s/ ├── base/ │ ├── helm-release.yaml # HelmRelease или Application │ ├── pdb.yaml │ └── replicas.yaml └── overlays/ ├── staging/ └── production/
📄 Пример Argo CD Application
(GitOps HA деплой)
Application
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: web-ha namespace: argocd spec: project: default source: repoURL: https://github.com/my-org/infrastructure targetRevision: main path: k8s/base helm: values: | replicaCount: 3 pdb: enabled: true minAvailable: 2 destination: server: https://kubernetes.default.svc namespace: web syncPolicy: automated: prune: true selfHeal: true syncOptions: - CreateNamespace=true
Что это делает:
- Разворачивает Helm-чарт с ;
replicaCount: 3
- Включает с
PodDisruptionBudget
;minAvailable: 2
- Гарантирует, что при обновлениях или сбоях сервис не прерывается;
- Использует Argo CD как GitOps-контроллер: любое изменение в автоматически применится в кластере;
values.yaml
- Поддерживает self-healing: Argo CD откатывает ручные изменения, если они расходятся с Git.
Добавочно: CI/CD-пайплайн для GitOps
- Изменения в или
k8s/base/
идут через Pull Request;terraform/
- CI запускает + линтер Helm чарта (
terraform plan
);helm lint
- После ревью и merge Argo CD автоматически подхватывает изменения;
- Стейт Terraform хранится удалённо (например, S3 с DynamoDB lock).