Beta

Отказоустойчивый режим App Gateway Connector

Запуск двух или трёх исходящих экземпляров одного коннектора рабочей области, проверка состояния, обновление без простоя и сбор подтверждений для релиза.

Шаги

Выполняйте по порядку.

  1. 01Понять, нужен ли отказоустойчивый режимИспользуйте его для общих производственных внутренних приложений, а не для личного настольного коннектора.
  2. 02Подготовить схему запускаИспользуйте одну запись коннектора и один рабочий токен, но отдельный идентификатор для каждого процесса.
  3. 03Запустить в Kubernetes, systemd или Docker ComposeВыберите тот способ управления процессами, который уже используется для производственных сервисов в сети клиента.
  4. 04Обслуживать без планового простояВыведите один экземпляр из работы, дождитесь завершения потоков, перезапустите его и только потом переходите к следующему.
  5. 05Проверить и собрать подтвержденияИспользуйте doctor, состояние в панели, стендовые проверки и длинное окно метрик перед заявлением о производственной отказоустойчивости.

Справочник

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

Текущий статус и корректная формулировкаКоннектор уже может работать в активной отказоустойчивой схеме: несколько серверных процессов проходят проверку как один коннектор рабочей области, а BusinessProxy направляет новый трафик внутренних приложений на пригодный экземпляр. До завершения проверок релиза корректно считать этот режим готовым для стенда и контролируемого пилотного запуска.
  • Корректно: «реализация отказоустойчивого режима готова к стендовой проверке».
  • Некорректно: «производственный отказоустойчивый релиз полностью готов», пока не пройдены все проверки релиза.
  • Настольная оболочка не является рабочим процессом отказоустойчивого режима. Используйте CLI-коннектор как управляемый серверный процесс.
Когда использовать этот режимИспользуйте отказоустойчивый режим, когда внутренним приложением пользуется команда, оно поддерживает рабочие операции клиента или должно оставаться доступным во время перезапуска сервера с коннектором. Один процесс обычно достаточен для местной проверки, личного тестового контура или временного подтверждения идеи.
  • Два экземпляра — базовый производственный вариант.
  • Три экземпляра нужны при нескольких репликах API BusinessProxy или когда нужен больший запас при обслуживании.
  • Размещайте экземпляры на разных серверах или узлах, если нужно переживать отказ отдельного сервера.
Как устроена схемаКаждый экземпляр сам устанавливает исходящее соединение с BusinessProxy. Публичный входящий порт в сеть клиента не открывается. Все экземпляры используют один идентификатор коннектора и один рабочий токен, а CONNECTOR_INSTANCE_ID отличает запущенные процессы друг от друга. BusinessProxy отдельно отслеживает рабочие, выводимые из работы, устаревшие и отключённые экземпляры и не отправляет новые запросы на непригодные экземпляры.
  • Существующие потоки могут завершиться во время вывода из работы; новые потоки уходят на другой пригодный экземпляр.
  • Ротация токена закрывает старые проверенные туннели на всех репликах API.
  • Резервная передача остаётся страховочным путём, но в устойчивом состоянии её доля должна быть ниже 1% перед производственным заявлением.
Предварительные условияПеред добавлением экземпляров убедитесь, что один экземпляр коннектора работает устойчиво. Не используйте расширение схемы, чтобы скрыть неверный токен, недоступное внутреннее приложение, ошибку TLS или нестабильный сетевой путь.
  • В рабочей области есть запись App Gateway-коннектора и актуальный рабочий токен.
  • Каждый сервер с коннектором достигает API BusinessProxy по исходящему HTTPS и достигает каждого настроенного внутреннего адреса.
  • Секреты хранятся в защищённом хранилище платформы, а не в скриншотах, обращениях в поддержку или истории командной строки.
  • На серверах с коннектором включена синхронизация времени, чтобы сигналы активности и окна проверок были достоверными.
Общие рабочие значенияОставьте общие значения одинаковыми на всех экземплярах. Уникальным должен быть только CONNECTOR_INSTANCE_ID. Используйте устойчивые имена, по которым понятно место запуска процесса, например dc1-a, dc1-b или k8s-connector-1.
BUSINESSPROXY_API_URL=https://api.business-proxy.com
CONNECTOR_WORKSPACE_ID=<идентификатор-рабочей-области>
CONNECTOR_ID=<идентификатор-коннектора>
CONNECTOR_TOKEN=<рабочий-токен>
CONNECTOR_INSTANCE_ID=<уникальный-идентификатор-экземпляра>
CONNECTOR_TUNNEL_CONNECTIONS=2
CONNECTOR_DRAIN_ON_EXIT=true
CONNECTOR_DRAIN_TIMEOUT=30s
  • Не используйте один CONNECTOR_INSTANCE_ID для двух одновременно работающих процессов.
  • Начинайте с CONNECTOR_TUNNEL_CONNECTIONS=2, если поддержка не указала другое значение.
  • Оставьте CONNECTOR_DRAIN_ON_EXIT=true, чтобы обычный перезапуск сначала прекращал приём новых запросов.
