Репликация в Stronghold работает на двух уровнях: внутри одного кластера и между кластерами. Всего есть четыре варианта — от базовой отказоустойчивости в CE до межкластерных Performance и DR в EE.

Схемы ниже упрощены и показывают направление запросов и репликации, а не сетевую разводку.

Объекты архитектуры

Чтобы схемы читались однозначно, важно различать два уровня объектов и два вида связей между ними.

  • Узел (node) — отдельный экземпляр Stronghold: процесс на своём сервере или в своём поде со своей копией хранилища. В каждый момент внутри кластера ровно один узел активный (обрабатывает запись), остальные — standby.
  • Кластер (cluster) — группа узлов поверх общего integrated Raft storage, работающая как единое целое. Клиенты обращаются к кластеру, а не к конкретному узлу. Кластер — минимальная единица межкластерной репликации: реплицируется кластер целиком, а не отдельный узел.

Связи бывают тоже двух видов, и их нельзя путать.

  • Между узлами одного кластера — Raft. Активный узел постоянно реплицирует изменения хранилища на standby-узлы по протоколу Raft. Это внутрикластерная синхронизация: она обеспечивает отказоустойчивость и не требует отдельной настройки репликации.
  • Между кластерами — репликация. Разные кластеры (как правило, на разных площадках) обмениваются данными через межкластерную репликацию: primary отдаёт поток изменений на secondary, а secondary перенаправляет клиентские записи обратно на primary. Именно это и есть Performance или DR, и это настраивается администратором.

Коротко: Raft связывает узлы внутри кластера, репликация связывает кластеры между собой.

Обозначения на схемах

ОбозначениеЧто это
AАктивный узел (active) — принимает запись
SStandby-узел — резерв (в CE запросы не обслуживает, а перенаправляет на Активный узел)
PSPerformance standby — standby-узел в EE, обслуживает локальные чтения

Сравнение вариантов

ВариантУровеньНазначениеНеактивные узлы или резервРедакция
HA: репликация хранилищаВнутри кластераОтказоустойчивость узловstandby-узлы, перенаправляют все запросы на активный узелCE и EE
Performance standbyВнутри кластераМасштабирование чтенийstandby-узлы читают локально, запись — на активный узелEE
Disaster RecoveryМежду кластерамиГорячий резерв и аварийное переключениеsecondary-кластер не обслуживает клиентов, ждёт promoteEE, только Standalone
PerformanceМежду кластерамиМасштабирование и распределение чтенийsecondary-кластеры читают локально, запись — на primaryEE, только 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 │
                   │ чтение,      │   │              │
                   │ перенаправл. │   │              │
                   └──────────────┘   └──────────────┘