Перейти к содержанию

Раздел 3. Указания по восстановлению

3.1. Сохранение и восстановление данных

Восстановление BOX5-DIT-MGSN выполняется из заранее сохранённых копий конфигурации, данных, моделей и дистрибутива. Для целостного файлового восстановления резервная копия создаётся в технологическое окно: сначала фиксируется версия поставки, затем останавливаются сервисы, копируются данные и только после проверки архива сервисы запускаются снова.

flowchart TD detect["Обнаружен сбой или плановое восстановление"] scope["Определить границы:
сервис, нода, данные, лицензия, модели"] stop["Остановить затронутый контур"] restore["Восстановить CODE, данные,
модели, лицензирование"] start["Запустить swarm и песочницу"] checks["Выполнить контрольный чек-лист"] ok{"Проверки успешны?"} work["Передать контур в эксплуатацию"] escalate["Эскалация и повторное восстановление"] detect --> scope --> stop --> restore --> start --> checks --> ok ok -->|"да"| work ok -->|"нет"| escalate --> scope

Исходный Mermaid-код схемы: И2-MER-003. 3.1. Сохранение и восстановление данных.

3.1.1. Состав резервной копии

Объект Что сохранять Когда сохранять Примечание
Дистрибутив и Docker-образы Архив dockerimg.tgz, каталог исходной поставки, сведения о версии поставки До установки, перед обновлением, после успешной установки Архив образов должен быть доступен для загрузки на все ноды командой docker load.
Конфигурация решения ~/CODE, включая box3, node-red-sandbox, ui-rest/ui-config/config.json, .env-файлы без публикации чувствительной информации Перед каждым изменением конфигурации и перед обновлением В общие каналы и документацию не включаются пароли, токены и полные значения чувствительных переменных.
Данные swarm-контура Каталог, заданный COMPOSE_DATA_SWARM_PATH, типовое значение /data/compose-data2 По регламенту площадки и перед обновлением Включает PostgreSQL/ClickHouse/Redis/MinIO-данные, логи, сценарии, отчёты, видеофрагменты и служебные каталоги.
Данные песочницы /data/sandbox-compose-data, архив sandbox-compose-data.tgz при поставке Перед заменой песочницы, перед обновлением сценариев и моделей После восстановления требуется владелец 1000:1000 и проверка COMPOSE_DATA_DIR.
Модели /data/models, архив nri-models.tgz при поставке, файл фильтра /models/sel-models.csv внутри контейнеров Перед заменой весов, после конвертации моделей, перед обновлением инференса Перед ручной заменой старый каталог сохраняется как /data/models.old.
Лицензирование Серийный номер LICENSE_KEY_SERIAL, тип активации, файлы оффлайн-активации request.request и request.license, состояние Guardant runtime при наличии регламента площадки После активации и при переносе на новый сервер Файлы лицензии хранятся в ограниченном архиве администратора; в Git не помещаются.
Автозапуск /etc/systemd/system/box-restart.service на мастер-ноде и вычислительных нодах После настройки systemd и перед заменой сервера Нужен для восстановления автозапуска после перезагрузки.

3.1.2. Порядок сохранения

  1. Зафиксировать окружение, дату, версию поставки и список нод:
docker node ls
docker service ls
  1. На мастер-ноде остановить кластер:
cd ~/CODE/box3
./utils/swarm/swarm.sh stop
  1. На ноде песочницы остановить Node-RED sandbox, если он участвует в резервном копировании:
cd ~/CODE/node-red-sandbox
docker compose down
  1. Сохранить конфигурацию и данные в архив площадки. Пример команд:
mkdir -p /data/backups/sova-$(date +%F)
rsync -a --numeric-ids ~/CODE /data/backups/sova-$(date +%F)/
rsync -a --numeric-ids /data/compose-data2 /data/backups/sova-$(date +%F)/
rsync -a --numeric-ids /data/sandbox-compose-data /data/backups/sova-$(date +%F)/
rsync -a --numeric-ids /data/models /data/backups/sova-$(date +%F)/
sudo cp /etc/systemd/system/box-restart.service /data/backups/sova-$(date +%F)/ || true
  1. Проверить наличие архива, свободное место и контрольные суммы:
df -h
du -sh /data/backups/sova-$(date +%F)
find /data/backups/sova-$(date +%F) -type f -print0 | xargs -0 sha256sum \
  > /data/backups/sova-$(date +%F).sha256
  1. Запустить кластер и песочницу:
cd ~/CODE/box3 && ./utils/swarm/swarm.sh start
cd ~/CODE/node-red-sandbox && docker compose up -d
  1. Выполнить контроль после запуска: docker node ls, docker service ls, curl localhost, nvidia-smi на вычислительных нодах.

3.1.3. Порядок восстановления из резервной копии

Восстановление выполняется от меньшей области к большей. Если потерян один сервис, сначала проверяется возможность восстановления домена и его данных. При потере ноды или диска выполняется полное восстановление узла.

  1. Подготовить целевой сервер: установить системное ПО, Docker, Docker Compose, NVIDIA driver и NVIDIA Container Toolkit в версиях, указанных в разделе 2, пункте 2.2.1.
  2. На вычислительных нодах восстановить /etc/docker/daemon.json, отключить sleep/hibernate и проверить nvidia-smi.
  3. Загрузить Docker-образы на каждую ноду:
docker load -i /data/update/dockerimg.tgz
  1. Восстановить ~/CODE, каталог COMPOSE_DATA_SWARM_PATH, данные песочницы и модели из резервной копии:
rsync -a --numeric-ids /data/backups/<backup_id>/CODE/ ~/CODE/
sudo rsync -a --numeric-ids /data/backups/<backup_id>/compose-data2/ /data/compose-data2/
sudo rsync -a --numeric-ids /data/backups/<backup_id>/sandbox-compose-data/ /data/sandbox-compose-data/
sudo rsync -a --numeric-ids /data/backups/<backup_id>/models/ /data/models/
sudo chown -R 1000:1000 /data/models /data/sandbox-compose-data
  1. Проверить в ~/CODE/box3/utils/swarm/swarm.sh, что COMPOSE_DATA_SWARM_PATH указывает на восстановленный каталог /data/compose-data2.
  2. Проверить настройки песочницы в ~/CODE/node-red-sandbox/.env: COMPOSE_DATA_DIR, MLFLOW_MODELS_PATH, NRI_ASSETS_HOST_DIR, NGINX_HOST_PORT. В ~/CODE/box3/ui-rest/ui-config/config.json проверить SCENARIOS_FRAME_URL.
  3. Восстановить или повторно выполнить оффлайн-активацию Guardant. Если сервер или состояние /var/guardant изменились, старый request-файл не используется: сформировать новый запрос через curl http://localhost:19191/get_request и загрузить новый ответ активации по процедуре раздела 2, пункта 2.2.4.
  4. Инициализировать или восстановить Docker Swarm:
docker swarm init --advertise-addr <IP-адрес_мастер-ноды>
docker swarm join --token <token> <master_ip>:2377
  1. Назначить лейблы нод db, rest, inference, а для ноды песочницы также nr_sandbox, flows_manager, events_validator.
  2. Запустить кластер и песочницу:

    cd ~/CODE/box3 && ./utils/swarm/swarm.sh start
    cd ~/CODE/node-red-sandbox && docker compose up -d
    
  3. При восстановлении моделей выполнить проверочную конвертацию и выгрузку моделей в хранилище:

    docker exec -it $(docker ps | grep nr-sbx-nri | awk '{print $1}' | head -n1) bash
    python3 -m nri.mlflow.tools.convert_all_models --models_filter_path /models/sel-models.csv
    exit
    
  4. Выполнить контрольный чек-лист раздела 2, пункта 2.4.1.

3.1.4. Контроль успешности восстановления

Проверка Команда Норма
Состояние swarm docker node ls Все ноды Ready и Active; мастер-нода в состоянии Leader.
Реплики сервисов docker service ls Для штатных сервисов REPLICAS соответствует x/x.
Ошибки задач docker node ps --no-trunc <node_hostname> Поле ERROR пустое, задачи находятся в Running.
Web-интерфейс curl localhost Возвращается HTML приложения без ошибки HTTP-запроса.
Nginx docker logs bx_ui-nginx.1.<service_id> \| head -n 20 В логах есть запросы со статусом 200, ошибок старта нет.
GPU nvidia-smi GPU доступны, драйвер работает без ошибок.
NVIDIA runtime cat /etc/docker/daemon.json Указан "default-runtime": "nvidia".
Лицензия docker logs inf-guardant-control-center \| grep Activated В лицензированном контуре активация подтверждена.
Модели Конвертация convert_all_models внутри песочницы Конвертация завершается без ошибок.

3.2. Действия при сбоях

При сбоях администратор действует по принципу локализации: сначала определить границы отказа, затем остановить только затронутый контур, восстановить данные или конфигурацию и выполнить чек-лист. Ручное изменение файлов внутри контейнеров не считается штатным способом восстановления, так как изменения теряются при пересоздании контейнеров.

3.2.1. Первичная диагностика

  1. Проверить состояние нод и сервисов:
docker node ls
docker service ls
docker node ps --no-trunc <node_hostname>
  1. Проверить свободное место и крупные каталоги:
df -h
ncdu /data
  1. Проверить web-доступ и nginx:
curl localhost
docker logs bx_ui-nginx.1.<service_id> --tail 200
  1. На вычислительных нодах проверить GPU и runtime:
nvidia-smi
cat /etc/docker/daemon.json
  1. Проверить лейблы нод:
docker node ls -q | xargs docker node inspect \
  -f '{{ .ID }} [{{ .Description.Hostname }}]: {{ .Spec.Labels }}'

3.2.2. Типовые сбои и действия администратора

Сбой Признаки Действия Контроль после восстановления
Нода недоступна в swarm В docker node ls нода не Ready или AVAILABILITY не Active Проверить сеть и Docker daemon на ноде; при потере сервера подготовить замену, выполнить docker swarm join, восстановить данные и назначить прежние лейблы. docker node ls, docker node ps --no-trunc <node_hostname>.
Реплика сервиса не запускается В docker service ls значение REPLICAS меньше требуемого; в docker node ps есть ERROR Посмотреть docker service ps <service> --no-trunc и docker logs; проверить наличие образа, env-конфигурацию, доступность volume и свободное место; после исправления выполнить запуск через ./utils/swarm/swarm.sh start или перезапуск затронутого домена штатным скриптом. Реплики x/x, поле ERROR пустое.
Ошибка загрузки Docker-образов docker load завершается ошибкой, нужный image tag отсутствует Проверить целостность dockerimg.tgz, место на диске, повторить передачу архива; если архив собирался из исходного сервера с нетегированными образами, предварительно выполнить согласованный docker system prune на исходном сервере и пересобрать архив. docker images, повторный docker load.
Ошибка NVIDIA driver или runtime nvidia-smi не видит GPU; сервисы инференса не получают GPU Проверить драйвер не ниже требуемой версии, nvidia-container-toolkit, /etc/docker/daemon.json; перезапустить Docker в технологическое окно и затем сервисы инференса. nvidia-smi, cat /etc/docker/daemon.json, запуск inf-nri-inference.
Ошибка лицензирования Guardant Инференс или guardant-сервис стартует с ошибками лицензии; нет подтверждения Activated Проверить grdcontrol.service, LICENSE_KEY_SERIAL, порт 19191; при переносе сервера или очистке /var/guardant выполнить новую оффлайн-активацию. systemctl status grdcontrol.service, docker logs inf-guardant-control-center.
Web-интерфейс недоступен curl localhost возвращает ошибку; в браузере нет UI Проверить ui-rest, bx_ui-nginx, свободное место, upstream-сервисы; сверить SCENARIOS_FRAME_URL, если недоступна только песочница. curl localhost, логи nginx со статусом 200.
Повреждение или потеря данных Ошибки PostgreSQL/ClickHouse/MinIO/Redis, отсутствуют сценарии, отчёты или файлы Остановить кластер, восстановить соответствующий каталог из резервной копии в /data/compose-data2, сохранить владельцев и права, запустить кластер. Для MinIO и БД не смешивать части разных резервных копий без отдельного решения администратора. Запуск сервисов, выборочная проверка сценариев, отчётов и событий через UI/API.
Нехватка места df -h показывает заполнение раздела; сервисы пишут ошибки записи Остановить операции загрузки, удалить только согласованные временные файлы и устаревшие архивы, при необходимости расширить диск; не удалять каталоги БД, MinIO и моделей без резервной копии. df -h, отсутствие ошибок записи в логах.
Песочница Node-RED недоступна Не открывается iframe, не запускаются sandbox-сессии, ошибки nr-sbx-* Проверить docker compose ps в ~/CODE/node-red-sandbox, .env с COMPOSE_DATA_DIR, MLFLOW_MODELS_PATH, NRI_ASSETS_HOST_DIR, NGINX_HOST_PORT; восстановить /data/sandbox-compose-data и права 1000:1000. docker compose ps, открытие песочницы, успешный запуск конвертации модели.
Модели не конвертируются или не подхватываются инференсом Ошибки convert_all_models, push_models_to_vlflow, запуск сценариев без нужной модели Проверить /data/models, файл фильтра sel-models.csv, права 1000:1000; при необходимости восстановить модели из архива, выполнить конвертацию в песочнице и выгрузку в хранилище моделей. Успешная конвертация и запуск inf-nri-inference.
Сбой автозапуска после перезагрузки После reboot кластер или /tmp/inference_ipc не восстановлены Проверить /etc/systemd/system/box-restart.service, systemctl is-enabled box-restart.service, рабочий каталог и пользователя в unit-файле; восстановить unit из резервной копии и выполнить sudo systemctl enable box-restart.service. После плановой перезагрузки сервисы поднимаются, /tmp/inference_ipc создан.

3.2.3. Восстановление после полной потери ноды

  1. Установить ОС и системные зависимости по требованиям раздела 2.
  2. Восстановить Docker, Docker Compose, NVIDIA driver и NVIDIA Container Toolkit, если нода вычислительная.
  3. Загрузить dockerimg.tgz, восстановить /data/compose-data2, /data/models и при необходимости /data/sandbox-compose-data.
  4. На мастер-ноде получить актуальную команду присоединения:
docker swarm join-token worker
  1. Присоединить заменённую ноду к swarm, назначить прежние лейблы и запустить кластер.
  2. Проверить задачи на восстановленной ноде:
docker node ps --no-trunc <node_hostname>

3.2.4. Эскалация

Администратор эскалирует сбой ответственному DevOps/VizorLabs, если:

  • восстановление из последней резервной копии не запускает сервисы;
  • потеряны или повреждены данные БД/MinIO без актуальной резервной копии;
  • Guardant не принимает оффлайн-ответ или не поднимает порт 19191;
  • ошибка затрагивает интеграцию с ПК-КОТ в PROD;
  • повторный запуск моделей или конвертация завершаются одинаковой ошибкой.

В обращении фиксируются окружение, время сбоя, выполненные команды, состояние docker node ls, docker service ls, проблемные строки логов и версия поставки. Чувствительная информация, включая полные .env-файлы, пароли, токены и лицензии, в обращение не включается.