Глобальные системы начинаются не с красивой карты регионов, а с честного разговора о географии отказов, задержке и пределах консистентности.
Для реальных проектных решений глава помогает увидеть, как multi-region topology, routing policy, стратегия репликации (replication strategy), disaster recovery и legal constraints должны складываться в одну модель системы, а не жить набором независимых решений по регионам.
Для интервью и инженерных разборов она полезна тем, что помогает объяснять цену глобализации через write conflicts, сложность эксплуатации, рост инфраструктурного бюджета и более дорогую операционную дисциплину.
Практическая польза главы
Практика проектирования
Определяйте multi-region topology под latency, legal constraints и recovery objectives.
Качество решений
Согласовывайте routing policy, стратегию репликации (replication strategy) и consistency model между регионами.
Аргументация на интервью
Показывайте decision flow: active-active vs active-passive, failover policy, data residency.
Формулировка компромиссов
Объясняйте стоимость глобализации: сложность эксплуатации, write-conflicts и рост инфраструктурного бюджета.
Контекст
Cloud Native Overview
База по облачно-ориентированным принципам, поверх которых строится межрегиональный дизайн.
Межрегиональные и глобальные системы — это сервисы, которые должны пережить падение целого региона и при этом держать предсказуемую задержку для пользователей по всему миру. Развернуть копии в нескольких регионах — простая часть; трудная начинается, когда задержка, доступность, консистентность, стоимость и соответствие регуляторным требованиям (compliance) тянут проект в разные стороны и за каждый выигрыш приходится чем-то платить.
Базовые межрегиональные топологии
Пользователи
web / mobile
Глобальная маршрутизация
Geo DNS + health
Основной регион
Приложение
основной путь
База данных
единственная запись
Резервный регион
standby app
резервный путь
реплика БД
асинхронная репликация
Когда подходит
Простой старт для большинства B2B/B2C систем с одним основным регионом.
Компромисс
Ниже операционная сложность, но выше RTO/RPO и хуже задержка для пользователей далеко от основного региона.
Фокус эксплуатации
Автоматизация переключения и возврата, плюс проверка целостности данных после подъёма резерва.
Суть схемы: Один регион обслуживает основную нагрузку, второй остаётся резервным и включается при деградации основного региона.
Эти три схемы — не учебная абстракция: каждую реализует конкретная промышленная система, и дальше в главе мы разберём их подробно. Сопоставление полезно держать перед глазами:
Active-Passive
Aurora Global Database
Один writer-регион, storage-репликация во вторичные, управляемое продвижение резерва — учебная реализация паттерна.
Active-Active
DynamoDB Global Tables; Spanner — кворумный вариант
Global Tables принимают записи во всех регионах и платят конфликтами по стратегии «последняя запись побеждает» (LWW); Spanner делает active-active строгим — ценой кворумного и паузы коммита (commit-wait) на каждой записи.
Geo-partitioned
CockroachDB REGIONAL BY ROW; region-pinning тенантов на уровне приложения
Данные закрепляются за домашним регионом строки или арендатора: локальные операции быстры, межрегиональные — явные и редкие.
Данные
Azure latency stats
Публичная таблица межрегиональных P50-задержек Azure — обновляется по реальным замерам магистральной (backbone) сети.
Физика расстояний: межрегиональные задержки
Любой разговор о глобальной архитектуре начинается с одного числа — между регионами. Это нижняя граница для каждой синхронной операции через границу региона: ни , ни репликация, ни не могут быть быстрее. Ориентиры по публичным P50-замерам облачных провайдеров (Azure, июнь 2025; матрица AWS у cloudping.co даёт близкие значения):
US East ↔ US West
~60–70 мсОдин континент: синхронная репликация возможна, но уже съедает заметную часть бюджета задержки.
US East ↔ Западная Европа
~75–85 мсКлассическая трансатлантическая пара: P50 East US ↔ North Europe ≈ 74 мс, ↔ West Europe ≈ 85 мс.
US East ↔ Токио
~165 мсТранстихоокеанский маршрут: кворумная запись через эту пару не уложится в интерактивный бюджет.
US East ↔ Сингапур
~220–230 мсПочти четверть секунды на один обмен — любой протокол с двумя раундами уже стоит ~0.5 с.
Западная Европа ↔ Сингапур
~150–165 мсМаршрут идёт через Ближний Восток или вокруг Индии — длиннее дуги большого круга.
US East ↔ Сан-Паулу
~115–120 мсСеверо-южные маршруты дороже, чем кажется по карте: меньше кабелей, меньше прямых путей.
Что эти числа делают с архитектурой
Синхронная репликация = минимум 1 на фиксацию
Каждая запись, которую нужно подтвердить во втором регионе до ответа клиенту, не может быть быстрее межрегионального . Через Атлантику это ≥75 мс к любой логике приложения.
Кворум платит до ближайшего большинства
При трёх регионах лидеру достаточно подтверждения одной из двух остальных реплик: задержку записи определяет ближайший сосед, а не самый дальний. Поэтому регионы кворума выбирают «кучно» — например, три региона в одной части света.
Двухфазная фиксация поверх регионов ≥ 2
Фазы подготовки и фиксации — два межрегиональных раунда. Транзакция, затрагивающая шарды в Европе и Азии, стоит ≥300 мс только на сеть — до любых блокировок и записи на диск.
Физика не торгуется
Свет в оптоволокне проходит ~200 000 км/с: ~1 мс на 100 км в одну сторону. Нью-Йорк — Сингапур по дуге ~15 000 км, теоретический ~150 мс; реальные маршруты кабелей дают 220+.
Отсюда главное правило проектирования: бюджет задержки расходуется не на «среднюю» операцию, а на самую глубокую цепочку синхронных межрегиональных обменов. Если запись должна быть подтверждена через океан, бюджет в 200 мс уже исчерпан одной только сетью — всё остальное (кэши, асинхронная репликация, локальные кворумы) существует, чтобы такие обмены не попадали на горячий путь.
Рамка принятия решений
- Бюджет задержки: какое p95-время ответа и 99-й перцентиль допустимы в каждом регионе.
- Целевой уровень доступности: какая деградация приемлема при падении целого региона.
- Модель консистентности: где нужна строгая консистентность, а где достаточно итоговой консистентности.
- Суверенитет данных: где физически можно хранить и обрабатывать данные.
- Профиль стоимости: сколько стоит межрегиональная репликация, исходящий сетевой трафик (egress) и резервная ёмкость.
Theory
CAP Theorem
При глобальном partition архитектура должна явно выбрать приоритеты CP/AP.
Слой данных: репликация и консистентность
Single-writer + read replicas
Хорошая базовая архитектура для транзакционной обработки (OLTP) с понятной моделью консистентности и управляемым переключением на резерв.
Multi-primary with conflict resolution
Подходит для глобальных нагрузок с преобладанием записи, но требует чёткой стратегии слияния, стратегии «последняя запись побеждает» или модели «бесконфликтно реплицируемый тип данных» (CRDT).
Regional sharding
Разделение арендаторов и доменов данных по регионам уменьшает задержку и стоимость, повышает изоляцию отказов.
Двойная запись недопустима без координации
Пишите через outbox-паттерн, событийную шину или согласованный слой репликации, иначе получите рассинхрон и потери.
Механика
Консенсус: Paxos и Raft
Кворумные записи Spanner и CockroachDB — это Paxos/Raft, растянутые на регионы.
Как это решают реальные системы
Четыре промышленные системы покрывают почти всё пространство компромиссов: от с платой за каждый кворум до с . Полезно читать каждую карточку по одной схеме: модель согласованности → механизм → цена.
Google Spanner
Модель согласованности
Внешняя согласованность: если транзакция T2 началась после фиксации T1, метка времени T2 строго больше — никакой клиент не увидит эффект T2 без T1.
Механизм
TrueTime: API времени возвращает не момент, а интервал неопределённости [earliest, latest], который GPS-приёмники и атомные часы в каждом дата-центре удерживают в пределах ~7 мс. Запись проходит через Paxos-группу шарда, а перед тем как сделать её видимой, лидер выдерживает паузу коммита (commit-wait) — ждёт, пока верхняя граница интервала гарантированно окажется в прошлом (в среднем единицы миллисекунд).
Цена
Каждая фиксация платит кворумный между регионами реплик плюс паузу коммита (commit-wait); нужна специализированная инфраструктура часов; размещение лидеров шардов приходится проектировать под географию записей.
Топология
Кворумная active-active: лидеры шардов распределены по регионам, чтение — из ближайшей реплики (строгое или заведомо устаревшее).
DynamoDB Global Tables
Модель согласованности
Согласованность в конечном итоге между регионами (режим MREC по умолчанию); строгое чтение доступно только внутри региона.
Механизм
Полностью активная-активная репликация: каждая региональная реплика принимает записи локально, изменения асинхронно доезжают до остальных регионов обычно быстрее чем за секунду. Конкурентные записи одного элемента разрешаются по принципу «последняя запись побеждает» — по внутренней метке времени, по каждому элементу отдельно.
Цена
Проигравшая конкурентная запись теряется молча — приложение должно либо исключать конфликты (region-pinning ключей), либо переживать их. Режим MRSC добавляет строгую согласованность: запись синхронно подтверждается ещё минимум одним регионом — ценой межрегионального и явных ошибок конфликта (ReplicatedWriteConflictException).
Топология
Каноническая active-active: все регионы равноправно принимают и чтения, и записи.
Aurora Global Database
Модель согласованности
Single-writer: один первичный регион принимает записи, до пяти вторичных обслуживают только чтение с отставанием обычно меньше секунды.
Механизм
Репликация на уровне слоя хранения: изменения уезжают во вторичные регионы по выделенной инфраструктуре storage-слоя, не отнимая ресурсы у самих БД. Write forwarding позволяет приложению во вторичном регионе отправлять записи — Aurora прозрачно перешлёт их первичному.
Цена
Асинхронность означает ≈ 1 с: при потере первичного региона последние записи могут пропасть. < 1 мин при управляемом . Пользователи далеко от первичного региона платят полным межрегиональным за каждую запись.
Топология
Active-passive (точнее, active + вторичные в режиме только для чтения): главный паттерн — аварийное восстановление (DR) и локальное чтение, не глобальная запись.
CockroachDB
Модель согласованности
Сериализуемые транзакции всегда — вопрос не «какая согласованность», а «где живёт задержка». Вместо TrueTime — гибридные логические часы с настраиваемым максимумом рассинхронизации.
Механизм
Таблицы с локальностью REGIONAL BY ROW: каждая строка получает скрытую колонку crdb_region — «домашний» регион, куда помещается владелец аренды её диапазона и голосующие реплики. Survival goal задаёт цену: ZONE держит весь кворум в домашнем регионе (локальная запись, но регион — точка отказа), REGION растягивает кворум по регионам (переживает регион, но каждая запись платит до ближайшего соседа). Follower reads (AS OF SYSTEM TIME) читают слегка устаревшие данные с ближайшей реплики, не обращаясь к владельцу аренды.
Цена
Явный выбор на уровне базы: либо региональная выживаемость, либо локальная задержка записи — не оба сразу. Чтения с ближайшей реплики жертвуют свежестью.
Топология
Geo-partitioned с настраиваемым перекосом: строки живут там, где их пользователи.
Обратите внимание на закономерность: Spanner и CockroachDB кладут цену согласованности в задержку записи (кворум + под контролем), DynamoDB — в потерянные конфликты, Aurora — в и единственный writer-регион. Бесплатного варианта в таблице нет — есть выбор, какой валютой платить.
Глобальная маршрутизация трафика
- Geo-DNS поверх системы доменных имен (DNS) направляет входящий запрос в регион с наименьшей задержкой — но решает это резолвер клиента, поэтому реакция измеряется минутами, а не секундами.
- Управление трафиком с учётом проверки работоспособности (health check) убирает деградировавший регион из ротации быстро — но только если проверки действительно ловят его болезнь, а не просто ping.
- Липкая маршрутизация держит сессию и кэш пользователя в одном регионе: меньше промахов кэша и кросс-региональных обращений, но при переключении на резерв привязку придётся явно сбросить.
- Глобальный шлюз API и edge-слой задают единое место, где живут политики резервного сценария (fallback) и частичной аварии, — иначе каждый сервис изобретает свою деградацию, и поведение системы в инциденте становится непредсказуемым.
Контекст
Google Global Network
Эникаст-фронты и собственная глобальная сеть WAN — то, что делает быстрое региональное переключение на резерв физически возможным.
Механика регионального переключения на резерв
«Регион упал — трафик ушёл в соседний» звучит как одно действие, но состоит из трёх разных задач: как быстро мир узнаёт о переключении, что происходит с данными при разделении и сколько стоит ёмкость, которая ждёт аварии. Начнём с первой — бывает двух принципиально разных видов.
Health-based DNS
МинутыПроверки работоспособности снимают деградировавший регион с -ответов (Route 53-стиль). Но решение исполняют клиентские резолверы: пока не истечёт время жизни (TTL) — а часть резолверов игнорирует TTL — трафик продолжает идти в мёртвый регион.
Скорость переключения ограничена кэшами, которыми вы не управляете.
Anycast
Секунды — десятки секундОдин и тот же IP анонсируется по из многих точек мира; переключение происходит на сетевом уровне, минуя клиентские -кэши. AWS Global Accelerator обнаруживает нездоровый эндпоинт за доли секунды и перенаправляет новые соединения, обычно в пределах десятков секунд; так же работают фронты Google и Cloudflare.
Адрес не меняется — меняется то, куда сеть его ведёт.
Первый вариант опирается на поверх обычной , второй — на -маршрутизацию. На практике их комбинируют: эникаст-фронт для скорости, — как независимый запасной рычаг, который работает, даже если сломался сам эникаст-слой.
Split-brain: два региона, обе «живые» половины
Худший сценарий — не отказ региона, а между регионами, при котором обе стороны считают себя выжившими. Если каждая продолжает принимать записи как первичная, возникает : две расходящиеся истории данных, которые после восстановления связи нельзя слить автоматически без потерь.
- Кворумный арбитр. Нечётное число участников: третий регион (или лёгкий witness-узел) даёт большинство ровно одной стороне разделения — вторая обязана перестать принимать записи.
- Fencing. Продвижение нового первичного сопровождается токеном эпохи; старый первичный с устаревшим токеном физически не может записать — даже если он ещё «думает», что главный.
- Асимметрия по умолчанию. Для CP-частей системы правило простое: лучше отклонить запись в меньшинстве, чем принять её дважды. AP-части (DynamoDB Global Tables) сознательно выбирают обратное — и платят конфликтами.
Region evacuation: переключение как рутина
Зрелые операторы относятся к выводу региона из работы не как к катастрофе, а как к управляемой процедуре — region evacuation: постепенный слив трафика (drain) в соседние регионы, наблюдение за ошибками и насыщением, возможность мгновенного отката. Google регулярно прогоняет такие эвакуации в учениях DiRT, а без реального слива трафика считаются неполными: процедура, исполняемая только на бумаге, в реальной аварии не сработает. Ключевой вопрос эвакуации — не «куда уйдёт трафик», а «есть ли у соседей ёмкость его принять».
2 региона active-active
Каждый регион утилизирован ≤50%Любой из двух должен мгновенно принять 100% глобальной нагрузки — половина купленной ёмкости простаивает в обычный день.
3 региона active-active
Каждый регион утилизирован ≤66%Выживающая пара делит нагрузку погибшего: запас ёмкости — 1/(N−1) от нормальной доли каждого региона.
Active-passive с «тёплым» резервом
Резерв дешевле, но целевое время восстановления (RTO) длиннееМинимальный footprint в резерве (данные + уменьшенный compute) снижает счёт, но добавляет время на масштабирование при аварии — и риск, что резерв не отмасштабируется, когда все побежали в один регион.
Это и есть цена «горячего» резерва: чем меньше регионов, тем больше невидимой ёмкости оплачивается каждый день. Она конкурирует со стоимостью на репликацию — в сумме они часто оказываются дороже самих вычислений, и именно их считают в первую очередь при выборе между active-active и тёплым резервом.
Аварийное восстановление, переключение на резерв и операционная готовность
Определите целевое время восстановления (RTO) и целевую точку восстановления (RPO) по каждому критичному сервису и базе данных.
Проверяйте переключение на резерв и возврат регулярно через учения по отказу (game days), а не только на бумаге.
Автоматизируйте продвижение резервного региона и проверку целостности данных после переключения.
Держите инструкцию: кто, когда и по каким сигналам инициирует региональное переключение на резерв.
Разделяйте граф зависимостей, чтобы региональная авария не каскадировала глобально.
Непротестированное переключение на резерв — это не отказоустойчивость, а гипотеза о ней: без регулярных учений архитектура остаётся «теоретически» надёжной ровно до первой настоящей аварии.
Theory
PACELC
Residency добавляет третью ось к компромиссу задержка/консистентность: где данным разрешено находиться.
Территориальное размещение данных как архитектурное ограничение
— единственное требование в этой главе, которое нельзя «купить» задержкой или деньгами: если закон или контракт требует, чтобы данные жителей ЕС физически не покидали ЕС, это инвариант слоя данных, а не настройка. Технически он реализуется через region-pinning — закрепление строк или арендаторов за домашним регионом, то есть через ту же механику, что и , только выбор региона диктует регулятор, а не задержка.
CockroachDB REGIONAL BY ROW: домашний регион строки определяет, где живут её кворум и владелец аренды. Данные жителя ЕС физически остаются в регионах ЕС.
Маршрутизация по арендатору на шлюзе: каждый тенант приписан к домашнему региону, его запросы и данные не покидают регион; глобальным остаётся только справочник «тенант → регион».
Отдельные региональные стеки (например, изолированный контур для ЕС): максимальная изоляция и простая аргументация перед регулятором — ценой дублирования эксплуатации.
Вариант с арендатором опирается на на уровне глобального шлюза — и это обманчиво простая часть. Сложная часть — следствия, которые residency накладывает на всё остальное:
- Глобальная уникальность (e-mail, username) требует межрегиональной координации или глобального справочника — это единственное место, где residency-архитектура всё же платит межрегиональным временем прохождения туда и обратно (RTT).
- Перенос пользователя или тенанта между регионами — явный бизнес-процесс с миграцией данных, а не смена флага.
- Аналитика и ML собирают агрегаты или анонимизированные данные, а не сырые записи: пайплайны тоже обязаны уважать границы.
- Резервные копии и журналы репликации наследуют ограничение — бэкап «в другой регион для надёжности» может оказаться нарушением.
References
- Google Cloud Architecture Framework: Reliability
- AWS Well-Architected: Reliability Pillar
- Azure Well-Architected Framework: Reliability
- Azure network round-trip latency statistics (P50 between regions)
- Spanner: Google's Globally-Distributed Database (OSDI 2012)
- Spanner: TrueTime and external consistency
- Amazon DynamoDB global tables: how it works
- Amazon Aurora Global Database
- CockroachDB: Table Localities
- AWS Global Accelerator: how it works
Связанные главы
- Cloud Native Overview - Базовые принципы облачно-ориентированных архитектур и операционных практик.
- Kubernetes Fundamentals - Механики управления несколькими кластерами, поэтапного запуска и устойчивости рабочих нагрузок.
- CAP Theorem - Фундаментальные ограничения распределённых систем при сетевом разделении.
- PACELC - Почему за выбор между задержкой и консистентностью система платит и в обычном режиме, а не только при сетевом разделении.
- Консенсус: Paxos и Raft - Как договариваться о состоянии в отказоустойчивом кластере.
- Google Global Network - Эволюция глобальной сети и подходы к WAN как стратегическому активу.
- Cost Optimization & FinOps - Как считать стоимость межрегиональных решений и долгосрочные компромиссы.
- Инженерия надёжности сервисов - Инциденты, целевой уровень сервиса (SLO) и эксплуатация сложных систем в рабочей среде.