Правило расчёта ёмкостиДля покрытия реплик API общее число туннелей коннектора должно покрывать реплики API BusinessProxy с запасом. Если панель или doctor сообщает о недостаточном покрытии, добавьте экземпляры коннектора или увеличьте число туннелей до того, как полагаться на отказоустойчивый режим.
количество_экземпляров * CONNECTOR_TUNNEL_CONNECTIONS >= коэффициент_запаса * число_реплик_API

Пример:
3 экземпляра * 2 туннеля >= 2 * 3 реплики API
Базовый запуск двух экземпляровСоздайте один общий файл переменных с общими значениями и отдельный небольшой файл для каждого экземпляра. Перед запуском загрузите оба файла. Точный путь к исполняемому файлу зависит от пакета, скачанного из аккаунта.
set -a
. /etc/businessproxy/connector/common.env
. /etc/businessproxy/connector/instance-a.env
set +a

businessproxy-connector doctor
businessproxy-connector run
  • Повторите команду на втором сервере или втором процессе с файлом instance-b.env.
  • В панели дождитесь, что оба экземпляра в сети и нет предупреждений об устаревшем сигнале или выводе из работы.
Запуск в KubernetesИспользуйте Kubernetes, если клиент уже ведёт там производственные сервисы. Обычно подходит Deployment. Рабочие значения храните в Secret, уникальный идентификатор экземпляра берите через Downward API, добавьте PodDisruptionBudget и используйте последовательное обновление.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: businessproxy-connector
spec:
  replicas: 2
  strategy:
    type: RollingUpdate
  template:
    spec:
      terminationGracePeriodSeconds: 60
      containers:
        - name: connector
          image: businessproxy/connector:<версия>
          envFrom:
            - secretRef:
                name: businessproxy-connector-runtime
          env:
            - name: CONNECTOR_INSTANCE_ID
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: CONNECTOR_DRAIN_ON_EXIT
              value: "true"
  • Добавьте правила исходящего доступа к API BusinessProxy по HTTPS и внутренний доступ к адресам приложений.
  • Не публикуйте Kubernetes Service для входящего трафика к коннектору.
Запуск через systemdИспользуйте systemd на Linux-серверах или виртуальных машинах. Общие значения держите в одном файле окружения, а значения конкретного экземпляра — в отдельных файлах. Каждый сервис должен автоматически перезапускаться и получать достаточно времени на вывод из работы.
[Unit]
Description=BusinessProxy Connector %i
After=network-online.target
Wants=network-online.target

[Service]
EnvironmentFile=/etc/businessproxy/connector/common.env
EnvironmentFile=/etc/businessproxy/connector/%i.env
ExecStart=/usr/local/bin/businessproxy-connector run
Restart=always
RestartSec=5s
TimeoutStopSec=75s
KillSignal=SIGTERM

[Install]
WantedBy=multi-user.target

# Запуск двух экземпляров:
systemctl enable --now businessproxy-connector@instance-a
systemctl enable --now businessproxy-connector@instance-b
Запуск через Docker ComposeИспользуйте Docker Compose, если внутренние сервисы клиента работают в контейнерах, но Kubernetes не используется. Опишите отдельный сервис для каждого экземпляра, чтобы у каждого процесса был устойчивый идентификатор и независимый перезапуск.
services:
  connector-a:
    image: businessproxy/connector:<версия>
    restart: unless-stopped
    env_file:
      - ./common.env
    environment:
      CONNECTOR_INSTANCE_ID: connector-a
      CONNECTOR_DRAIN_ON_EXIT: "true"
  connector-b:
    image: businessproxy/connector:<версия>
    restart: unless-stopped
    env_file:
      - ./common.env
    environment:
      CONNECTOR_INSTANCE_ID: connector-b
      CONNECTOR_DRAIN_ON_EXIT: "true"
