Como configurar múltiplos GameServers (multi-canal) no MU Online
Suba vários GameServers (canais/sub-servidores) no seu MU Online: portas distintas, registro no ConnectServer e no JoinServer, banco de dados compartilhado e balanceamento de carga — com passo a passo, tabelas e checklist de lançamento.
Quando o seu servidor de MU Online começa a lotar, um único GameServer deixa de dar conta: lag em eventos, fila para entrar e travamentos em spots concorridos. A solução clássica é rodar vários GameServers — os "canais" ou sub-servidores que o jogador escolhe na lista de servidores. Bem configurado,
Quando o seu servidor de MU Online começa a lotar, um único GameServer deixa de dar conta: lag em eventos, fila para entrar e travamentos em spots concorridos. A solução clássica é rodar vários GameServers — os "canais" ou sub-servidores que o jogador escolhe na lista de servidores. Bem configurado, o multi-canal distribui a carga, cria espaços dedicados (um canal PVP, um canal de eventos) e escala junto com a sua base. Mal configurado, gera personagens duplicados, roteamento quebrado e canais que ninguém consegue acessar. Este tutorial cobre a arquitetura, as portas, o registro no ConnectServer e no JoinServer, o banco compartilhado e o balanceamento — com as variações mais comuns entre emuladores.
O que é um servidor multi-canal
Na arquitetura do MU, o cliente nunca fala direto com o GameServer no primeiro contato. O fluxo é: o cliente conecta no ConnectServer, recebe a lista de servidores (os canais), escolhe um, e só então é roteado para o GameServer daquele canal. Por trás, o JoinServer cuida do login/contas e o banco de dados guarda personagens e itens. Um servidor "multi-canal" é simplesmente vários processos de GameServer rodando ao mesmo tempo, cada um com sua porta e seu código, todos registrados no ConnectServer e compartilhando o mesmo banco. Para o jogador, cada GameServer é um "Canal 1", "Canal 2", "PVP" — e como o banco é o mesmo, o personagem é idêntico em qualquer um.
Por que ter vários GameServers
- Distribuir carga: dividir 1000 jogadores em 3 canais de ~330 alivia CPU, memória e a rede de cada instância.
- Reduzir lag em spots e eventos: menos gente por canal significa menos concorrência por mob e menos pacotes por segundo.
- Canais temáticos: um canal marcado como "PVP" ou "Eventos" separa públicos sem precisar de outro servidor.
- Manutenção sem derrubar tudo: você pode reiniciar um canal para aplicar um ajuste enquanto os outros seguem no ar.
- Escala horizontal: quando um VPS satura, você move um canal para outra máquina apontando para o mesmo banco.
Pré-requisitos
- Um servidor de MU já rodando com um GameServer, ConnectServer e JoinServer funcionais (veja o tutorial de criação de servidor).
- Acesso aos arquivos de configuração de GameServer, ConnectServer e JoinServer.
- O banco de dados (MSSQL na maioria dos emuladores) acessível por todas as instâncias.
- Portas livres no firewall/roteador para cada canal.
- Backup completo dos arquivos de config e do banco antes de qualquer alteração.
Arquivos e componentes envolvidos
Os nomes variam por emulador (IGCN, MuEMU, X-Team, Season 6). Os mais comuns:
| Componente | Função | Exemplo de arquivo (varia por emulador) |
|---|---|---|
| GameServer | Processa o mundo de cada canal | GameServerInfo.dat / GameServer.conf |
| ConnectServer | Entrega a lista de servidores ao cliente | ServerList.dat / ConnectServer.conf |
| JoinServer | Login de contas e roteamento | JoinServerInfo.dat / JoinServer.conf |
| Banco de dados | Personagens, itens, Zen (compartilhado) | conexão ODBC MuOnline / Me_MuOnline |
> Trate cada arquivo como crítico: um ServerCode ou porta duplicados derrubam o boot do canal afetado. Sempre edite cópias e teste um canal por vez.
Passo 1 — Planeje portas e ServerCodes
Antes de copiar nada, defina no papel a identidade de cada canal. Cada GameServer precisa de três coisas únicas: um ServerCode (número), uma porta de GameServer e um nome exibido na lista. Um plano típico para três canais:
| Canal | Nome exibido | ServerCode | Porta GameServer |
|---|---|---|---|
| 1 | Canal 1 | 0 | 55901 |
| 2 | Canal 2 | 1 | 55902 |
| 3 | PVP | 2 | 55903 |
O ConnectServer costuma escutar na porta 44405 e o JoinServer na 55970 (esses são exemplos — variam por emulador). O importante é que as portas de GameServer não colidam entre si e que cada uma esteja liberada no firewall.
Passo 2 — Duplique a pasta/config do GameServer
Cada canal é um processo próprio. Copie a pasta do GameServer (ou o conjunto de arquivos de config) uma vez por canal — por exemplo GameServer_C1, GameServer_C2, GameServer_C3. Mantendo pastas separadas você evita que dois canais briguem por logs, dumps e arquivos temporários, e consegue reiniciar um sem afetar os outros.
Passo 3 — Configure porta, código e nome de cada GameServer
Abra o arquivo de configuração de cada GameServer e ajuste os valores que precisam ser únicos. Em muitos emuladores o bloco é parecido com isto:
[GameServerInfo]
ServerName = "Canal 1"
ServerCode = 0
GameServerPort = 55901
; endereços dos serviços que este canal consome
JoinServerAddress = 127.0.0.1
JoinServerPort = 55970
ConnectServerAddress = 127.0.0.1
ConnectServerPort = 44405
; limite de jogadores deste canal (balanceamento)
MaxUserCount = 400
Repita para o Canal 2 (ServerCode = 1, GameServerPort = 55902, ServerName = "Canal 2") e para o Canal 3 (ServerCode = 2, GameServerPort = 55903, ServerName = "PVP"). O que muda por canal: ServerName, ServerCode, GameServerPort e opcionalmente MaxUserCount. O que permanece igual: os endereços do JoinServer, do ConnectServer e a conexão de banco.
Passo 4 — Registre os canais no ConnectServer
O ConnectServer é quem monta a lista que o jogador vê. Para cada GameServer, adicione uma entrada apontando ServerCode → IP:porta. O formato típico:
; ServerCode Nome IP Porta
0 "Canal 1" 127.0.0.1 55901
1 "Canal 2" 127.0.0.1 55902
2 "PVP" 200.100.50.10 55903
Note que o IP pode ser diferente por canal: se o Canal 3 roda em outro VPS, use o IP público daquela máquina. Se todos estão na mesma máquina, use o IP local/loopback. O ServerCode aqui tem que bater com o ServerCode configurado no GameServer correspondente — é essa correspondência que faz o roteamento funcionar.
Passo 5 — Aponte o JoinServer e compartilhe o banco
O JoinServer valida a conta e encaminha o jogador. Em geral você tem um único JoinServer para todos os canais — confirme que ele conhece todos os ServerCodes e que sua conexão de banco aponta para o mesmo banco que os GameServers usam. Esse é o ponto mais importante do multi-canal: todos os GameServers e o JoinServer usam a mesma base (ex.: MuOnline + Me_MuOnline via ODBC). Assim, o personagem criado no Canal 1 já existe no Canal 2, com o mesmo inventário e Zen. Bancos separados = mundos separados (não é o objetivo aqui).
Passo 6 — Libere as portas no firewall
Cada porta de GameServer precisa estar acessível de fora. No Windows, libere as portas TCP no firewall; no VPS/roteador, faça o encaminhamento (port forward) de cada uma:
; TCP a liberar (exemplo)
44405 ; ConnectServer
55970 ; JoinServer
55901 ; GameServer Canal 1
55902 ; GameServer Canal 2
55903 ; GameServer PVP
Esquecer de liberar a porta de um canal é a causa nº 1 de "o canal aparece na lista mas dá erro ao entrar". O canal sobe localmente, mas o cliente não alcança a porta.
Passo 7 — Suba os serviços na ordem correta
A ordem de inicialização importa. Suba: 1) banco de dados, 2) JoinServer, 3) ConnectServer, 4) cada GameServer (Canal 1, depois 2, depois 3). Subir um GameServer antes do JoinServer/banco costuma gerar erro de conexão e o canal não registra. Ao subir cada GameServer, acompanhe o console: ele deve reportar "conectado ao JoinServer" e "registrado no ConnectServer".
Passo 8 — Teste o roteamento em jogo
- Abra o cliente e confirme que todos os canais aparecem na lista de servidores.
- Entre no Canal 1 com uma conta de teste, crie/mova um personagem, drope um item.
- Saia e entre no Canal 2 com a mesma conta — o personagem e o item devem estar lá (prova do banco compartilhado).
- Verifique o medidor de lotação de cada canal na lista.
- Force um canal (ex.: reinicie o Canal 3) e confirme que os outros continuam no ar.
Cuidados de balanceamento
Ter canais não basta — é preciso distribuir gente de forma saudável:
- Defina
MaxUserCountpor canal de acordo com a capacidade da máquina, não com o ego. É melhor 3 canais de 350 estáveis do que 3 de 800 travando. - Monitore CPU/RAM por processo. Cada GameServer é um processo; se um satura antes dos outros, reduza seu limite ou mova-o de máquina.
- Não deixe um canal virar "o único". Se todos entram no Canal 1, considere spawns de evento rotativos entre canais para espalhar a população.
- Cuidado com eventos globais. Boss/evento que roda em todos os canais multiplica a carga simultaneamente — escalone horários se necessário.
- Banco é o gargalo compartilhado. Muitos canais batendo no mesmo MSSQL exigem um banco bem dimensionado; monitore o tempo de resposta das queries.
Erros comuns e soluções
| Sintoma | Causa provável | Solução |
|---|---|---|
| Canal não aparece na lista | Entrada ausente/errada no ConnectServer | Confira ServerCode, IP e porta no ConnectServer |
| Canal aparece mas dá erro ao entrar | Porta do GameServer bloqueada no firewall | Libere/encaminhe a porta TCP do canal |
| GameServer não sobe | Porta ou ServerCode duplicados | Garanta porta e código únicos por canal |
| Personagem some entre canais | Bancos de dados diferentes | Aponte todos os GameServers ao mesmo banco |
| Erro de conexão no boot do canal | JoinServer/banco fora do ar ou ordem errada | Suba banco → JoinServer → ConnectServer → GameServers |
| Todos entram só em um canal | Sem incentivo/limite por canal | Ajuste MaxUserCount e distribua eventos |
Checklist de lançamento
- Plano de portas e ServerCodes definido (todos únicos).
- Config de cada GameServer com nome, código e porta próprios.
- Todos os canais registrados no ConnectServer (ServerCode ↔ IP:porta batendo).
- JoinServer conhecendo todos os canais e no mesmo banco.
- Banco de dados compartilhado confirmado (personagem persiste entre canais).
- Portas liberadas no firewall/roteador (ConnectServer, JoinServer e cada GameServer).
- Serviços iniciados na ordem correta e consoles sem erro.
MaxUserCountdefinido por canal conforme a capacidade da máquina.- Teste in-game de roteamento e persistência entre canais concluído.
- Backup dos arquivos de config e do banco salvo antes do público.
Com o multi-canal no ar, você tem uma base que escala junto com a comunidade: para adicionar o "Canal 4", basta repetir os passos com um novo ServerCode, uma nova porta e uma nova entrada no ConnectServer. Documente o par ServerCode:porta de cada canal em uma planilha — isso evita colisões e torna trivial mover um canal para outra máquina quando a população crescer.
Perguntas frequentes
Cada GameServer precisa de um banco de dados separado?
Não. O padrão é o oposto: todos os GameServers apontam para o MESMO banco (MuOnline/Me_MuOnline), para que o personagem, o inventário e o Zen sejam idênticos em qualquer canal. Banco separado só faz sentido se você quer mundos independentes, o que é outro projeto.
Quantos GameServers eu consigo rodar em uma máquina?
Depende de CPU, RAM e do limite de conexões que você define por canal. Um servidor médio roda de 2 a 4 canais confortavelmente em um VPS decente. Cada GameServer é um processo próprio consumindo memória e CPU — monitore antes de multiplicar canais.
Os jogadores veem os canais como servidores diferentes?
Na lista do ConnectServer, sim: cada GameServer aparece como uma entrada (Canal 1, Canal 2, PVP, etc.) com seu próprio medidor de lotação. Como o banco é compartilhado, o mesmo personagem entra em qualquer um deles.
Preciso de portas diferentes para cada GameServer?
Sim, obrigatoriamente. Cada GameServer escuta em uma porta TCP própria (ex.: 55901, 55902, 55903) e tem um ServerCode único. Duas instâncias na mesma porta causam conflito e uma delas não sobe.
Posso ter GameServers em máquinas (VPS) diferentes?
Sim. Basta que todos alcancem o mesmo banco de dados e que o ConnectServer aponte para o IP público correto de cada um. É assim que servidores grandes distribuem carga — cada canal em uma máquina, com um banco central.
O que é o ServerCode e por que ele tem que ser único?
É o identificador numérico do GameServer usado pelo ConnectServer e pelo JoinServer para rotear o jogador ao canal certo. Dois GameServers com o mesmo ServerCode se confundem no roteamento — cada canal precisa do seu número exclusivo.