Установка мультикластера
Назначение и ограничения
Мультикластер — это два независимых трёхузловых кластера Закрома.Хранение и ZDS, которые обмениваются данными через асинхронную репликацию. Каждый кластер использует собственные inventory, group_vars, PostgreSQL и Kafka; кластеры устанавливаются последовательно и независимо друг от друга.
Инструкция самодостаточна: установка каждого кластера описана полностью. Общие принципы подготовки узлов, DNS, TLS и PostgreSQL совпадают с базовым кластером; требования к инфраструктуре приведены в Подготовке к установке.
Ограничения отказоустойчивостиВ примере каждый кластер использует один внешний PostgreSQL, который остаётся единой точкой отказа. Для продуктивной инсталляции необходим отказоустойчивый кластер PostgreSQL, а ресурсы для узлов рекомендуется рассчитать совместно с технической поддержкой.
Устанавливаемые компоненты
| Компонент | Описание |
|---|---|
| Zakroma-Storage | Управляющий слой, обеспечивающий S3-протокол. |
| ZDS | Слой хранения данных (минимальное требование — 3 узла в режиме Erasure Coding, 3 узла — в режиме репликации (Full Copy)). |
| PostgreSQL | СУБД для метаданных Zakroma-Storage. |
| Kafka | Система обмена сообщениями, используемая сервисами Zakroma. |
| Nginx | Точка TLS-терминации для межкластерного CDN-трафика. Работает на узлах Закрома.Хранение и проксирует запросы в локальный CDN endpoint. |
| Сервер | Компоненты | Cluster |
|---|---|---|
loran-10.cluster-1.zakroma.internal | Zakroma-Storage, ZDS (Erasure Coding 2+1) | 1 |
loran-11.cluster-1.zakroma.internal | Zakroma-Storage, ZDS (Erasure Coding 2+1) | 1 |
loran-12.cluster-1.zakroma.internal | Zakroma-Storage, ZDS (Erasure Coding 2+1) | 1 |
loran-14.cluster-1.zakroma.internal | PostgreSQL | 1 |
loran-15.cluster-1.zakroma.internal | Kafka | 1 |
loran-20.cluster-2.zakroma.internal | Zakroma-Storage, ZDS (Erasure Coding 2+1) | 2 |
loran-21.cluster-2.zakroma.internal | Zakroma-Storage, ZDS (Erasure Coding 2+1) | 2 |
loran-22.cluster-2.zakroma.internal | Zakroma-Storage, ZDS (Erasure Coding 2+1) | 2 |
loran-24.cluster-2.zakroma.internal | PostgreSQL | 2 |
loran-25.cluster-2.zakroma.internal | Kafka | 2 |
Схема установки
Два независимых трёхузловых кластера используют отдельные серверы PostgreSQL и Kafka и реплицируют между собой асинхронно. На узлах Закрома.Хранение Nginx принимает межкластерные запросы к zakroma-cdn.cluster-N.zakroma.internal:443, терминирует TLS и проксирует их в локальный CDN эндпоинт http://127.0.0.1:8099. Настройка внешнего балансировщика в данной статье не освещается.
Обозначения Server1–Server10 условные. Используйте имена узлов из таблицы и inventory соответствующего кластера в каталоге inventories/multicluster.

