Руководство по развертыванию кластера
В этом документе представлены подробные инструкции по настройке и рекомендации по развертыванию кластера 88API, которые помогут вам создать распределенную систему с высоким уровнем доступности и балансировкой нагрузки.
Предварительные условия
- Несколько серверов (минимум два, один главный и несколько подчиненных)
- Установлены Docker и Docker Compose.
- Общая база данных MySQL (главному и подчиненному узлам необходим доступ к одной и той же базе данных)
- Общий сервис Redis (для синхронизации данных и кэширования между узлами)
- Необязательно: балансировщик нагрузки (например, Nginx, HAProxy или службы балансировки нагрузки, предоставляемые поставщиками облачных услуг).
Обзор архитектуры кластера
Кластер 88API использует архитектуру «главный-подчиненный»:
- Главный узел: отвечает за обработку всех операций записи и некоторых операций чтения.
- Подчиненный узел: в основном отвечает за обработку операций чтения и повышение общей пропускной способности системы.
Важные советы
Ключевые конфигурации для развертывания кластера
Ключом к развертыванию кластера является то, что все узлы должны:
- Совместное использование одной и той же базы данных: все узлы имеют доступ к одной и той же базе данных MySQL.
- Совместное использование одного и того же Redis: используется для кэширования и связи между узлами.
- Используйте один и тот же ключ:
SESSION_SECRETиCRYPTO_SECRETдолжны быть одинаковыми на всех узлах. - Правильно настройте тип узла: главный узел —
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 # Независимая база данных журналовРуководство по расширению
По мере роста вашего бизнеса вам может потребоваться увеличить размер кластера. Этапы расширения следующие:
- Подготовьте новый сервер: установите Docker и Docker Compose.
- Настройте ведомый узел: следуйте инструкциям в разделе «Шаг 3. Настройка ведомого узла», чтобы настроить новый ведомый узел.
- Обновить конфигурацию балансировщика нагрузки. Добавьте новые узлы в конфигурацию балансировщика нагрузки.
- Протестируйте новый узел. Убедитесь, что новый узел работает правильно и участвует в балансировке нагрузки.
Лучшие практики
- Регулярно создавайте резервные копии базы данных. Даже в кластерной среде необходимо регулярно создавать резервные копии базы данных.
- Отслеживание использования ресурсов. Следите за использованием ЦП, памяти и диска.
- Примите стратегию последовательного обновления: при обновлении сначала обновите подчиненный узел, а затем обновите главный узел, убедившись, что он стабилен.
- Настройка системы сигнализации: отслеживайте состояние узла и своевременно уведомляйте администраторов при возникновении проблем.
- Географически распределенное развертывание. Если возможно, развертывайте узлы в разных географических точках, чтобы повысить доступность.
Устранение неполадок
Узел не может синхронизировать данные
- Проверьте, нормально ли соединение Redis
- Убедитесь, что SESSION_SECRET и CRYPTO_SECRET одинаковы на всех узлах.
- Убедитесь, что конфигурация подключения к базе данных правильна.
Дисбаланс нагрузки
- Проверьте конфигурацию балансировщика нагрузки и настройки веса.
- Отслеживайте использование ресурсов каждого узла, чтобы убедиться, что ни один узел не перегружен.
- Возможно, потребуется изменить вес узлов или добавить больше узлов.
Проблема с потерей сеанса
- Убедитесь, что все узлы используют один и тот же SESSION_SECRET.
- Убедитесь, что Redis настроен правильно и доступен.
- Проверьте, правильно ли клиент обрабатывает файлы cookie.
Сопутствующие документы
- [Руководство по настройке переменных среды] (environment-variables.md) - содержит все соответствующие переменные среды для развертываний на нескольких узлах.
- [Руководство по обновлению системы] (system-update.md) - Стратегия обновления системы в многоузловой среде. — [Инструкции по настройке Docker Compose] (docker-compose-yml.md) — используется для записи файлов конфигурации узла кластера.