Репликация в Stronghold работает на двух уровнях: внутри одного кластера и между кластерами. Всего есть четыре варианта — от базовой отказоустойчивости в CE до межкластерных Performance и DR в EE.
Схемы ниже упрощены и показывают направление запросов и репликации, а не сетевую разводку.
Объекты архитектуры
Чтобы схемы читались однозначно, важно различать два уровня объектов и два вида связей между ними.
- Узел (node) — отдельный экземпляр Stronghold: процесс на своём сервере или в своём поде со своей копией хранилища. В каждый момент внутри кластера ровно один узел активный (обрабатывает запись), остальные — standby.
- Кластер (cluster) — группа узлов поверх общего integrated Raft storage, работающая как единое целое. Клиенты обращаются к кластеру, а не к конкретному узлу. Кластер — минимальная единица межкластерной репликации: реплицируется кластер целиком, а не отдельный узел.
Связи бывают тоже двух видов, и их нельзя путать.
- Между узлами одного кластера — Raft. Активный узел постоянно реплицирует изменения хранилища на standby-узлы по протоколу Raft. Это внутрикластерная синхронизация: она обеспечивает отказоустойчивость и не требует отдельной настройки репликации.
- Между кластерами — репликация. Разные кластеры (как правило, на разных площадках) обмениваются данными через межкластерную репликацию: primary отдаёт поток изменений на secondary, а secondary перенаправляет клиентские записи обратно на primary. Именно это и есть Performance или DR, и это настраивается администратором.
Коротко: Raft связывает узлы внутри кластера, репликация связывает кластеры между собой.
Обозначения на схемах
| Обозначение | Что это |
|---|---|
A | Активный узел (active) — принимает запись |
S | Standby-узел — резерв (в CE запросы не обслуживает, а перенаправляет на Активный узел) |
PS | Performance standby — standby-узел в EE, обслуживает локальные чтения |
Сравнение вариантов
| Вариант | Уровень | Назначение | Неактивные узлы или резерв | Редакция |
|---|---|---|---|---|
| HA: репликация хранилища | Внутри кластера | Отказоустойчивость узлов | standby-узлы, перенаправляют все запросы на активный узел | CE и EE |
| Performance standby | Внутри кластера | Масштабирование чтений | standby-узлы читают локально, запись — на активный узел | EE |
| Disaster Recovery | Между кластерами | Горячий резерв и аварийное переключение | secondary-кластер не обслуживает клиентов, ждёт promote | EE, только Standalone |
| Performance | Между кластерами | Масштабирование и распределение чтений | secondary-кластеры читают локально, запись — на primary | EE, только Standalone |
Внутри одного кластера
HA: репликация хранилища (CE)
Базовый вариант. В HA-кластере на integrated Raft storage данные реплицируются между всеми узлами: один узел активный, остальные — standby. Standby-узлы дают отказоустойчивость: при отказе активного один из них становится активным. В CE standby-узлы не обслуживают запросы — они перенаправляют всё на активный узел.
┌───────────────── КЛАСТЕР (HA, Raft) ──────────────────┐
│ │
│ запись/чтение ─▶ ┌──────────────┐ │
│ │ ACTIVE-узел │ │
│ └──────┬───────┘ │
│ │ репликация хранилища (Raft)│
│ ┌──────┴───────┐ │
│ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ │
│ │ standby │ │ standby │ │
│ │ (резерв)│ │ (резерв)│ │
│ └─────────┘ └─────────┘ │
│ все запросы перенаправляются на активный узел │
└───────────────────────────────────────────────────────┘Performance standby (EE)
Тот же HA-кластер, но в EE неактивные узлы работают как performance standby: обслуживают чтения локально, а записи перенаправляют на активный узел. Это надстройка над HA — она распределяет нагрузку чтения внутри кластера, не создавая отдельный кластер.
┌───────────────────── КЛАСТЕР (HA, EE) ─────────────────┐
│ │
│ запись ─────▶ ┌──────────────┐ │
│ │ ACTIVE-узел │ ◀── запись (перенапр.)│
│ │ чтение+запись│ │
│ └──────┬───────┘ │
│ │ синхронизация (Raft) │
│ ┌──────┴───────┐ │
│ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ │
│ чтение ─▶│ PS │ │ PS │◀─ чтение │
│ │ локально│ │ локально│ │
│ └─────────┘ └─────────┘ │
└────────────────────────────────────────────────────────┘Подробнее — на странице Performance standby.
Между кластерами
Межкластерная репликация доступна только в EE и только в Standalone-установке. Каждый кластер в такой схеме — это отдельный HA-кластер. На схемах ниже A — активный узел сверху, PS — standby-узлы под ним: так как кластеры EE, эти узлы работают как performance standby и обслуживают локальные чтения. Стрелки внутри кластера показывают синхронизацию узлов через Raft.
Disaster Recovery
DR primary обслуживает клиентов и полностью копирует своё хранилище на DR secondary. Secondary клиентов не обслуживает и ждёт promote. При отказе primary secondary повышают, и он принимает нагрузку.
┌───── DR PRIMARY (HA) ─────┐
│ ┌──┐ │
│ │A │ │
│ └┬─┘ │
│ ┌──┴──┐ │
│ ▼ ▼ │
│ ┌──┐ ┌──┐ │
│ │PS│ │PS│ │
│ └──┘ └──┘ │
│ обслуживает клиентов │
└─────────────┬─────────────┘
│ поток изменений (всё хранилище)
▼
┌──── DR SECONDARY (HA) ────┐
│ ┌──┐ │
│ │A │ │
│ └┬─┘ │
│ ┌──┴──┐ │
│ ▼ ▼ │
│ ┌──┐ ┌──┐ │
│ │ S│ │ S│ │
│ └──┘ └──┘ │
│ ждёт promote │
└───────────────────────────┘
Отказ primary ── promote ──▶ DR SECONDARY становится PRIMARYПорядок promote и возврата прежнего primary — на странице Disaster recovery.
Performance
Один primary принимает записи и раздаёт изменения на несколько performance-secondary. Клиенты читают с ближайшего secondary локально, а записи secondary перенаправляет на primary. Подходит для гео-распределения и снижения задержек чтения. Secondary-кластеров может быть несколько — primary раздаёт изменения всем.
┌────── PRIMARY (HA) ───────┐
│ ┌──┐ │
│ │A │ │
│ └┬─┘ │
│ ┌──┴──┐ │
│ ▼ ▼ │
│ ┌──┐ ┌──┐ │
│ │PS│ │PS│ │
│ └──┘ └──┘ │
│ чтение и запись │
└─────────────┬─────────────┘
│ поток изменений (всем secondary)
┌──────────────┴───────────────┐
▼ ▼
┌──── SECONDARY (perf) ─────┐ ┌──── SECONDARY (perf) ─────┐
│ ┌──┐ │ │ ┌──┐ │
│ │A │ │ │ │A │ │
│ └┬─┘ │ │ └┬─┘ │
│ ┌──┴──┐ │ │ ┌──┴──┐ │
│ ▼ ▼ │ │ ▼ ▼ │
│ ┌──┐ ┌──┐ │ │ ┌──┐ ┌──┐ │
│ │ S│ │ S│ │ │ │ S│ │ S│ │
│ └──┘ └──┘ │ │ └──┘ └──┘ │
│ чтение локально │ │ чтение локально │
│ запись → primary │ │ запись → primary │
└───────────────────────────┘ └───────────────────────────┘Каждый кластер (и primary, и secondary) — это HA-кластер: активный узел A синхронизирует данные со standby-узлами по Raft, а в EE эти standby работают как performance standby (PS) и обслуживают локальные чтения. Primary принимает записи клиентов и раздаёт поток изменений всем secondary. Secondary обслуживают чтения локально, а записи перенаправляют на primary.
Отдельным secondary можно ограничить набор реплицируемых данных фильтрами путей.
Комбинированные топологии
Режимы независимы и совмещаются:
- Один primary — оба режима сразу. Кластер может одновременно быть performance primary и DR primary: раздавать данные на performance-secondary и держать DR-резерв.
- Каждый кластер — сам HA. Primary и secondary в межкластерных схемах — это полноценные HA-кластеры; в EE их standby-узлы обслуживают чтения как performance standby.
- Несколько secondary. У одного primary может быть много secondary-кластеров — и performance, и DR.
┌───────────────────────┐
клиенты ───────▶ │ PRIMARY │
│ performance primary │
│ + DR primary │
└───────┬───────┬───────┘
performance │ │ DR
(масштаб чтений) │ │ (горячий резерв)
▼ ▼
┌──────────────┐ ┌──────────────┐
│ SECONDARY │ │ DR SECONDARY │
│ (perf): │ │ ждёт promote │
│ чтение, │ │ │
│ перенаправл. │ │ │
└──────────────┘ └──────────────┘