Шаги установки двух кластеров совпадают; различаются только inventory, имена узлов и переменные, перечисленные в таблице:
| Что различается | Кластер 1 | Кластер 2 |
|---|---|---|
| Каталог inventory | inventories/multicluster/cluster-1 | inventories/multicluster/cluster-2 |
| Узлы Закрома.Хранение и ZDS | loran-10–loran-12 | loran-20–loran-22 |
| PostgreSQL | loran-14.cluster-1.zakroma.internal | loran-24.cluster-2.zakroma.internal |
| Kafka | loran-15.cluster-1.zakroma.internal | loran-25.cluster-2.zakroma.internal |
| CDN endpoint | zakroma-cdn.cluster-1.zakroma.internal:443 | zakroma-cdn.cluster-2.zakroma.internal:443 |
zakroma_storage_cdn.this.cluster_name | ZakromaCluster-1 | ZakromaCluster-2 |
zakroma_storage_cdn.others[].name | ZakromaCluster-2 | ZakromaCluster-1 |
Установка
1. Получить и распаковать архив
1tar -xvzf zakroma-roles-<ВЕРСИЯ_РЕЛИЗА_АРХИВА_С_ANSIBLE_РОЛЯМИ>.tar.gz
1.1. Перейти в директорию с ролями
1cd zakroma-roles-<ВЕРСИЯ_РЕЛИЗА_АРХИВА_С_ANSIBLE_РОЛЯМИ>
2. Установка первого кластера
2.1. Создать inventory, включающий имена серверов в соответствующих хост-группах
Как пример можно использовать файл inventories/multicluster/cluster-1/hosts.
1[certificates] 2loran-10 ansible_host=10.128.0.10 3loran-11 ansible_host=10.128.0.11 4loran-12 ansible_host=10.128.0.12 5 6 7[zakroma-storage] 8loran-10 ansible_host=10.128.0.10 9loran-11 ansible_host=10.128.0.11 10loran-12 ansible_host=10.128.0.12 11 12[zakroma-zds-v2-ec] 13loran-10 ansible_host=10.128.0.10 zakroma_zds_node_name=loran-10 14loran-11 ansible_host=10.128.0.11 zakroma_zds_node_name=loran-11 15loran-12 ansible_host=10.128.0.12 zakroma_zds_node_name=loran-12
Проверьте SSH-доступ и выполнение Python-модулей Ansible:
1ANSIBLE_CONFIG=ansible.cfg ansible -m ping -i inventories/multicluster/cluster-1/hosts all
Ожидаемый результат: каждый узел отвечает SUCCESS и pong. Для проверки текущего ansible_hostname на узлах выполните:
1ANSIBLE_CONFIG=ansible.cfg ansible -m setup -i inventories/multicluster/cluster-1/hosts all | grep ansible_hostname
2.2. Копирование сертификатов на целевые хосты с помощью роли certificates
Поместите сертификат и ключ первого кластера в каталог roles/certificates/files/ в корне распакованной поставки на управляющем сервере. Значение certificates_copy_source_path: "files" оставьте без изменений: путь задаётся относительно каталога роли certificates.
- Необходимо отредактировать файл переменных
inventories/multicluster/cluster-1/group_vars/certificates.ymlролиcertificatesдля группы хостовcertificates.
1--- 2# Задаёт путь к каталогу, откуда копируются сертификаты и ключи. 3certificates_copy_source_path: "files" 4 5# Содержит информацию о каждом хосте, на который нужно скопировать сертификаты и ключи.
- Запустить playbook:
1ANSIBLE_CONFIG=ansible.cfg ansible-playbook -i inventories/multicluster/cluster-1/hosts playbooks/sample-play-copy-certificates.yml
2.3. Установка Zakroma Storage с помощью роли zakroma-storage
-
Подготовить файл с лицензией
licence, положить его в директорию ./files/zakroma-licence и запустить playbookplaybooks/sample-play-copy-licence-file.ymlдля группы хостовzakroma-storage. -
Далее необходимо отредактировать файл переменных
inventories/multicluster/cluster-1/group_vars/zakroma-storage.ymlролиzakroma-storageдля группы хостовzakroma-storage.
1--- 2# ---------------------------------------------------ОБЩИЕ НАСТРОЙКИ--------------------------------------------------- 3# Выполнить удаление Zakroma и ничего больше 4zakroma_storage_delete_only: false
- Перед установкой выполнить preflight-проверку Закрома.Хранение:
1ANSIBLE_CONFIG=ansible.cfg ansible-playbook -i inventories/multicluster/cluster-1/hosts playbooks/sample-play-zakroma-storage-preflight.yml
Продолжайте установку только после успешного выполнения: в PLAY RECAP для всех узлов должны быть unreachable=0 и failed=0.
- Запустить playbook:
1ANSIBLE_CONFIG=ansible.cfg ansible-playbook -i inventories/multicluster/cluster-1/hosts playbooks/sample-play-zakroma-storage.yml
После установки на каждом узле первого кластера проверьте сервисы Закрома.Хранение:
1sudo systemctl status --no-pager --full \ 2 zakroma-storage-monolith.service \ 3 zakroma-storage-gateway.service
Для обоих сервисов должно быть указано состояние Active: active (running) и время работы с момента запуска.
2.4. Настройка Nginx для TLS-терминации CDN
В мультикластерном сценарии Nginx обязателен как точка TLS-терминации CDN. Убедитесь, что узлы loran-10, loran-11 и loran-12 входят в группу zakroma-storage-nginx файла inventories/multicluster/cluster-1/hosts.
Не удаляйте и не заменяйте поставочный CDN-vhost в файле inventories/multicluster/cluster-1/group_vars/zakroma-storage-nginx.yml. Убедитесь, что в нём сохранены следующие ключевые параметры:
1- listen: "443 ssl" 2 filename: zakroma-cdn.cluster-1.zakroma.internal.443.conf 3 server_name: "zakroma-cdn.cluster-1.zakroma.internal" 4 extra_parameters: | 5 ssl_certificate /opt/certs/zakroma.crt; 6 ssl_certificate_key /opt/certs/zakroma.key; 7 location ~ ^/(.*) { 8 proxy_pass http://127.0.0.1:8099/$1$is_args$args; 9 }
Параметры удалённого кластера в zakroma_storage_cdn.others[] должны использовать host: "zakroma-cdn.cluster-2.zakroma.internal", port: 443, use_ssl: true и skip_verify: false.
Установите и настройте Nginx:
1ANSIBLE_CONFIG=ansible.cfg ansible-playbook \ 2 -i inventories/multicluster/cluster-1/hosts \ 3 playbooks/sample-play-zakroma-storage-nginx.yml
Проверьте конфигурацию и состояние сервиса на каждом узле Закрома.Хранение первого кластера:
1sudo nginx -t 2sudo systemctl status --no-pager --full nginx
Проверка конфигурации должна завершиться успешно, а сервис должен иметь состояние Active: active (running). Полное описание параметров приведено в Настройке Nginx.
2.5. Установка ZDS в режиме EC (Erasure Coding, минимум 3 хоста) (слой хранения данных)
Перед установкой рекомендуем ознакомиться с архитектурой ZDS: Что такое ZDS и Как ZDS хранит данные.
- Необходимо отредактировать файл переменных
inventories/multicluster/cluster-1/group_vars/zakroma-zds-v2-ec.ymlролиzakroma-zds-v2для группы хостовzakroma-zds-v2-ec.
1# Выполнить удаление бинарного файла — удаляется только бинарный файл в директории /opt/zakroma/zakroma-ds-agent 2zakroma_zds_delete_binary: false 3 4# Выполнить только рестарт сервисов и ничего больше 5zakroma_zds_restart_services_only: false
- Перед установкой выполнить preflight-проверку ZDS:
1ANSIBLE_CONFIG=ansible.cfg ansible-playbook -i inventories/multicluster/cluster-1/hosts playbooks/sample-play-zakroma-zdsv2-preflight.yml
Продолжайте установку только после успешного выполнения: в PLAY RECAP для всех узлов должны быть unreachable=0 и failed=0.
- Запустить playbook:
1ANSIBLE_CONFIG=ansible.cfg ansible-playbook -i inventories/multicluster/cluster-1/hosts playbooks/sample-play-zakroma-zds-v2-ec.yml
После установки на каждом узле первого кластера проверьте сервис ZDS:
1sleep 5 2sudo systemctl status --no-pager --full zakroma-ds-agent.service
Ожидаемое состояние — Active: active (running) с указанием времени работы сервиса.
3. Установка второго кластера
3.1. Создать inventory, включающий имена серверов в соответствующих хост-группах
Как пример можно использовать файл inventories/multicluster/cluster-2/hosts.
1[certificates] 2loran-20 ansible_host=10.129.0.20 3loran-21 ansible_host=10.129.0.21 4loran-22 ansible_host=10.129.0.22 5 6 7[zakroma-storage] 8loran-20 ansible_host=10.129.0.20 9loran-21 ansible_host=10.129.0.21 10loran-22 ansible_host=10.129.0.22 11 12[zakroma-zds-v2-ec] 13loran-20 ansible_host=10.129.0.20 zakroma_zds_node_name=loran-20 14loran-21 ansible_host=10.129.0.21 zakroma_zds_node_name=loran-21 15loran-22 ansible_host=10.129.0.22 zakroma_zds_node_name=loran-22
Проверьте SSH-доступ и выполнение Python-модулей Ansible:
1ANSIBLE_CONFIG=ansible.cfg ansible -m ping -i inventories/multicluster/cluster-2/hosts all
Ожидаемый результат: каждый узел отвечает SUCCESS и pong. Для проверки текущего ansible_hostname на узлах выполните:
1ANSIBLE_CONFIG=ansible.cfg ansible -m setup -i inventories/multicluster/cluster-2/hosts all | grep ansible_hostname
3.2. Копирование сертификатов на целевые хосты с помощью роли certificates
Поместите сертификат и ключ второго кластера в каталог roles/certificates/files/ в корне распакованной поставки на управляющем сервере. Значение certificates_copy_source_path: "files" оставьте без изменений: путь задаётся относительно каталога роли certificates.
- Необходимо отредактировать файл переменных
inventories/multicluster/cluster-2/group_vars/certificates.ymlролиcertificatesдля группы хостовcertificates.
1--- 2# Задаёт путь к каталогу, откуда копируются сертификаты и ключи. 3certificates_copy_source_path: "files" 4 5# Содержит информацию о каждом хосте, на который нужно скопировать сертификаты и ключи.
- Запустить playbook:
1ANSIBLE_CONFIG=ansible.cfg ansible-playbook -i inventories/multicluster/cluster-2/hosts playbooks/sample-play-copy-certificates.yml
3.3. Установка Zakroma Storage с помощью роли zakroma-storage
-
Подготовить файл с лицензией
licence, положить его в директорию ./files/zakroma-licence и запустить playbookplaybooks/sample-play-copy-licence-file.ymlдля группы хостовzakroma-storage. -
Далее необходимо отредактировать файл переменных
inventories/multicluster/cluster-2/group_vars/zakroma-storage.ymlролиzakroma-storageдля группы хостовzakroma-storage.
1--- 2# ---------------------------------------------------ОБЩИЕ НАСТРОЙКИ--------------------------------------------------- 3# Выполнить удаление Zakroma и ничего больше 4zakroma_storage_delete_only: false
- Перед установкой выполнить preflight-проверку Закрома.Хранение:
1ANSIBLE_CONFIG=ansible.cfg ansible-playbook -i inventories/multicluster/cluster-2/hosts playbooks/sample-play-zakroma-storage-preflight.yml
Продолжайте установку только после успешного выполнения: в PLAY RECAP для всех узлов должны быть unreachable=0 и failed=0.
- Запустить playbook:
1ANSIBLE_CONFIG=ansible.cfg ansible-playbook -i inventories/multicluster/cluster-2/hosts playbooks/sample-play-zakroma-storage.yml
После установки на каждом узле второго кластера проверьте сервисы Закрома.Хранение:
1sleep 5 2sudo systemctl status --no-pager --full \ 3 zakroma-storage-monolith.service \ 4 zakroma-storage-gateway.service
Для обоих сервисов должно быть указано состояние Active: active (running) и время работы с момента запуска.
3.4. Настройка Nginx для TLS-терминации CDN
В мультикластерном сценарии Nginx обязателен как точка TLS-терминации CDN. Убедитесь, что узлы loran-20, loran-21 и loran-22 входят в группу zakroma-storage-nginx файла inventories/multicluster/cluster-2/hosts.
Не удаляйте и не заменяйте поставочный CDN-vhost в файле inventories/multicluster/cluster-2/group_vars/zakroma-storage-nginx.yml. Убедитесь, что в нём сохранены следующие ключевые параметры:
1- listen: "443 ssl" 2 filename: zakroma-cdn.cluster-2.zakroma.internal.443.conf 3 server_name: "zakroma-cdn.cluster-2.zakroma.internal" 4 extra_parameters: | 5 ssl_certificate /opt/certs/zakroma.crt; 6 ssl_certificate_key /opt/certs/zakroma.key; 7 location ~ ^/(.*) { 8 proxy_pass http://127.0.0.1:8099/$1$is_args$args; 9 }
Параметры удалённого кластера в zakroma_storage_cdn.others[] должны использовать host: "zakroma-cdn.cluster-1.zakroma.internal", port: 443, use_ssl: true и skip_verify: false.
Установите и настройте Nginx:
1ANSIBLE_CONFIG=ansible.cfg ansible-playbook \ 2 -i inventories/multicluster/cluster-2/hosts \ 3 playbooks/sample-play-zakroma-storage-nginx.yml
Проверьте конфигурацию и состояние сервиса на каждом узле Закрома.Хранение второго кластера:
1sudo nginx -t 2sudo systemctl status --no-pager --full nginx
Проверка конфигурации должна завершиться успешно, а сервис должен иметь состояние Active: active (running). Полное описание параметров приведено в Настройке Nginx.
3.5. Установка ZDS в режиме EC (Erasure Coding, минимум 3 хоста) (слой хранения данных)
Перед установкой рекомендуем ознакомиться с архитектурой ZDS: Что такое ZDS и Как ZDS хранит данные.
- Необходимо отредактировать файл переменных
inventories/multicluster/cluster-2/group_vars/zakroma-zds-v2-ec.ymlролиzakroma-zds-v2для группы хостовzakroma-zds-v2-ec.
1# Выполнить удаление бинарного файла — удаляется только бинарный файл в директории /opt/zakroma/zakroma-ds-agent 2zakroma_zds_delete_binary: false 3 4# Выполнить только рестарт сервисов и ничего больше 5zakroma_zds_restart_services_only: false
- Перед установкой выполнить preflight-проверку ZDS:
1ANSIBLE_CONFIG=ansible.cfg ansible-playbook -i inventories/multicluster/cluster-2/hosts playbooks/sample-play-zakroma-zdsv2-preflight.yml
Продолжайте установку только после успешного выполнения: в PLAY RECAP для всех узлов должны быть unreachable=0 и failed=0.
- Запустить playbook:
1ANSIBLE_CONFIG=ansible.cfg ansible-playbook -i inventories/multicluster/cluster-2/hosts playbooks/sample-play-zakroma-zds-v2-ec.yml
После установки на каждом узле второго кластера проверьте сервис ZDS:
1sudo systemctl status --no-pager --full zakroma-ds-agent.service
Ожидаемое состояние — Active: active (running) с указанием времени работы сервиса.
Проверка готовности
Кластеры проверяются независимо. Для каждого кластера убедитесь, что:
- preflight- и установочные плейбуки завершились без
failedиunreachable; - на каждом узле сервисы
zakroma-storage-monolith.service,zakroma-storage-gateway.serviceиzakroma-ds-agent.serviceнаходятся в состоянияхactiveиenabled; - PostgreSQL кластера доступен со всех его узлов Закрома.Хранение;
- Admin UI кластера открывается по настроенному FQDN;
- кластер ZDS подключён в Admin UI по адресам из вывода Ansible после установки сервиса ZDS;
- функциональная проверка S3 проходит для каждого кластера — используйте тест из базовой инструкции.
Подробная проверка сервисов приведена в Проверке статуса сервисов.