Clustering ru - Pa-dej/Vex GitHub Wiki
Кластеризация (Русский)
Кластеризация позволяет нескольким нодам Vex делить репутацию, лимиты и реестр игроков через Redis.
Архитектура (ASCII)
+------------------+
| Clients |
+--------+---------+
|
+---------+----------+
| Load Balancer |
+----+---------+-----+
| |
+-------+--+ +--+-------+
| Vex A | | Vex B |
| node_id | | node_id |
+----+----+ +----+------+
| |
+------+-+----+
| |
+---+-v---+
| Redis |
+---+-----+
|
+--------+--------+
| Backends |
+-----------------+
Когда нужна кластеризация
- Несколько нод прокси за балансировщиком.
- Нужна общая антибот‑репутация и глобальные лимиты.
- Нужен глобальный список игроков по всем нодам.
Настройка Redis
Redis должен быть доступен всем нодам:
docker run -d --name vex-redis -p 6379:6379 redis:7
Конфигурация ноды
[cluster]
enabled = true
node_id = "edge-1"
heartbeat_interval_secs = 5
heartbeat_ttl_secs = 15
allow_degraded = true
[cluster.redis]
url = "redis://127.0.0.1:6379"
connect_timeout_ms = 1000
command_timeout_ms = 500
circuit_breaker_errors = 5
circuit_breaker_reset_ms = 5000
pubsub_channel = "vex.cluster"
Общая репутация
- Каждая нода пишет score IP в Redis.
- Чтение объединяет локальный кеш и Redis.
- Декей и блоки локальные, но score общий.
Глобальный rate limiting
- Токен‑бакеты хранятся как Redis atomic counters.
- Рефилл выполняется на каждой ноде, но счётчики общие.
- Один IP не может загрузить все ноды сразу.
Pub/sub события
- Attack mode синхронизируется между нодами.
- Дельты репутации пушатся для уменьшения устаревания.
- Возможен broadcast на все ноды.
Degraded режим
Если Redis недоступен:
- Ноды продолжают принимать соединения при
allow_degraded = true. - Локальный кеш репутации работает без синхронизации.
- Circuit breaker снижает частоту попыток до восстановления.
Docker Compose пример (2 ноды)
version: "3.9"
services:
redis:
image: redis:7
ports:
- "6379:6379"
vex-a:
image: vex:latest
ports:
- "25577:25577"
volumes:
- ./vex-a.toml:/app/vex.toml
depends_on:
- redis
vex-b:
image: vex:latest
ports:
- "25578:25577"
volumes:
- ./vex-b.toml:/app/vex.toml
depends_on:
- redis