Multi-servidor
O QuestsTracker suporta sincronização multi-servidor via Redis. Esta página explica como configurar e manter uma implantação multi-servidor.
Se você tem apenas um servidor, mantenha redis.enabled: false no seu config.yml. O plugin funciona perfeitamente sem Redis.
Arquitetura
Servidor 1 (Survival) Servidor 2 (Aventura) Servidor 3 (Evento)
| | |
└───────────┬───────────┘───────────────────────┘
|
Redis Server
|
MySQL / MariaDB
Todos os servidores compartilham:
- O mesmo banco de dados MySQL/MariaDB (via configuração do BetonQuest)
- O mesmo servidor Redis para sincronização em tempo real
Pré-requisitos
| Componente | Versão | Descrição |
|---|---|---|
| Redis | 6.0+ | Servidor de cache e mensageria Pub/Sub |
| MySQL/MariaDB | 8.0+ / 10.5+ | Banco de dados compartilhado (configurado no BetonQuest) |
| Rede | — | Conexão entre todos os servidores, Redis e o BDD |
Configuração do Redis
Instalação do Redis
# Ubuntu/Debian
sudo apt update && sudo apt install redis-server
# CentOS/RHEL
sudo yum install redis
# Docker
docker run -d --name redis -p 6379:6379 redis:latest
Proteger o Redis
Para uma implantação em produção:
# /etc/redis/redis.conf
requirepass sua_senha_redis
bind 0.0.0.0 # Ou o IP específico do servidor
Configuração do plugin
Em cada servidor, configure o config.yml:
redis:
enabled: true
host: "endereço-redis"
port: 6379
password: "sua_senha_redis"
Todos os servidores devem apontar para o mesmo servidor Redis e o mesmo banco de dados BetonQuest.
Funcionamento da sincronização
Canais Redis Pub/Sub
O plugin utiliza dois canais de comunicação:
| Canal | Descrição |
|---|---|
quest-updates | Mudanças de status (ativação, conclusão, progresso) |
quest-purge | Limpeza de dados de jogador para um pacote |
Ciclo de sincronização
- Um jogador conclui uma quest no Servidor 1
- O Servidor 1 atualiza o banco de dados
- O Servidor 1 publica uma mensagem no canal
quest-updates - O Servidor 2 e o Servidor 3 recebem a mensagem
- Eles invalidam seu cache local para esse jogador
- A próxima leitura utiliza os dados atualizados do BDD
Sistema de heartbeat
Quando um jogador muda de servidor:
- O jogador se desconecta do Servidor 1
- Os dados Redis permanecem válidos por 2 minutos (heartbeat)
- O jogador se conecta ao Servidor 2
- O Servidor 2 recupera os dados do Redis (cache L2 — rápido)
- Não é necessário recarregar do banco de dados
Se o jogador não se reconectar dentro de 2 minutos, os dados Redis expiram e são recarregados do BDD na próxima conexão.
Cache de dois níveis
O plugin utiliza um sistema de cache de dois níveis para desempenho ótimo:
| Nível | Tipo | Latência | TTL | Descrição |
|---|---|---|---|---|
| L1 | Caffeine (local) | Sub-milissegundo | 1-2 min | Cache em memória em cada servidor |
| L2 | Redis (distribuído) | ~1 ms | 2 min | Cache compartilhado entre servidores |
Ordem de leitura
L1 (local) → L2 (Redis) → Banco de dados
- L1 — Cache local em memória (o mais rápido)
- L2 — Cache Redis distribuído (se L1 falhar)
- BDD — Fonte de verdade (se L2 falhar)
Quando um dado é carregado do BDD, ele é automaticamente colocado em cache no L1 e L2.
Mecanismos de proteção
Circuit breaker
Se o Redis ficar indisponível:
- Após 3 falhas consecutivas, o circuit breaker é ativado
- As operações Redis falham silenciosamente (sem spam de erros)
- O plugin funciona em modo apenas BDD
- Cooldown de 30 segundos antes de tentar novamente
- Quando o Redis voltar a ficar disponível, a sincronização retoma automaticamente
Rate limiting
As publicações Redis são limitadas a 100ms de debounce por jogador para evitar sobrecarregar o servidor Redis com atualizações rápidas.
Pool de conexões
- Máximo: 128 conexões
- Mínimo idle: 16 conexões
- Teste on borrow/return para confiabilidade
Diagnósticos
Verificar a conexão Redis
/kgquests redis
Exibe:
- Status da conexão (conectado/desconectado)
- Número de chaves em cache (progresso, acompanhamento, status)
- Total de chaves
Verificar o cache de um jogador
/kgquests redis <jogador>
Exibe:
- Existência e TTL das chaves de progresso
- Existência e TTL das chaves de tracking
- Número de chaves de status
- Alerta se chaves estiverem ausentes
Estatísticas de desempenho
/kgquests stats
Exibe as taxas de acerto por cache (L1 e L2).
Saúde global
/kgquests health
Verifica todos os componentes: BDD, Redis, cache, scoreboard.
Problemas comuns
Redis inacessível
Sintoma: /kgquests redis exibe "Desconectado"
Soluções:
- Verifique se o Redis está iniciado:
redis-cli ping(deve responderPONG) - Verifique o firewall: a porta 6379 deve estar aberta entre os servidores
- Verifique a senha no
config.yml - Verifique os logs do servidor para erros de conexão
Dados dessincronizados entre servidores
Sintoma: As quests não se atualizam quando um jogador muda de servidor
Soluções:
- Verifique se todos os servidores apontam para o mesmo Redis:
/kgquests redis - Verifique se todos os servidores usam o mesmo BDD do BetonQuest
- Force uma atualização:
/kgquests refresh <jogador> - Verifique o circuit breaker nos logs
Latência elevada
Sintoma: O menu ou o scoreboard está lento
Soluções:
- Verifique a latência BDD:
/kgquests health - Coloque o Redis na mesma rede que seus servidores Minecraft (latência < 1ms ideal)
- Verifique as taxas de acerto do cache:
/kgquests stats
Recomendações para produção
Desempenho
- Coloque o Redis na mesma rede que seus servidores Minecraft (latência < 1ms)
- Use MariaDB em vez de MySQL para melhor desempenho
- Monitore as taxas de acerto com
/kgquests stats(objetivo: >95%)
Alta disponibilidade
- Configure Redis Sentinel ou Redis Cluster para redundância
- Use uma réplica MySQL/MariaDB para backups
- Monitore as conexões com
/kgquests health
Backup
- Faça backup regularmente do BDD MySQL/MariaDB
- O Redis não precisa de backup (os dados estão no BDD)
- Exporte seus arquivos
config.ymlequests_config.yml
Veja também
- Instalação — Configuração inicial do Redis
- Configuração — Referência das chaves Redis
- Solução de problemas — Problemas de conexão