Isenção de responsabilidade: minha experiência em programação de jogos é baseada em jogos single-player do lado do cliente, mas eu tenho experiência em aplicativos da Web (especificamente na pilha da Microsoft), de modo que é de onde eu venho com esta resposta, acho que muito aplicar, mas sem testar de fato um servidor de jogo real, é difícil dizer como ele será aplicado, mas aqui vai. Saiba disso: não implantei um servidor de jogos, apenas aplicativos da web.
Eu sugeriria uma abordagem de duas camadas (servidor). Uma camada de banco de dados e uma "aplicação"; com a terceira camada (apresentação) sendo seu cliente do jogo.
Os bancos de dados relacionais são ótimos na consulta de dados e decentes na gravação de dados. A chave é serializar as gravações do banco de dados em pedaços de tamanho gerenciáveis que o cluster pode manipular. As edições mais avançadas (data center / empresa) do SQL Server oferecem suporte a cluster e replicação. Eu começaria construindo um pequeno cluster e executando algumas consultas nele para ver como ele funciona.
Na camada do aplicativo, se você estiver executando o "zoneamento" ou algo semelhante, provavelmente poderá fugir sem configurar nenhum cluster e simplesmente configurar um servidor por zona. Se suas zonas ficarem muito grandes, você poderá configurar um cluster para cada zona.
Você deseja criar um processo de serialização para enviar dados da camada de aplicativo -> camada de banco de dados. A chave é ter vários níveis de serialização em andamento. Algo assim :
- Nível 1: salve no banco de dados a cada X segundos, inclui dados críticos:
- Saúde do jogador
- Itens / Captadores de Jogador
- Nível 2: salve no banco de dados a cada 2X segundos, inclui dados médios:
- Localizações dos jogadores
- Localizações NPC
- Nível 3: Tudo o mais, com a menor frequência possível
Isso manterá suas gravações consistentes e previsíveis. Dependendo da natureza do seu jogo, você poderá ter gravações pouco frequentes no banco de dados. A chave é perceber que, se o seu servidor de aplicativos travasse, você teria que voltar a ficar on-line a partir do estado em seu banco de dados; portanto, serializar o inventário de jogadores a cada 90 minutos pode deixá-los chateados.
Para ler dados, você deseja carregar o máximo possível de memória na camada de aplicativos e garantir que todo o seu código use esse conjunto de memórias; em segundo plano, você pode sincronizar o conjunto de memórias com o banco de dados. Como Joe aponta, haverá momentos em que você precisará de transações "em tempo real". Ao serializar a maioria de suas gravações, você ainda deve ter E / S suficiente em seu banco de dados para realizar transações em tempo real quando necessário, presumindo hardware suficiente no servidor / cluster de banco de dados.