Миграция БД Платформы

При развёртывании Платформы СУБД PostgreSQL развёртывается на том же узле (при одноузловой установке) или группе узлов (при кластерной установке). Установщик создаёт в СУБД пользователя platform и служебные БД auth_db и authz_db.

Эта инструкция описывает миграцию служебных БД auth_db и authz_db из сервера PostgreSQL, развёрнутого вместе с Платформой, на внешний сервер или в отказоустойчивый кластер, развёрнутый средствами дистрибутива.

Далее сервер PostgreSQL, развёрнутый на узлах Платформы, называется сервером-источником, а сервер, на который выполняется миграция — сервером-приёмником.

На период миграции работа Платформы будет приостановлена.

Перед началом работы

Чтобы сократить время миграции, подготовьте сервер-приёмник заранее:

  1. Убедитесь, что сервер имеет виртуальный IP-адрес или доменное имя, всегда указывающие на мастер.

  2. Убедитесь, что мастер доступен из сети Платформы по указанному виртуальному IP-адресу или доменному имени.

  3. Создайте в СУБД роль для пользователя, который будет владеть служебными БД Платформы. Рекомендуется использовать название platform:

    CREATE ROLE platform WITH LOGIN PASSWORD '<password>';
  4. Создайте две БД для хранения служебных данных Платформы.

    В качестве названий рекомендуется использовать auth_db и authz_db. Владельцем обеих БД должен быть созданный ранее пользователь.

    CREATE DATABASE <db_name>
      OWNER platform
      ENCODING 'UTF8'
      LC_COLLATE 'ru_RU.UTF-8'
      LC_CTYPE 'ru_RU.UTF-8'
      TEMPLATE template0;

Миграция

На установочном узле Платформы выполните следующие действия:

  1. Остановите сервисы:

    docker service scale platform-frontend=0
    docker service scale api-gateway=0
    docker service scale auth-service=0
    docker service scale authz-service=0
  2. Убедитесь, что все указанные сервисы остановлены:

    docker service ls

    Сервис считается остановленным, если в колонке REPLICAS для него выводится значение 0/0.

    Пример вывода при успешной остановке сервисов
    ID             NAME                MODE         REPLICAS   IMAGE                       PORTS
    x4g5fw593oc8   api-gateway         replicated   0/0        api-gateway:2.179.8         *:3000->3000/tcp
    huyidwt6leec   auth-service        replicated   0/0        auth-service:2.179.8
    ax0wrrtr1bj0   authz-service       replicated   0/0        authz-service:2.179.8
    yun0zvik7110   foliage-service     replicated   1/1        foliage-service:2.179.8
    vtz4c6t0kpiu   mgmt                replicated   1/1        mgmt-genomu:2.179.8         *:48805->48805/tcp
    yk4kp3fhvel5   platform-frontend   replicated   0/0        platform-frontend:2.179.8   *:80->80/tcp, *:443->443/tcp
    0x0omy92690x   postgres            replicated   1/1        postgres:2.179.8            *:5432->5432/tcp
    qwz6w2a07wv3   tunnel-service      replicated   1/1        tunnel-service:2.179.8      *:15000-15500->15000-15500/tcp, *:48806->48806/tcp
    qg6vm8egqxfd   wssh                replicated   1/1        wssh-genomu:2.179.8         *:2222->22/tcp
  3. Создайте директорию для хранения дампов БД, например:

    mkdir -p /opt/skala-r/backups
  4. В директории с дистрибутивом найдите файл с актуальными параметрами развёртывания. Как правило, он имеет название platform-config-<version>-<date>-<time>.yml.

  5. Извлеките параметры развёртывания, определяющие настройки хранения служебных БД и подключения к ним.

    • Если для подключения к БД используются одни и те же учётные данные, используйте значения параметров:

      • common.postgres_password;

      • common.postgres_username.

    • Если для подключения к каждой БД используется свой набор учётных данных, используйте значения параметров:

      • auth_service.db.password;

      • auth_service.db.username;

      • authz_service.db.password;

      • authz_service.db.username.

  6. Определите идентификатор контейнера, в котором выполняется экземпляр PostgreSQL:

    docker ps --filter name=postgres --format '{{.Names}}' | head -1
  7. Создайте дампы баз auth_db и authz_db:

    docker -exec -i <pg_id> env PGPASSWORD=<password> \
      pg_dump \
         --host 127.0.0.1 \
         --user "<user>" \
         --no-password \
         --format=custom \
         --compress=6 \
         <db_name> > /opt/skala-r/backups/<db_name>.dump

    Здесь:

    • <pg_id> — идентификатор контейнера, в котором выполняется экземпляр PostgreSQL;

    • <password> — пароль пользователя-владельца соответствующей БД;

    • <user> — название учётной записи пользователя-владельца соответствующей БД;

    • <db_name> — название БД.

    При успешном выполнении этой операции в директории /opt/skala-r/backups/ появятся файлы auth_db.dump и authz_db.dump.

  8. Измените режим доступа к файлам дампов на 600:

    chmod 600 /opt/skala-r/backups/*.dump
  9. Восстановите данные из дампов на сервере-приёмнике:

    pg_restore -h <server> -p 5432 -U platform -d auth_db  /opt/skala-r/backups/auth_db.dump
    pg_restore -h <server> -p 5432 -U platform -d authz_db /opt/skala-r/backups/authz_db.dump

    Здесь <server> — виртуальный IP-адрес или доменное имя, указывающие на мастер сервера-приёмника.

  10. Перейдите в директорию с файлами дистрибутива Платформы.

  11. В параметрах развёртывания:

    • укажите учётные данные для подключения к новому серверу PostgreSQL;

    • параметру common.postgres_install присвойте значение false.

  12. Запустите скрипт start.sh с аргументом -f, в значении которого укажите путь к файлу конфигурации развёртывания, например:

    ./start.sh -f platform-config-2.2.1-20260904-101203.yml

Проверка корректности

Чтобы убедиться в корректности миграции:

  1. Проверьте статусы служб, использующих служебные БД:

    docker service ls

    Для всех служб значения в колонке REPLICAS должны отличаться от 0/0, например:

    ID             NAME                MODE         REPLICAS   IMAGE                       PORTS
    x4g5fw593oc8   api-gateway         replicated   1/1        api-gateway:2.179.8         *:3000->3000/tcp
    huyidwt6leec   auth-service        replicated   1/1        auth-service:2.179.8
    ax0wrrtr1bj0   authz-service       replicated   1/1        authz-service:2.179.8
    yun0zvik7110   foliage-service     replicated   1/1        foliage-service:2.179.8
    vtz4c6t0kpiu   mgmt                replicated   1/1        mgmt-genomu:2.179.8         *:48805->48805/tcp
    yk4kp3fhvel5   platform-frontend   replicated   1/1        platform-frontend:2.179.8   *:80->80/tcp, *:443->443/tcp
    0x0omy92690x   postgres            replicated   1/1        postgres:2.179.8            *:5432->5432/tcp
    qwz6w2a07wv3   tunnel-service      replicated   1/1        tunnel-service:2.179.8      *:15000-15500->15000-15500/tcp, *:48806->48806/tcp
    qg6vm8egqxfd   wssh                replicated   1/1        wssh-genomu:2.179.8         *:2222->22/tcp
  2. Авторизуйтесь в веб-интерфейсе Геном и убедитесь в доступности всех необходимых разделов.

Действия при наличии ошибок

Если какая-либо из проверок завершилась ошибкой, проверьте логи служб. Для этого используйте команду:

docker service logs <service>

Здесь <service> — название службы, auth-service или authz-service соответственно.