Pular para o conteúdo principal

Multi-servidor

O QuestsTracker suporta sincronização multi-servidor via Redis. Esta página explica como configurar e manter uma implantação multi-servidor.

Servidor único?

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​

ComponenteVersãoDescrição
Redis6.0+Servidor de cache e mensageria Pub/Sub
MySQL/MariaDB8.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"
Configuração idêntica

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:

CanalDescrição
quest-updatesMudanças de status (ativação, conclusão, progresso)
quest-purgeLimpeza de dados de jogador para um pacote

Ciclo de sincronização​

  1. Um jogador conclui uma quest no Servidor 1
  2. O Servidor 1 atualiza o banco de dados
  3. O Servidor 1 publica uma mensagem no canal quest-updates
  4. O Servidor 2 e o Servidor 3 recebem a mensagem
  5. Eles invalidam seu cache local para esse jogador
  6. A próxima leitura utiliza os dados atualizados do BDD

Sistema de heartbeat​

Quando um jogador muda de servidor:

  1. O jogador se desconecta do Servidor 1
  2. Os dados Redis permanecem válidos por 2 minutos (heartbeat)
  3. O jogador se conecta ao Servidor 2
  4. O Servidor 2 recupera os dados do Redis (cache L2 — rápido)
  5. 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ívelTipoLatênciaTTLDescrição
L1Caffeine (local)Sub-milissegundo1-2 minCache em memória em cada servidor
L2Redis (distribuído)~1 ms2 minCache compartilhado entre servidores

Ordem de leitura​

L1 (local) → L2 (Redis) → Banco de dados
  1. L1 — Cache local em memória (o mais rápido)
  2. L2 — Cache Redis distribuído (se L1 falhar)
  3. 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:

  1. Verifique se o Redis está iniciado: redis-cli ping (deve responder PONG)
  2. Verifique o firewall: a porta 6379 deve estar aberta entre os servidores
  3. Verifique a senha no config.yml
  4. 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:

  1. Verifique se todos os servidores apontam para o mesmo Redis: /kgquests redis
  2. Verifique se todos os servidores usam o mesmo BDD do BetonQuest
  3. Force uma atualização: /kgquests refresh <jogador>
  4. Verifique o circuit breaker nos logs

Latência elevada​

Sintoma: O menu ou o scoreboard está lento

Soluções:

  1. Verifique a latência BDD: /kgquests health
  2. Coloque o Redis na mesma rede que seus servidores Minecraft (latência < 1ms ideal)
  3. 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.yml e quests_config.yml

Veja também​