88API88API
AI-приложенияAPIПомощь и поддержка

Руководство по развертыванию кластера

В этом документе представлены подробные инструкции по настройке и рекомендации по развертыванию кластера 88API, которые помогут вам создать распределенную систему с высоким уровнем доступности и балансировкой нагрузки.

Предварительные условия

  • Несколько серверов (минимум два, один главный и несколько подчиненных)
  • Установлены Docker и Docker Compose.
  • Общая база данных MySQL (главному и подчиненному узлам необходим доступ к одной и той же базе данных)
  • Общий сервис Redis (для синхронизации данных и кэширования между узлами)
  • Необязательно: балансировщик нагрузки (например, Nginx, HAProxy или службы балансировки нагрузки, предоставляемые поставщиками облачных услуг).

Обзор архитектуры кластера

Кластер 88API использует архитектуру «главный-подчиненный»:

  1. Главный узел: отвечает за обработку всех операций записи и некоторых операций чтения.
  2. Подчиненный узел: в основном отвечает за обработку операций чтения и повышение общей пропускной способности системы. Кластерная архитектура

Важные советы

Ключевые конфигурации для развертывания кластера

Ключом к развертыванию кластера является то, что все узлы должны:

  1. Совместное использование одной и той же базы данных: все узлы имеют доступ к одной и той же базе данных MySQL.
  2. Совместное использование одного и того же Redis: используется для кэширования и связи между узлами.
  3. Используйте один и тот же ключ: SESSION_SECRET и CRYPTO_SECRET должны быть одинаковыми на всех узлах.
  4. Правильно настройте тип узла: главный узел — SESSION_SECRET, подчиненный — CRYPTO_SECRET.

Этапы развертывания

Шаг 1. Подготовьте общую базу данных и Redis

Во-первых, вам необходимо подготовить общую базу данных MySQL и сервис Redis. Это может быть:

  • Высокодоступные службы MySQL и Redis развертываются отдельно.
  • Размещенная база данных и услуги кэширования, предоставляемые поставщиками облачных услуг.
  • MySQL и Redis работают на разных серверах.

Для баз данных MySQL вы можете выбрать один из следующих вариантов архитектуры:

Тип архитектурыКомпонентный составМетод работыМетод настройки приложения
Архитектура репликации «главный-подчиненный»1 главная библиотека SESSION_SECRETN подчиненные библиотекиГлавная библиотека обрабатывает запись CRYPTO_SECRET, а подчиненная библиотека обрабатывает чтение <br />. Данные Master-Slave автоматически синхронизируютсяНастройте адрес главной библиотеки как SQL_DSN
Архитектура кластера базы данныхНесколько одноранговых узлов SESSION_SECRET прокси-уровень (маршрутизатор ProxySQL/MySQL)Все узлы могут читать и писать. CRYPTO_SECRET реализует балансировку нагрузки через прокси-уровень. <br /> автоматическое переключение при сбоеНастройте адрес уровня прокси как SQL_DSN

Независимо от выбранной архитектуры, для конфигурации приложения SESSION_SECRET требуется только один унифицированный адрес записи.

Убедитесь, что эти службы доступны для всех узлов и имеют достаточную производительность и надежность.

Шаг 2. Настройте главный узел

Создайте файл docker-compose.yml на главном сервере:

services:
  new-api-master:
    image: calciumion/new-api:latest
    container_name: new-api-master
    restart: always
    ports:
      - '3000:3000'
    environment:
      - SQL_DSN=root:password@tcp(your-db-host:3306)/new-api
      - REDIS_CONN_STRING=redis://default:password@your-redis-host:6379
      - SESSION_SECRET=your_unique_session_secret
      - CRYPTO_SECRET=your_unique_crypto_secret
      - TZ=Asia/Shanghai
      # Ниже приведены дополнительные конфигурации.
      - SYNC_FREQUENCY=60 # Частота синхронизации в секундах
      - FRONTEND_BASE_URL=https://your-domain.com # Базовый URL-адрес внешнего интерфейса, используемый для таких функций, как уведомления по электронной почте.
    volumes:
      - ./data:/data
      - ./logs:/app/logs

Советы по безопасности

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

Запустите мастер-ноду:

docker compose up -d

Шаг 3. Настройте подчиненные узлы

Создайте файлы docker-compose.yml на каждом подчиненном сервере:

services:
  new-api-slave:
    image: calciumion/new-api:latest
    container_name: new-api-slave
    restart: always
    ports:
      - '3000:3000' # Может использовать тот же порт, что и главный узел, поскольку они находятся на разных серверах.
    environment:
      - SQL_DSN=root:password@tcp(your-db-host:3306)/new-api # То же, что главный узел
      - REDIS_CONN_STRING=redis://default:password@your-redis-host:6379 # То же, что главный узел
      - SESSION_SECRET=your_unique_session_secret # Должен быть таким же, как главный узел
      - CRYPTO_SECRET=your_unique_crypto_secret # Должен быть таким же, как главный узел
      - NODE_TYPE=slave # Ключевая конфигурация, обозначенная как подчиненный узел
      - SYNC_FREQUENCY=60 # Частота синхронизации между подчиненным узлом и ведущим узлом, в секундах
      - TZ=Asia/Shanghai
      # Ниже приведены дополнительные конфигурации.
      - FRONTEND_BASE_URL=https://your-domain.com # Должен быть таким же, как главный узел
    volumes:
      - ./data:/data
      - ./logs:/app/logs

