Como Balancear Carga entre Múltiplos Servidores de MU Online
Aprenda a distribuir jogadores entre múltiplos GameServers usando ConnectServer, configurando regras de roteamento, limites de capacidade e failover automático.
Visão Geral da Arquitetura Multi-Servidor
Balancear carga em servidores de MU Online privados significa distribuir jogadores entre múltiplos GameServers através de um único ponto de entrada: o ConnectServer. Quando bem configurado, isso aumenta a capacidade total de jogadores simultâneos, reduz lag e garante que nenhum servidor individual fique sobrecarregado.
A arquitetura padrão funciona assim:
Cliente MU Online
|
v
ConnectServer (porta 44405)
|
+---> GameServer 0 (porta 55901) — Servidor 1 (ex: Lorencia)
+---> GameServer 1 (porta 55902) — Servidor 2 (ex: Devias)
+---> GameServer 2 (porta 55903) — Servidor 3 (ex: Noria)
|
v
DataServer (porta 55557) — Banco de dados compartilhado
Pré-Requisitos
Antes de começar, certifique-se de ter:
- SQL Server 2008/2012/2014 instalado e com o banco
MuOnlinefuncional - Pelo menos um GameServer funcional como base
- Acesso à pasta raiz do servidor (ex:
C:\MuServer\) - Portas disponíveis no firewall: 44405 (ConnectServer), 55901-5590X (GameServers), 55557 (DataServer)
Passo 1: Configurar o ConnectServer para Múltiplos GameServers
O arquivo principal de configuração fica em ConnectServer\ConnectServer.cfg. Abra-o e localize a seção de servidores:
[ServerInfo]
ServerCount = 3
[ServerInfo0]
ServerCode = 0
ServerName = Lorencia
ServerIp = 127.0.0.1
ServerPort = 55901
ServerType = 0
MaxConnect = 1000
CurrentConnect= 0
ShowYn = 1
[ServerInfo1]
ServerCode = 1
ServerName = Devias
ServerIp = 127.0.0.1
ServerPort = 55902
ServerType = 0
MaxConnect = 1000
CurrentConnect= 0
ShowYn = 1
[ServerInfo2]
ServerCode = 2
ServerName = Noria
ServerIp = 127.0.0.1
ServerPort = 55903
ServerType = 0
MaxConnect = 500
CurrentConnect= 0
ShowYn = 1
ServerType = 1 para marcar um servidor como "PVP exclusivo" na lista de canais. Isso aparece visualmente diferente para o jogador na tela de seleção de servidor.Parâmetros críticos:
| Campo | Descrição |
|---|---|
ServerCode | ID único do servidor (0, 1, 2...) — deve coincidir com o GameServer |
MaxConnect | Limite máximo de jogadores neste GameServer |
ShowYn | 1 = visível na lista, 0 = oculto (útil para manutenção) |
Passo 2: Configurar Cada GameServer
Para cada GameServer, acesse GameServer\GameServer.cfg (ou main.cfg dependendo da versão) e ajuste:
[GameServerInfo]
ServerCode = 1
ServerName = Devias
ServerPort = 55902
MaxUserCount = 1000
DataServerIp = 127.0.0.1
DataServerPort = 55557
ConnectServerIp = 127.0.0.1
ConnectServerPort = 44405
ServerCode em cada GameServer deve ser único e idêntico ao ServerCode definido no ConnectServer.cfg. Servidores com códigos duplicados causarão conflitos de autenticação e desconexões aleatórias.Para o segundo GameServer, copie toda a pasta GameServer\ e renomeie para GameServer1\, GameServer2\, etc. Altere apenas o ServerCode, ServerName e ServerPort em cada cópia.
Estrutura de diretórios resultante:
C:\MuServer\
ConnectServer\
DataServer\
GameServer\ (ServerCode=0, porta 55901)
GameServer1\ (ServerCode=1, porta 55902)
GameServer2\ (ServerCode=2, porta 55903)
EventServer\
Passo 3: Configurar o DataServer para Aceitar Múltiplas Conexões
O DataServer centraliza o acesso ao banco. Abra DataServer\DataServer.cfg:
[DataServerInfo]
ServerPort = 55557
MaxConnectCount= 15
DBServerIp = 127.0.0.1
DBServerPort = 1433
DBName = MuOnline
DBUserID = sa
DBPassword = sua_senha_aqui
Aumente MaxConnectCount para acomodar todos os GameServers (3 GameServers + margem = 15 conexões é suficiente).
Passo 4: Ajustar o Banco de Dados para Multi-Servidor
Com múltiplos GameServers, é necessário garantir que os dados de personagem sejam consistentes. Execute no SQL Server Management Studio:
-- Verificar personagens duplicados entre servidores (não deve existir)
SELECT Name, COUNT(*) as Total
FROM MuOnline.dbo.Character
GROUP BY Name
HAVING COUNT(*) > 1;
-- Adicionar índice para melhorar performance com múltiplos servidores
IF NOT EXISTS (
SELECT * FROM sys.indexes
WHERE name = 'IX_Character_AccountID'
AND object_id = OBJECT_ID('dbo.Character')
)
BEGIN
CREATE INDEX IX_Character_AccountID
ON MuOnline.dbo.Character (AccountID);
END
-- Verificar e limpar sessões travadas de outros servidores
UPDATE MuOnline.dbo.MEMB_STAT
SET ConnectStat = 0,
ServerName = '',
IP = ''
WHERE ConnectStat = 1
AND DATEDIFF(MINUTE, LastConnect, GETDATE()) > 30;
MEMB_STAT) sempre que reiniciar qualquer GameServer. Sessões presas impedem que o jogador faça login novamente.Passo 5: Implementar Limites de Capacidade por Canal
Para distribuir jogadores de forma equilibrada, defina limites diferentes por servidor conforme o hardware disponível:
-- Verificar uso atual por servidor (monitoramento)
SELECT
ServerName,
COUNT(*) AS JogadoresOnline
FROM MuOnline.dbo.MEMB_STAT
WHERE ConnectStat = 1
GROUP BY ServerName
ORDER BY JogadoresOnline DESC;
No ConnectServer.cfg, ajuste os MaxConnect proporcionalmente à capacidade de cada máquina. Um servidor com 4GB RAM suporta ~500 jogadores; 8GB RAM suporta ~1000-1200.
Passo 6: Criar Scripts de Inicialização na Ordem Correta
A ordem de inicialização é crítica. Crie um arquivo StartAll.bat em C:\MuServer\:
@echo off
echo Iniciando infraestrutura MU Online...
echo [1/5] Iniciando DataServer...
start "DataServer" /D "C:\MuServer\DataServer\" DataServer.exe
timeout /t 5 /nobreak > nul
echo [2/5] Iniciando ConnectServer...
start "ConnectServer" /D "C:\MuServer\ConnectServer\" ConnectServer.exe
timeout /t 3 /nobreak > nul
echo [3/5] Iniciando GameServer 0...
start "GameServer0" /D "C:\MuServer\GameServer\" GameServer.exe
timeout /t 8 /nobreak > nul
echo [4/5] Iniciando GameServer 1...
start "GameServer1" /D "C:\MuServer\GameServer1\" GameServer.exe
timeout /t 8 /nobreak > nul
echo [5/5] Iniciando GameServer 2...
start "GameServer2" /D "C:\MuServer\GameServer2\" GameServer.exe
timeout /t 5 /nobreak > nul
echo Todos os servidores iniciados!
pause
Passo 7: Configurar Eventos para Multi-Servidor
Eventos como Blood Castle e Devil Square precisam ser configurados em cada GameServer separadamente. Acesse GameServer\Data\Events\ (ou GameServer1\Data\Events\) e ajuste os horários para que não conflitem entre servidores, ou defina o mesmo horário caso queira que o evento rode em paralelo:
; GameServer\Data\Events\BloodCastle.cfg
[BloodCastleInfo]
Enable = 1
StartTime0 = 0:00
StartTime1 = 2:00
StartTime2 = 4:00
StartTime3 = 6:00
StartTime4 = 8:00
StartTime5 = 10:00
StartTime6 = 12:00
StartTime7 = 14:00
StartTime8 = 16:00
StartTime9 = 18:00
StartTime10= 20:00
StartTime11= 22:00
Troubleshooting
Problema: Jogadores ficam presos na tela de seleção de servidor → Verifique se o ServerCode no GameServer.cfg bate exatamente com o ConnectServer.cfg → Confirme que a porta do GameServer está acessível (telnet 127.0.0.1 55902) → Cheque o log em GameServer1\Log\GameServer.log por erros de conexão com DataServer
Problema: Personagem aparece em dois servidores ao mesmo tempo → Execute o UPDATE na tabela MEMB_STAT para limpar sessões duplicadas → Verifique se dois GameServers têm o mesmo ServerCode
Problema: ConnectServer não lista todos os servidores → Confirme que ServerCount no ConnectServer.cfg corresponde ao número real de blocos [ServerInfoX] → Reinicie o ConnectServer após qualquer alteração no .cfg
Problema: Lag alto em um servidor específico → Reduza o MaxConnect desse GameServer temporariamente (via ShowYn=0 e reinicialização) → Verifique uso de CPU/RAM da máquina que hospeda aquele GameServer → Analise consultas lentas no SQL Server com: SELECT TOP 10 * FROM sys.dm_exec_query_stats ORDER BY total_elapsed_time DESC
Perguntas frequentes
Quantos GameServers posso adicionar ao ConnectServer?
Tecnicamente não há limite fixo no ConnectServer padrão, mas servidores Season 6 são testados de forma estável com até 10-15 GameServers. Cada GameServer adicional requer uma entrada separada no ConnectServer.cfg e uma porta TCP/UDP exclusiva (ex: 55901, 55902, 55903...).
O que acontece se um GameServer cair com jogadores conectados?
Os jogadores conectados serão desconectados imediatamente. Para mitigar isso, configure o campo ServerListShowYn=0 no GameServer problemático antes de reiniciá-lo, redirecione novos logins via ConnectServer e implemente monitoramento com reinicialização automática via script batch ou serviço do Windows.
Como faço para que certos canais aceitem apenas VIPs?
No GameServer/Data/ServerInfo.cfg defina o campo MaxConnect para o limite desejado e use regras de acesso por VIP no código do GameServer ou via tabela T_Account no SQL Server, verificando o campo AccountLevel ou memb_grade antes de permitir entrada no canal específico.
É possível ter GameServers em máquinas físicas diferentes?
Sim. O ConnectServer se comunica com GameServers via IP:Porta configurados no ConnectServer.cfg. Cada GameServer pode estar em uma máquina diferente desde que os IPs sejam acessíveis entre si na rede local ou via VPN, e as portas estejam liberadas no firewall (padrão: 55901+, UDP 55557).