Последовательное обновление без планового простояПерезапускайте экземпляры по одному. Процесс должен перейти в режим вывода из работы, перестать принимать новые потоки, дать существующим потокам завершиться до истечения времени ожидания и только затем выйти. Перед переходом к следующему экземпляру убедитесь, что другой экземпляр остаётся в сети.
  • Не останавливайте все экземпляры сразу, если простой внутреннего приложения не является осознанным действием.
  • При штатном последовательном обновлении новые запросы должны восстановиться за несколько секунд.
  • Если доля резервной передачи выросла и не вернулась ниже 1%, остановите обновление и проверьте покрытие туннелей.
Ротация токена в отказоустойчивом режимеОбновляйте рабочий токен из аккаунта, если он мог быть раскрыт или этого требует плановое обслуживание. После ротации обновите секрет на каждом сервере с коннектором и перезапустите экземпляры по одному. Старые туннели, прошедшие проверку старым токеном, закрываются BusinessProxy.
  • Не меняйте токен посреди первого расширения схемы, если нет подозрения на раскрытие токена.
  • Держите под рукой пакет отката предыдущей версии, но не откатывайтесь на случайно собранный локальный файл.
Операционные проверкиПосле запуска или изменения отказоустойчивой схемы проверяйте и сервер с коннектором, и состояние в BusinessProxy. В панели должны быть видны несколько рабочих экземпляров одного коннектора, без устаревших сигналов, без оставшихся после обслуживания экземпляров в выводе из работы и без предупреждения о покрытии.
businessproxy-connector doctor

# Ожидаемое состояние в панели:
# - коннектор в сети
# - 2 или 3 рабочих экземпляра
# - после обслуживания нет устаревших экземпляров или экземпляров в выводе из работы
# - нет предупреждения о покрытии реплик API
Подтверждения для релиза и длинное окно проверкиДля контролируемого пилотного запуска может быть достаточно состояния в панели и коротких проверок. Для производственного заявления об отказоустойчивости нужен полный набор подтверждений: локальные проверки релиза, проверки безопасности, стендовая нагрузка, отказ одного экземпляра, последовательное обновление, проверка оповещений и 168-часовое окно метрик с покрытием реплик API и данными по ограничениям потоков.
npm run connector:ha-staging-readiness:check -- \
  --profile staging \
  --env-file /secure/env/businessproxy/connector-ha-staging.env \
  --evidence-dir /secure/evidence/businessproxy/connector-ha-staging/readiness

npm run connector:ha-staging-evidence:run -- \
  --profile staging \
  --env-file /secure/env/businessproxy/connector-ha-staging.env \
  --evidence-dir /secure/evidence/businessproxy/connector-ha-staging

npm run connector:ha-long-window-evidence:run -- \
  --profile staging \
  --env-file /secure/env/businessproxy/connector-ha-long-window.env
  • Файлы подтверждений не должны содержать токены, частные IP-адреса, внутренние URL, тела запросов или сырой вывод метрик.
  • Не закрывайте проверки G3-G9 до прохождения настоящих стендовых подтверждений.
Что проверить при ошибкеБольшинство проблем отказоустойчивого режима связано с настройкой или размещением: повторяющиеся идентификаторы экземпляров, недоступность внутреннего приложения с одного из серверов, не обновлённый после ротации секрет, одновременный перезапуск всех экземпляров или недостаточное покрытие туннелей для реплик API.
  • В сети только один экземпляр: проверьте CONNECTOR_INSTANCE_ID, правило перезапуска сервиса, исходящий HTTPS и рабочий токен.
  • Экземпляр остаётся устаревшим: проверьте синхронизацию времени на сервере, журналы процесса и сетевой путь к API BusinessProxy.
  • Экземпляр остался в выводе из работы после обслуживания: убедитесь, что старый процесс завершился, а управляющий сервис запустил новый процесс с нужным идентификатором.
  • Доля резервной передачи высокая: проверьте покрытие реплик API, число туннелей, насыщение коннектора и частые переподключения.
  • Не работает только одно внутреннее приложение: выполните диагностику с каждого сервера коннектора до этого внутреннего адреса, прежде чем менять отказоустойчивую схему.
Чего этот режим не делаетОтказоустойчивый режим коннектора сохраняет исходящий путь доступа, когда один процесс или сервер коннектора перезапускается или выходит из строя. Он не заменяет резервное копирование, отказоустойчивость базы данных самого внутреннего приложения, кластер GitLab или ERP, управление учётными записями и резервирование сети клиента.
  • Если само внутреннее приложение не работает, коннектор не сделает его исправным.
  • Если все экземпляры коннектора запущены на одном отказавшем сервере, отказоустойчивости уровня сервера не будет.
  • Если сеть клиента блокирует исходящий HTTPS к BusinessProxy со всех серверов, коннектор не сможет установить туннели.