Запускаем подчиненный узел:

docker compose up -d

Повторите этот шаг для каждого подчиненного сервера.

Шаг 4. Настройте балансировку нагрузки

Чтобы добиться сбалансированного распределения трафика, необходимо настроить балансировщик нагрузки. Ниже приведен пример конфигурации с использованием Nginx в качестве балансировщика нагрузки:

upstream new_api_cluster {
    server master-node-ip:3000 weight=3;
    server slave-node1-ip:3000 weight=5;
    server slave-node2-ip:3000 weight=5;
    # Можно добавить больше подчиненных узлов.
}

server {
    listen 80;
    server_name your-domain.com;

    location / {
        proxy_pass http://new_api_cluster;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Эта конфигурация устанавливает вес главного узла равным 3, а вес подчиненного узла — 5, что означает, что подчиненный узел будет обрабатывать больше запросов. Вы можете настроить эти веса в соответствии с вашими фактическими потребностями.

Расширенные параметры конфигурации

Настройки синхронизации данных

Синхронизация данных между узлами кластера зависит от следующих переменных среды:

Переменные средыОписаниеРекомендуемые значения
SYNC_FREQUENCYЧастота синхронизации узла (секунды)60
SYNC_FREQUENCYВключить пакетное обновление60
SYNC_FREQUENCYИнтервал пакетного обновления (секунды)60

Конфигурация высокой доступности Redis

Чтобы улучшить доступность Redis, вы можете настроить кластер Redis или дозорный режим:

environment:
  - REDIS_CONN_STRING=redis://your-redis-host:6379
  - REDIS_PASSWORD=your_redis_password
  - REDIS_MASTER_NAME=mymaster # Имя главного узла в дозорном режиме
  - REDIS_CONN_POOL_SIZE=10 # Размер пула соединений Redis

Конфигурация безопасности сеанса

Убедитесь, что все узлы в кластере используют одни и те же ключи сеанса и шифрования:

environment:
  - SESSION_SECRET=your_unique_session_secret # Все узлы должны быть одинаковыми
  - CRYPTO_SECRET=your_unique_crypto_secret # Все узлы должны быть одинаковыми

Мониторинг и обслуживание

Проверка здоровья

Настройте периодические проверки работоспособности для мониторинга состояния узла:

healthcheck:
  test:
    [
      'CMD-SHELL',
      "wget -q -O - http://localhost:3000/api/status | grep -o '\"success\":\\s*true' | awk -F: '{print $$2}'",
    ]
  interval: 30s
  timeout: 10s
  retries: 3

Управление журналами

Для крупномасштабных кластеров рекомендуется использовать централизованную систему управления журналами:

environment:
  - LOG_SQL_DSN=root:password@tcp(log-db-host:3306)/new_api_logs # Независимая база данных журналов

Руководство по расширению

По мере роста вашего бизнеса вам может потребоваться увеличить размер кластера. Этапы расширения следующие:

  1. Подготовьте новый сервер: установите Docker и Docker Compose.
  2. Настройте ведомый узел: следуйте инструкциям в разделе «Шаг 3. Настройка ведомого узла», чтобы настроить новый ведомый узел.
  3. Обновить конфигурацию балансировщика нагрузки. Добавьте новые узлы в конфигурацию балансировщика нагрузки.
  4. Протестируйте новый узел. Убедитесь, что новый узел работает правильно и участвует в балансировке нагрузки.

Лучшие практики

  1. Регулярно создавайте резервные копии базы данных. Даже в кластерной среде необходимо регулярно создавать резервные копии базы данных.
  2. Отслеживание использования ресурсов. Следите за использованием ЦП, памяти и диска.
  3. Примите стратегию последовательного обновления: при обновлении сначала обновите подчиненный узел, а затем обновите главный узел, убедившись, что он стабилен.
  4. Настройка системы сигнализации: отслеживайте состояние узла и своевременно уведомляйте администраторов при возникновении проблем.
  5. Географически распределенное развертывание. Если возможно, развертывайте узлы в разных географических точках, чтобы повысить доступность.

Устранение неполадок

Узел не может синхронизировать данные

  • Проверьте, нормально ли соединение Redis
  • Убедитесь, что SESSION_SECRET и CRYPTO_SECRET одинаковы на всех узлах.
  • Убедитесь, что конфигурация подключения к базе данных правильна.

Дисбаланс нагрузки

  • Проверьте конфигурацию балансировщика нагрузки и настройки веса.
  • Отслеживайте использование ресурсов каждого узла, чтобы убедиться, что ни один узел не перегружен.
  • Возможно, потребуется изменить вес узлов или добавить больше узлов.

Проблема с потерей сеанса

  • Убедитесь, что все узлы используют один и тот же SESSION_SECRET.
  • Убедитесь, что Redis настроен правильно и доступен.
  • Проверьте, правильно ли клиент обрабатывает файлы cookie.

Сопутствующие документы

  • [Руководство по настройке переменных среды] (environment-variables.md) - содержит все соответствующие переменные среды для развертываний на нескольких узлах.
  • [Руководство по обновлению системы] (system-update.md) - Стратегия обновления системы в многоузловой среде. — [Инструкции по настройке Docker Compose] (docker-compose-yml.md) — используется для записи файлов конфигурации узла кластера.