Кластер HopeDC — это несколько равноправных контроллеров домена (узлов), которые синхронизируют между собой каталог, DNS, доверительные отношения, доменную политику безопасности и конфигурацию DHCP‑пулов. Схема мульти‑мастер: писать можно на любом узле, изменения расходятся на остальные. Это повышает доступность (при отказе одного узла клиенты обслуживаются другими) и позволяет распределять нагрузку.
Согласованность — итоговая (eventual): после сетевых задержек и простоев узлы сходятся к одинаковому состоянию. Конфликты (одновременная правка одного объекта на разных узлах) разрешаются автоматически по правилу «последняя запись побеждает» (Last‑Writer‑Wins, см. раздел 6).
cluster.view (просмотр) и cluster.edit (изменение).Модель обмена — pull: каждый узел раз в ~15 секунд сам забирает изменения у настроенных пиров, а не рассылает их. Ключевые элементы:
origin, usn, ts (время), payload (что изменилось). Хранится в файле repl_journal.bin в каталоге данных./api/replication/snapshot) и добавляет недостающие записи. Дальше идёт только инкрементальный pull.Весь обмен идёт по HTTPS на порту API 9444. Узел аутентифицируется одним из двух способов: общим секретом кластера (заголовок X-Cluster-Secret) — полное взаимное доверие и обмен всеми доменами; либо личным токеном сопряжения пары (заголовок X-Replica-Token) — для региональных узлов с ограниченным разделом (отдаются только их домены, см. раздел 10). Без действующего секрета или токена узел отвечает HTTP 401. Межузловые эндпоинты: /api/replication/pull, /api/replication/snapshot, /api/replication/digest.
Узел, подключаясь к пиру, проверяет его сертификат — иначе подставной узел мог бы получить секрет кластера и данные каталога:
DC_SELF_IP, адрес основного интерфейса, DC_WEB_EXTRA_SAN). Пиры проверяют цепочку до ЦС своего домена и совпадение адреса из URL пира. Это основной режим — ничего настраивать не нужно.🔐 Кластер: запомнен сертификат узла … — сверьте отпечаток с карточкой «Этот узел» на соседнем узле.Если сертификат пира не проходит проверку ЦС и не совпадает с закреплённым отпечатком, связь с ним прекращается, а в статусе пира и журнале выводится «сертификат узла изменился: … вместо закреплённого …». Если узел действительно переустановлен или сменил сертификат, сверьте новый отпечаток на нём и нажмите «Сбросить» у этого пира (или впишите новый отпечаток) и сохраните настройки.
9444 — порт Admin API (HTTPS, DC_API_PORT), по которому узлы кластера реплицируются; 9443 — порт веб‑панели (HTTPS, DC_UI_PORT), к которому ходит браузер администратора (панель вкомпилирована в бинарник и на том же origin отдаёт /api/). Между узлами кластера нужен именно 9444, а не порт веб‑панели. Внешний nginx/Vite в продакшене не требуется.Важно понимать границы репликации — это влияет на планирование кластера.
| Реплицируется | НЕ реплицируется (настраивается на каждом узле отдельно) |
|---|---|
|
|
https://10.0.0.2:9444 — это адрес бэкенда, а не веб‑интерфейса. Если перед API стоит HTTPS/обратный прокси — используйте соответствующий URL.chrony) и убедитесь, что расхождение часов между узлами — доли секунды.Ниже — сценарий из двух узлов. Дополнительные узлы добавляются аналогично.
JOIN_CLUSTER=1, для регионального — HOSTED_DOMAINS), передаст новому узлу адрес первого узла и общий секрет (полная реплика) или личный токен пары (региональный), а на первом узле добавит пир нового узла. Шаги 2–3 ниже при этом выполняются автоматически; общий секрет, если он ещё не задан, создаётся. Пароль панели admin нового узла задаётся случайно и показывается один раз в журнале установки (v195). Подробно — Документ 2, раздел 7 «Контроллеры».Поднимите первый узел и наполните каталог (создайте домен, учётки, DNS) как обычно. Затем откройте Настройки → Кластер (HA), вкладка «Узлы и репликация»:
dc-01). ID узла уже сгенерирован автоматически.Второй узел запускайте в режиме присоединения, чтобы он не создавал собственный демо‑домен hope.local: задайте службе переменную окружения DC_JOIN_CLUSTER=1 до первого запуска (например, строкой Environment=DC_JOIN_CLUSTER=1 в unit‑файле или файле /etc/systemd/system/hopedc.service.d/). Узел с пустым каталогом в этом режиме создаёт только учётную запись панели admin и ждёт данных от пира; в журнале — «Режим присоединения к кластеру: демо‑домен не создаётся». Тот же режим включается автоматически, если на пустом узле ещё до первого запуска лежит настроенный cluster_config.json с пирами. После присоединения переменную можно убрать — на непустом каталоге она ни на что не влияет.
Затем на втором узле в разделе Кластер (HA):
dc-02) и тот же секрет кластера, что на первом.https://10.0.0.1:9444.При первом контакте второй узел выполнит бутстрап: заберёт снимок каталога, DNS, доверий, политики безопасности и DHCP‑пулов у первого. Дальше пойдёт инкрементальная синхронизация.
Чтобы изменения расходились в обе стороны, на первом узле добавьте пира — URL второго (https://10.0.0.2:9444) и сохраните. В мульти‑мастере каждый узел тянет у каждого.
DC_JOIN_CLUSTER=1, см. шаг 2), а не создавать свой домен с нуля. Если узел уже успел создать свой hope.local, остановите его, очистите каталог данных и запустите заново в режиме присоединения. Иначе у объектов будут разные внутренние идентификаторы (UUID), и такие объекты никогда не сойдутся — вкладка «Согласованность» будет постоянно показывать расхождение.Если один и тот же объект изменён на двух узлах до того, как они синхронизировались, возникает конфликт. HopeDC разрешает его автоматически правилом Last‑Writer‑Wins:
победитель = у кого больше ts (время изменения);
при равном ts — у кого больше node_id (детерминированный добор)
Три свойства, которые важно понимать:
node_id, а не по тому, кто правил позже. В пределах секунды «настоящий последний» может проиграть.Раздел Кластер (HA) содержит четыре вкладки. Кроме «Узлы и репликация» — три инструмента наблюдаемости.
Фиксирует случаи, когда изменение с этого узла столкнулось с изменением того же объекта на другом узле. Каждая запись показывает объект, что сохранилось (победитель: узел + время) и что затёрлось (проигравшая версия перечёркнута), а также принято ли входящее изменение или отклонено (наша версия оказалась новее). Записи ведутся на обоих узлах — у проигравшего «затёрлось», у победителя «отклонено чужое», — что даёт полную картину.
Хранится в repl_conflicts.json (кольцо на 2000 записей). Кнопка «Очистить журнал» сбрасывает его.
Когда пир возвращается после недоступности, HopeDC догоняет пропущенные изменения. Вкладка показывает сводку каждого догона: простой пира, сколько событий догнано (из полученных), сколько было конфликтов, из них — затёрто локальных (ваши изменения заменены версией пира) и отклонено чужих, и число проходов. Если были перезаписи локальных — карточка подсвечивается и отсылает к «Журналу конфликтов». Долгий догон (более 500 событий за проход) агрегируется в один отчёт.
Хранится в repl_reconnects.json (кольцо на 500 записей).
Сверяет отпечаток (дайджест) реплицируемого состояния с каждым узлом. Дайджест считается детерминированно и порядко‑независимо отдельно по каталогу, DNS, доверительным отношениям и DHCP‑пулам, плюс отдельный хеш доменной политики безопасности (эндпоинт /api/replication/digest). По каждому пиру выводится статус: Сошлись, Расхождение или «Нет связи», с разбивкой по каталогу, DNS, доверию, политике и DHCP‑пулам (сколько объектов «здесь» и «там» и совпадает ли содержимое). Кнопка «Проверить сейчас» запускает сверку.
Просто остановите узел. Остальные продолжат работать; клиентов переключит DNS/локатор на живые узлы. Изменения, сделанные на живых узлах во время простоя, накапливаются в их журналах.
Запустите узел снова. Он автоматически догонит пропущенное по watermark. Проверьте вкладку «Возвраты узлов» — там появится отчёт о догоне, и вкладку «Согласованность» — статус должен стать Сошлись. Если во время простоя те же объекты правились и на вернувшемся узле, часть его локальных правок могла быть затёрта по LWW — детали в «Журнале конфликтов».
Каждый узел хранит в журнале последние 8000 изменений. Если узел отсутствовал дольше (или на пире за это время прошёл массовый импорт), часть событий из журнала пира уже вытеснена. С v126 узел обнаруживает такой разрыв сам: пир сообщает нижнюю границу своего журнала, и если наш водяной знак ниже неё, в журнале появляется предупреждение 🔁 Репликация: пропущены события узла … и узел выполняет пересинхронизацию по снимку:
🧩 Пересинхронизация от …: добавлено N, обновлено N, удалено N (T с).Пересинхронизацию можно запустить и вручную — кнопка «Пересинхронизировать» на вкладке «Узлы и репликация» (право cluster.edit). На 200 тыс. объектов она занимает 5–10 секунд. Пока узел сам принимает снимок, отдавать снимок другим он отказывается (HTTP 503) — так не распространяются неполные данные.
Если данные узла повреждены — пересоберите его с нуля: остановите службу, очистите каталог данных узла (сохранив cluster_config.json) и запустите — узел присоединится заново бутстрапом снимком. На 200 тыс. объектов бутстрап занимает около 12 секунд после запуска службы.
У каждого узла свой мастер‑ключ шифрования данных на диске (по умолчанию /etc/hopedc/master.key). Ключи узлов не обязаны совпадать и не передаются по сети: узел отдаёт изменения пиру по HTTPS (порт 9444), а принимающий узел записывает их на диск, зашифровав своим ключом. Поэтому:
.hdckey под паролем) нужно сохранить для каждого узла — раздел «Резервное копирование» на каждом узле;.hdckey исходного узла — данные будут перешифрованы на ключ узла, на котором идёт восстановление;hopedc-core key import). Предпочтительный путь — бутстрап снимком.Подробнее — Документ 2, раздел «Шифрование данных на диске и мастер‑ключ».
Ключ krbtgt хранится в объекте каталога и реплицируется, как любое изменение. Ручную смену выполняйте на одном узле (Домены → домен → «Ключи Kerberos»; у каждого домена свой ключ): новый ключ доходит до остальных узлов со следующим проходом репликации (обычно до 15 секунд). Предыдущий ключ принимается всеми узлами до следующей смены, поэтому выданные ранее билеты работают на любом узле. В короткое окно до репликации билет, выданный узлом с новым ключом, другой узел может не принять — клиент повторит запрос.
krbtgt своего поддомена от центрального сервера. Обратное запрещено: материал krbtgt от регионального узла центр не принимает.Закреплённый отпечаток сертификата DC, сохранённые ЦС AD и имя DC (см. Документ 2, «Проверка подлинности контроллера AD») реплицируются вместе с корнем интегрированного домена. Любой узел кластера проверяет DC одинаково. Сброс или закрепление отпечатка на одном узле действует на всех. Сведения о последнем отказе проверки («DC предъявил другой сертификат») показываются на том узле, где он произошёл.
Приём роли KDC и отключение домена от AD (Документ 2, п.4.9) выполняйте на одном центральном узле. Ключи krbtgt и отметки домена (роль KDC принята, домен мигрирован) реплицируются: остальные узлы начинают выдавать билеты тем же ключом и прекращают синхронизацию с AD со следующей репликацией.
RODC — узел, который держит копию каталога только для чтения и кэширует пароли лишь для заранее разрешённых учёток. Его ставят там, где нельзя полностью доверять физической защите: филиалы, удалённые площадки, DMZ. Если такой узел украдут или вскроют, под угрозой окажутся только кэшированные на нём пароли, а не весь домен.
Как включить. При установке узла задайте переменную окружения DC_RODC=1 (режим хранится в конфигурации кластера; в разделе «Кластер» у такого узла — метка «RODC · только чтение»). RODC настраивается как обычный региональный узел: он тянет каталог с записываемого контроллера (пир с указанным URL), а сам наружу ничего не отдаёт — репликация односторонняя.
unwillingToPerform с пояснением; панель на запрос изменения данных домена (каталог, интеграция, GPO, DNS, доверия, DHCP, PKI) отвечает «это контроллер только для чтения». Менять нужно на записываемом контроллере — изменение придёт на RODC репликацией. Конфигурация самого узла (кластер, сеть, обновления) доступна.hopeRodcAllowed на корне домена (на записываемом контроллере): список DN/SID учёток и групп — для групп берутся их прямые члены. По умолчанию (список пуст) RODC не кэширует ни одного пароля. Секреты (NT-хэш, ключи Kerberos, история паролей и т. п.) неразрешённых учёток вычищаются при приёме снимка и фоновой проверкой.krbtgt узла (v172). На записываемом контроллере для каждого RODC заводится отдельная учётка krbtgt_rodc_<id> (кнопка в разделе «Кластер» или POST /api/cluster/rodc-krbtgt). RODC шифрует свои TGT этим ключом; мастер принимает их, пробуя сначала свой krbtgt, затем ключи RODC. Отзыв билетов украденного узла — поворот (rotate) его krbtgt_rodc_* на мастере, не трогая остальной домен. Общий мастер‑krbtgt и чужие krbtgt_rodc_* на RODC не хранятся — с украденного узла нельзя подделать «золотой билет» доменным ключом.hopeCaKeyPem), ключ KDC для PKINIT (hopePkinitKdcKeyPem) и секрет синхронизации (hopeSyncSecret). Поэтому с украденного филиального узла нельзя выпускать сертификаты домена, подделывать смарт‑карточный вход или получить секрет доверия. Для своего TLS (LDAPS/HTTPS) RODC без ключа ЦС переходит на постоянный самоподписанный сертификат узла — работа LDAP/панели/репликации не нарушается (репликация односторонняя, узел тянет и наружу сертификат не навязывает).| Что мастер вырезает для RODC | Подробность |
|---|---|
| Секреты учёток | Всех, кроме разрешённых (hopeRodcAllowed): NT-хэш, ключи Kerberos и прежние ключи после смены, история паролей, кэш входа, gMSA. |
| krbtgt | Мастер-krbtgt (текущий и прежний ключ) и персональные krbtgt других RODC. Отдаётся только krbtgt_rodc_* этого RODC (по node_id из пометки). |
| Ключи и пароли сервисов | Закрытый ключ ЦС, ключ KDC для PKINIT, секрет и пароль синхронизации с AD, ключ TSIG DNS, пароли и ключи доверий. |
| Где действует | Начальный снимок и все последующие изменения (дельты репликации). Узлы полного доверия (общий секрет) получают данные как прежде. |
Защиты от ошибок: на RODC нельзя задать общий секрет (сохранение отклоняется); пометку «RODC» нельзя сохранить без токена пары и node_id; старый клиент API, не знающий о пометке, её не снимает. Пока RODC знает секрет, в журнале и в разделе «Кластер» висит предупреждение.
DC_RODC=1) и хранится в конфигурации кластера. Обычное сохранение настроек кластера из панели его не меняет — понизить RODC до записываемого можно только осознанно.krbtgt RODC (мастер принимает его билеты; поворот ключа отзывает старые), снятие ключей ЦС/PKINIT/синхронизации (RODC переходит на самоподписанный TLS и продолжает обслуживать LDAP/вход), отказ kpasswd на RODC, сохранение режима RODC при сохранении настроек кластера.Пароль учётки синхронизации реплицируется на все узлы (как пароль доверия: на диске зашифрован мастер-ключом узла, по LDAP и API не отдаётся). Синхронизацию каталога, импорт DNS и доверий из AD ведёт один узел — держатель аренды, которую он продлевает каждой успешной синхронизацией (атрибут корня домена). Остальные узлы пишут в журнал «синхронизацию с AD ведёт узел …» и не опрашивают AD. Если ведущий не синхронизирует дольше трёх интервалов + минуты (плюс сдвиг узла до 2 минут), аренду забирает другой узел — в журнале «синхронизацию с AD берёт этот узел». Вернувшийся прежний ведущий роль обратно не забирает. «Синхронизировать сейчас» на любом узле делает ведущим этот узел. Запись по LDAP и правки из панели для интегрированного домена выполняются в AD с любого узла (Документ 2, п.4.9). Сквозная проверка паролей идёт с каждого узла напрямую к DC AD (636).
Доверие хранится и как запись доверия, и как реплицируемый объект trustedDomain (CN=System домена). В объекте — направление, тип, атрибуты, SID партнёра, суффиксы леса (TLN), время смены пароля и сам пароль доверия (внутренний атрибут: по LDAP не отдаётся, на диске зашифрован мастер‑ключом узла). Поэтому на любом узле кластера доверие видно Windows‑клиентам, ключи Kerberos доверия при необходимости восстанавливаются, а смену пароля может выполнить любой узел. Автоматическую смену пароля доверия (DC_TRUST_ROTATE=1) выполняет тот же единственный выбранный узел, что и плановую смену krbtgt.
Сменить пароль (kpasswd, Ctrl+Alt+Del) можно на любом узле — новый пароль расходится по кластеру как любое изменение каталога. Политика блокировки задаётся в Default Domain Policy и одинакова на всех узлах. Неверные попытки считает тот узел, к которому обратился клиент; когда счётчик на узле достигает порога, учётке записывается lockoutTime, и блокировка действует на всех узлах. Поэтому подбор пароля, распределённый по N узлам, получит не больше N×порог попыток до блокировки — учитывайте это при выборе порога. Счётчики всех узлов видны в свойствах учётки (вкладка Account → «Состояние входа», таблица по контроллерам, v142) — по ним видно, на какой контроллер шёл подбор. Снять блокировку можно на любом узле кнопкой «Разблокировать» (она обнуляет счётчики и на остальных узлах) или записью lockoutTime=0.
Узлы обновляются по очереди из раздела Настройки → Обновления панели каждого узла (Документ 2, п.7). Там же видны версии всех узлов кластера. Пока узел перезапускается (секунды), клиентов обслуживают остальные; после старта он догоняет изменения обычной репликацией. Разные версии на узлах допустимы на время поэтапного обновления; региональные серверы обновляйте после центрального.
Из раздела «Контроллеры» (v188). Узлы, добавленные в «Контроллеры», обновляются по SSH: по одному или все контроллеры домена кнопкой «Обновить контроллеры домена», до пакета из «Обновлений» (если он новее) или до версии узла, с которого запущено обновление. Так обновляются и региональные узлы и RODC, которые обновление «всего кластера» пропускает. Первая ошибка останавливает обход; установщик сам возвращает прежнюю версию, если новая не запустилась. Корневой сервер так не обновляется — только из его «Обновлений» полным администратором.
В разделе Обновления узла с подготовленным пакетом (загружен или скачан) есть блок «Весь кластер одной кнопкой». Узел, на котором нажали кнопку, становится координатором и обновляет остальные по одному:
hopedc-update) и не идёт другая установка. Если хоть одно условие не выполнено — обновление не начинается, ничего не меняется; панель называет, что устранить.Кнопка «Остановить после текущего узла» прерывает обход (текущий узел доводится до конца). Узлы, уже работающие на целевой версии, пропускаются.
Кластер (HA) доступен в версии Enterprise. Если лицензия ниже или истекла, раздел открывается только для просмотра: настройки, пиры и включение/выключение недоступны, но уже настроенный кластер продолжает работать и реплицировать изменения.
| Файл | Назначение |
|---|---|
repl_journal.bin | Журнал событий репликации + watermarks (кольцо 8000) |
repl_conflicts.json | Журнал конфликтов LWW (кольцо 2000) |
repl_reconnects.json | Отчёты о догоне после возврата (кольцо 500) |
cluster_config.json | Конфигурация узла: node_id, секрет, список пиров |
cluster_nodes.json | Известные узлы для автотопологии (сайт, адрес, время последнего контакта) |
Все файлы состояния хранятся зашифрованными мастер‑ключом узла; просматривать их следует через вкладки раздела «Кластер (HA)», а не напрямую.
hopedc.log.* содержит строки репликации (🔁 Репликация…, 📥 Догон…). Их удобно фильтровать в разделе Логирование (подстрока «Репликация» или «Догон»).| Симптом | Вероятная причина и действие |
|---|---|
| Пир «офлайн», ошибка связи | Проверьте доступность TCP 9444 между узлами, правильность URL пира, работу узла. Ошибка видна на вкладке «Узлы и репликация» и в «Согласованности». |
| HTTP 401 при репликации | Нет действующего секрета кластера или токена сопряжения. Задайте одинаковый секрет на центральных узлах; для регионального узла — одинаковый токен пары на обоих концах (раздел 10). Пустой секрет больше не открывает репликацию: без секрета или токена узел отвечает 401. |
| Устойчивое расхождение, счётчики каталога отличаются на постоянную величину | Скорее всего узлы независимо засеяли данные (разные UUID). Пересоберите присоединяемый узел бутстрапом от эталонного (раздел 8). |
| «Неправильная» сторона выигрывает конфликты | Рассинхронизация часов. Проверьте NTP на всех узлах. |
| Изменение сделано, но не доехало | Проверьте, что репликация включена и пир настроен в обе стороны; нажмите «Реплицировать сейчас»; посмотрите лог репликации. |
| DHCP/сертификаты/доверия не синхронизируются | Так и задумано — они не реплицируются (раздел 3). Настраивайте на каждом узле отдельно. |
HopeDC ставится не только в корневом домене, но и в регионах, где работают дочерние домены. Региональный сервер держит только свой домен: данные других доменов леса — в том числе учётные записи и ключи Kerberos родительского домена — он не получает, не принимает и не хранит. Общими для всего леса остаются только конфигурация и схема. Это снимает с регионов обязанность хранить секреты всего леса и ограничивает ущерб при компрометации площадки.
Все домены; региональный — Только выбранные (его поддомен). То же можно задать переменной окружения DC_HOSTED_DOMAINS=child.hope.local.*. На региональном сервере (раздел ограничен) поле можно оставить пустым — он отдаёт не больше своего раздела.child.hope.local), нажмите кнопку генерации и скопируйте токен сопряжения.sIDHistory, материал krbtgt и любые правки корня домена.В Windows группа Enterprise Admins автоматически входит в BUILTIN\Administrators каждого домена леса и управляет поддоменами. HopeDC теперь ведёт себя так же — и на центральном сервере, и на региональном сервере поддомена (туда пользователь родителя приходит через проверенный PAC по доверию). Доступ распространяется на панель, LDAP и SMB/SYSVOL. Обычный Domain Admins родителя поддоменом по‑прежнему не управляет.
<SID корня леса>-519, а не по любому SID с окончанием -519 или по имени группы — поэтому группу «Enterprise Admins», созданную в поддомене, подделать нельзя. Фильтрация SID привязана к издателю (дереву доменов): предок проносит привилегии вниз (корень → поддомен), но поддомен не может пронести привилегированный или чужой SID вверх к родителю или вбок к соседу. Это закрывает атаки типа golden ticket и SID‑history с контроллера поддомена. Встроенные алиасы S-1-5-32-* через границу realm не принимаются вообще. В лесу Windows этот путь не фильтруется; HopeDC закрывает его намеренно, так как региональные серверы часто стоят в менее защищённом периметре.hopedc-core/src/kerberos/forest.rs (enterprise_admins_sid, pac_sid_allowed); права администратора — ldap/authz.rs (is_admin_for); фильтр входящей реплики — hopedc-db/src/engine.rs (restricted_inbound_allows).Нагрузочное тестирование v126 проведено на кластере из трёх узлов с доменом hope.local: 100 000 пользователей, 100 000 компьютеров, 1 000 пользователей с ключами AES и служебные объекты — всего около 211 тыс. объектов каталога. Все три узла и генераторы нагрузки работали на одной виртуальной машине (2 vCPU, 8 ГБ ОЗУ), поэтому показатели пропускной способности ограничены процессором клиентов и являются нижней оценкой; на отдельных серверах они выше.
| Операция | До оптимизации (v125) | v126 |
|---|---|---|
| LDAP simple bind | 5,2 с | 1–2 мс |
| LDAP-поиск по sAMAccountName (всё поддерево) | ≈ 0,13 с | 1 мс |
| LDAP-поиск 11 111 записей в одном контейнере (ldapsearch) | — | 0,46 с |
| LDAP-выгрузка всего каталога, 201 тыс. записей | — | 5,5 с |
| Kerberos AS-REQ (kinit) | 3,5 с | 12–20 мс |
| Kerberos TGS-REQ (билет службы) | ≈ 0,25 с | 4–5 мс |
| Создание пользователя через API | ≈ 0,13 с | 9–16 мс |
| Страница «Структуры домена» (100 из 111 тыс.) | 0,7 с | ≈ 0,33 с |
| Поиск в «Структуре домена» | — | ≈ 0,1 с |
Полный каталог в API (/api/directory) | 108 МБ, 1,3–3 с | не используется панелью (обзор, DNS, DHCP — счётчики доменов) |
| Нагрузка | Результат |
|---|---|
| LDAP: подключение + bind + поиск + отключение, 40 потоков на один узел | ≈ 770 оп/с, p50 ≈ 45 мс |
| LDAP: 40 потоков по трём узлам | ≈ 620 оп/с суммарно, p95 ≈ 150 мс |
| Kerberos AS (kinit), 8 потоков | ≈ 190 оп/с, p95 ≈ 66 мс |
| DNS (SRV/A/SOA), 20 потоков | ≈ 1 900 запросов/с, p99 ≈ 35 мс |
| Смешанная: Kerberos + LDAP + DNS на разных узлах и 100 созданий пользователей | Kerberos 79 оп/с, LDAP 192 оп/с, DNS 1 300 запросов/с; создание p50 16 мс |
| LDAP (10 потоков) во время серии записей через API | 340 оп/с, p99 94 мс (в v125 — p99 12 с) |
Для оценки: утренний вход 100 тыс. пользователей за 30 минут — это около 55 входов в секунду, то есть доля нагрузки одного узла.
| Сценарий | Результат |
|---|---|
| Запуск службы с 211 тыс. объектов | 27–28 с (v125: 31–38 с) |
| Бутстрап нового узла (213 тыс. записей) | 12 с после запуска |
| Задержка репликации изменения на другие узлы | 4–7 с в среднем, не более 15 с (цикл pull) |
| Узел пропустил 10 000 изменений (больше журнала): пересинхронизация | 5–6 с; узел сошёлся через 46 с после запуска (включая 28 с старта) |
| Сверка содержимого трёх узлов (выгрузка LDAP, 211 594 записи) | совпадает побайтно |
MALLOC_ARENA_MAX=2), после бутстрапа и пересинхронизации освобождённая память возвращается системе.Раньше каждый узел получал список пиров вручную, а при отказе узла связи приходилось перенастраивать. С автотопологией узлы сами узнают друг о друге и строят связи по сайтам — так же, как KCC в Active Directory. Ручные пиры при этом сохраняются и всегда имеют приоритет.
siteObject, siteList, cost).Поля «Сайт этого узла» и «Адрес этого узла для других» обычно пустые: сайт определяется по самой узкой подсети, в которую попадает IP узла, адрес — https://<IP узла>:9444. Заполняйте их, если узел за NAT/с другим именем или подсети не описаны. Адрес должен быть https://.
| Где | Связи |
|---|---|
| Внутри сайта, до 5 узлов | Полносвязно: каждый тянет у каждого. |
| Внутри сайта, больше 5 узлов | Кольцо в обе стороны + хорды: не больше ~4 связей на узел, путь изменения — не более 3 шагов. |
| Между сайтами | Только через мосты (по одному живому узлу на сайт — с наименьшим node_id), по минимальному остовному дереву связей сайтов (самые дешёвые cost). Нет связей сайтов вообще — все сайты связываются с одинаковой стоимостью 100. |
| Сайт без связи с остальными | Добавляется аварийная связь и предупреждение в панели «сайт X не связан…» — репликация не теряется, но связь сайтов стоит добавить. |
Каждый узел считает план сам по одинаковым данным, поэтому все узлы приходят к одному и тому же плану без «главного». Список узлов распространяется обменом сведениями (каждые 2 минуты) — со своими пирами и напрямую со всеми известными узлами полного доверия, так что филиал не теряет связь с центром при отказе моста.
Узел, от которого нет сведений больше часа, выпадает из плана. Если это был мост, мостом сайта становится следующий живой узел, и другие сайты переключаются на него автоматически. Вернувшийся узел снова включается в план после первого обмена сведениями.
Сведения об узлах передаются только по общему секрету кластера; запросы по токену пары отклоняются.
Карточка автотопологии показывает таблицу узлов (сайт, адрес, «мост», RODC, давность последнего контакта, «не отвечает»), связи плана (узел ← источник, связи этого узла подсвечены) и предупреждения. В списке состояния пиров автоматические пиры подписаны «(авто)». API: GET /api/cluster/auto-topology.