Fault tolerance — это, по сути, умение системы не разваливаться при первых же проблемах с железом, сетью или софтом. Что‑то сломалось, пара узлов отвалилась, диск умер, а сервис при этом продолжает жить и отдавать ответы, максимум — слегка проседает по перформансу, но не падает целиком.
Особенно больно отсутствие отказоустойчивости чувствуется в бизнес-критичных штуках: платёжки, биржи, госпорталы, медицинские системы, крупные SaaS, облака, дата-центры. Там простой — это уже не просто «ой, сайт не работает», а реальные деньги, штрафы и испорченные отношения с клиентами.
Как обычно добиваются отказоустойчивости #
- Дублируют всё, что может сломаться: запасные серверы, диски, сетевые линк-и, блоки питания, целые кластеры. Чем меньше у вас «единственных экземпляров», тем лучше.
- Failover — автоматическое переключение на резерв. Упал основной узел — трафик уходит на запасной, пользователи этого почти не замечают (если повезло).
- Self-healing — механизмы, которые сами перезапускают упавшие процессы, поднимают новые инстансы, перекладывают данные, меняют маршруты.
- Распределённая архитектура — проектирование так, чтобы не было единой точки отказа. Условный «один мастер на всё» — это обычно плохой знак.
- План на чёрный день — мониторинг, SLA, отработанные процедуры восстановления, алерты, инструкции «кто что делает, когда всё горит».
Как это выглядит вживую #
- Дата-центр: серверы с RAID’ами, двумя блоками питания, двумя линками в сеть, параллельные маршрутизаторы, дублированные стойки и так далее.
- Kubernetes: ReplicaSet/StatefulSet, несколько нодовых пулов по зонам, PDB, автоскейлинг. Один узел умер — поды уехали на другие.
- Облака: развёртывание в нескольких зонах (Multi-AZ), глобальные балансировщики, распределённые базы наподобие Aurora, Cosmos DB, Cloud Spanner.
- Сами приложения: circuit breaker’ы, ретраи, graceful degradation — когда часть функционала временно отключается, но ядро сервиса остаётся рабочим.
Зачем вообще городить это всё #
- Бизнес-процессы не встают: что‑то внутри ломается, а пользователи продолжают работать, максимум — с небольшим дискомфортом.
- SLA и регуляторы: банковские, телеком и гос-сервисы не могут «просто так» лежать часами — за это прилетают санкции.
- Деньги: каждая минута даунтайма у больших компаний реально стоит очень дорого.
- Инциденты разной природы: от кривых рук админа до DDoS и падения половины стойки в ДЦ — система должна переживать всё это без полного коллапса.
Отказоустойчивость — это не один магический продукт и не «поставьте галочку в настройках». Это набор архитектурных решений, избыточность, автоматизация и понимание, что именно у вас может сломаться и как вы это будете переваривать. На этом фундаменте строятся те самые системы, про которые говорят «да их вообще нереально уронить» — хотя внутри у них тоже что‑то постоянно ломается.
Типовые схемы отказоустойчивой архитектуры #
Active-Passive #
- Работает один активный узел, рядом с ним — тихий резерв, который просто синхронно/асинхронно получает данные.
- Если активный падает, срабатывает failover: резерв становится новым мастером.
- Из реальных примеров: PostgreSQL с Patroni и Etcd, либо управляемый AWS RDS в режиме Multi-AZ.
Active-Active #
- Несколько узлов одновременно обрабатывают запросы, нагрузка размазана по ним балансировщиком.
- Хорошо масштабируется по горизонтали, даёт и производительность, и отказоустойчивость.
- Типичные примеры: Kafka-кластер, ReplicaSet в Kubernetes, Redis Cluster.
Geo-Redundant #
- Одинаковые компоненты живут в разных регионах / странах.
- Это уже защита не от падения сервера, а от выноса целого дата-центра или региона.
- Классика жанра: AWS Route 53 с geo failover, гео-реплицированное хранилище вроде Azure GRS, плюс глобальные CDN.
Примеры конкретных конфигураций #
1. PostgreSQL (Active-Passive) с Patroni #
- Patroni следит за текущей ролью leader’а и его здоровьем.
- Etcd/Consul хранит состояние кластера и координирует выбор лидера.
- HAProxy держит единый endpoint для клиентов и перекидывает их на актуальный мастер.
- Failover обычно занимает считанные секунды — условные 2–10 секунд, если всё настроено нормально.
2. Kafka (Active-Active) #
- У каждого partition есть лидер и набор реплик.
- Продюсер пишет в лидера, консюмеры читают по выбранной стратегии, соблюдая порядок/гарантии.
- Лидер падает — Kafka автоматически назначает лидером одну из реплик, и кластер продолжает работать.
3. DNS Failover (AWS Route 53) #
resource "aws_route53_record" "failover" {
name = "app.example.com"
type = "A"
ttl = 60
records = [aws_instance.primary.public_ip]
failover = "PRIMARY"
set_identifier = "main"
health_check_id = aws_route53_health_check.primary.id
}
Когда health check видит, что основной IP не отвечает, Route 53 начинает выдавать вторичный адрес — трафик плавно уезжает на резерв.
Проверка отказоустойчивости: chaos engineering #
Chaos Engineering — это когда вы сознательно ломаете свою систему, чтобы убедиться, что она в целом выдерживает удар. Не «на бумаге всё красиво», а реально.
- Удалить pod в Kubernetes:
kubectl delete pod <name>— смотрим, насколько быстро он поднимется заново и как поведёт себя трафик. - Симулировать падение ноды: выключить VM или физический сервер и проверить, что нагрузка перераспределилась.
- Использовать Chaos Mesh / Litmus — фреймворки, которые умеют устраивать самые разные «поломки» в Kubernetes.
- Коммерческие инструменты вроде Gremlin или Steadybit: инъекция задержек, потеря пакетов, отключение сервисов по сценарию и так далее.
