Коротко. Федеративная БД (federated_model) может жить внутри окружения (путь A) или в отдельной базовой системе (путь B). Если первую ноду поставить с -S, локальная федерация не создаётся — и install-ng падает на No suitable management server found. Для 3-нодного кластера в одном окружении нужен путь A: первая нода без -S.
1. Что такое федерация
management_model(27017) — модель управления.environment_data(27018/27019 в зависимости от раскладки) — данные окружения.federated_model(27019) — федеративная БД, общая для нескольких окружений/площадок.
install-ng при конфигурировании ищет management server через федерацию. Если её нет/она указывает
не туда — падение на No suitable management server found или таймаут.
2. Путь A — федерация внутри окружения
- Первая нода ставится без
-S. install-ngсоздаётfederated_modelв модели и поднимает федеративный mongod локально.marvinwebполучает/federated/.- Add-node остальных +
-x→extend_clusters()добавляетmongodb_federated_node2/3. - Требуется ≥3 ONLINE MGMT-нод.
Когда: один кластер из 3 нод, одна площадка.
3. Путь B — федерация в базовой системе
- Одна инсталляция помечается
base_system=trueи владеет федеративной БД. - Остальные ставятся с
-S(scale-out) и подключаются черезfederateddbconnection. - На каждой ноде поднимается
federatedhaproxyкак прокси к базовой БД. - Данные подключения штатно добываются скриптом
/opt/ampli/scripts/supportability/pre_scaleout_info.pyна базовой системе (JSON: endpoints, ssl key/cert, DSS policy, deployment_id).
Когда: несколько окружений/площадок, performance scale-out.
4. Почему -S на первой ноде — ошибка для пути A
В install-ng:
is_scale_out = options.is_scale_out and options.install_type in ["combined"]
management.initialize(..., skip_federated_db=is_scale_out)
skip_federated_db=True убирает federated_model из списка создаваемых кластеров. Для пути A это
значит: федерации в модели нет, расширять нечего, /federated/ не рендерится.
Симптомы:
/federated/_status/→404(нет location в nginx) или 30-сек таймаут.install-ng:configuring machines failed: No suitable management server found.- В модели кластера
federated_modelнет.
5. Что проверить до старта
# на ноде, mTLS
sudo curl -sk --cert <CERT> --key <KEY> https://127.0.0.1:8443/model/mongocluster/ | jq
sudo curl -sk --cert <CERT> --key <KEY> https://127.0.0.1:8443/model/environment/ | jq
- Есть ли
federated_modelв списке кластеров (путь A). base_systemиfederateddbconnection(путь B).- Флаг запуска первой ноды: не
-Sдля пути A. cfg/product/activescale.yml→install_type.combined.clustersсодержитfederated_model.
6. Проверка после
sudo curl -sk --cert <CERT> --key <KEY> \
https://127.0.0.1:8443/federated/_status/ \
-w '\nHTTP=%{http_code} time=%{time_total}s\n'
Ожидается 200 и < 50 мс. Если 30 000 мс — pymongo topology-hang, федерация/порт не та.
Также:
replSetGetStatusдляfederated_model:PRIMARY+ 2SECONDARY.pgrep -af mongod— 3 процесса на ноду.services.cfgсодержит секции федеративных mongodb (grep -oE '^\[...\]' | sort).
7. Грабли
-Sна первой ноде → федерация не создана (путь A).mongo_federated_replicaset: management_model— яд, не использовать.- Ручной
federated_mongo_connection_stringвgroup_vars— лабораторный костыль; на чистом прогоне его быть не должно. - Бэкапы
.orig/.bakвgroup_vars— ansible грузит все, бэкап побеждает. - Порт 27019 занят/не слушает — проверить
ss -ltnp, конфиг mongod.
8. Пошаговая последовательность для пути A
Порядок важен: федерация создаётся на первой ноде и потом только расширяется. Если сделать шаги в другом порядке, расширять будет нечего.
Шаг 1. Первая нода — install-ng без -S. Это единственное место, где решается судьба
федерации. Первая нода создаёт federated_model в модели и поднимает федеративный mongod
локально; marvinweb получает location /federated/. Флаг -S (scale-out) на этом шаге
выставляет skip_federated_db=True, и кластер в модели создаётся, а федеративный — нет.
Шаг 2. Проверить федерацию до добавления нод. Не переходить дальше, пока не выполнено:
sudo curl -sk --cert <CERT> --key <KEY> \
https://127.0.0.1:8443/federated/_status/ \
-w '\nHTTP=%{http_code} time=%{time_total}s\n'
Норма — 200 и меньше 50 мс. Тридцать секунд означают pymongo topology-hang: федерация или
порт не те. Дополнительно: federated_model присутствует в списке кластеров модели
(GET /model/mongocluster/), а в services.cfg есть секция федеративного mongod на 27019.
Шаг 3. Подготовить очередь и добавить остальные ноды. Очередь для каждой ноды берётся с
рабочего узла и правится: environment.json с новым deployment_id, machine.json с ролью
SPXCTRLSTORAGEMGMT и только двумя реально поднятыми NIC (лишние MAC дают фантомные
интерфейсы), column.json без поля status (иначе падение на column NOTINITIALIZED),
реальные MGMT/storage адреса и MAC.
Шаг 4. Запуск с -x (extend). На добавляемых нодах расширение идёт через extend_clusters(),
которое дописывает в federated_model узлы mongodb_federated_node2/node3. Требование
продукта — не меньше трёх ONLINE MGMT-нод; на двух нодах репликасет не соберётся в устойчивом
виде.
Шаг 5. Проверить репликасет и процессы. replSetGetStatus для federated_model должен
показать PRIMARY и два SECONDARY. pgrep -af mongod — три процесса на ноду (управление,
данные окружения, федерация). Расхождение в числе процессов означает, что один из кластеров не
поднялся, и «федерация вроде жива» — иллюзия.
Шаг 6. Только теперь S3-сервисы и приёмка. DSS, неймспейсы, политика, S3 PUT — всё это проверяется после того, как федерация стабильна. Если гонять приёмку параллельно с add-node, часть проверок упадёт по таймауту и вы будете искать несуществующую проблему.
9. Как отличить путь A от пути B на живой системе
Отличать надо по модели, а не по документации установки: документация описывает намерение, модель описывает факт. Четыре поля закрывают вопрос.
| Что смотреть | Путь A | Путь B |
|---|---|---|
GET /model/mongocluster/ |
есть federated_model с локальными участниками |
federated_model принадлежит базовой системе, локально её может не быть |
GET /model/environment/ |
base_system не выставлен, federateddbconnection пуст |
base_system=true на одной инсталляции, у остальных заполнен federateddbconnection |
/opt/ampli/cfg/marvinweb/federated.cfg |
порт 27019, репликасет federated_model, адрес локальный |
адрес указывает на федеративный HAProxy базовой системы |
| Процессы на ноде | три mongod, включая федеративный локально | федеративный mongod локально может отсутствовать, зато есть federatedhaproxy как прокси |
Быстрый признак «снаружи»: GET /federated/_status/ на ноде, где федерации нет, отдаёт 404
(нет location в nginx) либо висит до таймаута. Живой, но чужой ответ — это путь B: запрос ушёл
через прокси на базовую систему.
Ещё один маркер — способ получения данных подключения. В пути B они штатно добываются на базовой
системе скриптом pre_scaleout_info.py из каталога supportability: JSON с endpoints, ключами и
сертификатами, политикой DSS и deployment_id. Если вы видите, что кто-то вручную правил
federated_mongo_connection_string в group_vars — это не путь A и не путь B, а лабораторный
обход, и на чистом прогоне его быть не должно.
10. Что ломается при смешивании путей и как откатиться
Смешивание — самая дорогая ошибка, потому что она не даёт явной ошибки на старте. Типовые комбинации:
- Первая нода с
-S, остальные тоже scale-out. Федерации нет нигде.install-ngпадает наconfiguring machines failed: No suitable management server found,/federated/не рендерится. Лечения «дописать кластер потом» нет: модель уже создана безfederated_model. - Первая нода без
-S, а остальные ставят с-Sв расчёте на базовую систему. Ноды пытаются подключиться к федерации, которой в их понимании нет; получаются таймауты 30 секунд и висящие задачи конфигурирования. Федерация существует, но не там, где её ищут. - Ручная правка
group_vars«чтобы заработало».federated_mongo_connection_string: mongodb://127.0.0.1:27019— допустимая вендор-уровневая настройка для пути A. А вотmongo_federated_replicaset: management_model— яд: федеративный клиент начинает искать репликасет управления. То же с бэкапами.orig/.bakвgroup_vars: ansible грузит все файлы каталога, и бэкап побеждает рабочую правку. Симптом — «правку применил, ничего не изменилось». - Смена пути на живой системе. Перевести кластер из A в B или обратно «на месте» нельзя: это разные модели владения БД, а не флаг. Данные федерации не переносятся правкой конфига.
Откат возможен только один — чистый прогон. То есть повторная установка с нуля с правильным
флагом на первой ноде и правильной очередью для остальных. «Дожима» нет: нельзя добавить
federated_model в уже созданную модель через API или досоздать репликасет руками так, чтобы это
считалось штатным состоянием. Вендор такой процедуры не описывает, а самодельная конструкция
развалится на первом же апгрейде или add-node.
Практический порядок отката:
- Зафиксировать, что именно сломано: нет
federated_model(случай 1), федерация есть но не находится (случай 2), конфиг перебит бэкапами (случай 3). - Проверить, есть ли на нодах данные, которые нельзя потерять. Если да — сначала выгрузить их через S3, потом переустанавливать.
- Очистить
group_varsот.orig/.bak, убрать самодельныеfederated_*оверрайды. - Переустановить первую ноду без
-S, дождаться200 < 50 мсна/federated/_status/. - Добавить остальные ноды и проверить
PRIMARY+ 2SECONDARY.
Единственное, что можно чинить без переустановки, — конфигурационные грабли: порт в
federated.cfg не 27019, занятый 27019 (ss -ltnp), лишние файлы в group_vars. Всё, что
касается отсутствия federated_model в модели, лечится только новым прогоном.
11. Источники
- Software Documentation Center
- Внутренняя практика (обезличено): разбор федерации на 3-нодном стенде.