Eu projetei sistemas que direcionam o volume de consultas em um cenário semelhante. Pode ser interessante incluir várias outras coisas:
- tempo médio de resposta para o tráfego real para o candidato (não apenas uma consulta de monitoramento)
- número de consultas no último período de tempo (60s, etc)
- utilização da memória / cpu / disco durante um período de tempo anterior
Eu já dei um peso a cada um dos recursos e basicamente os somei. Então, em um único servidor, você pode voltar:
memory 50(%)
cpu 40(%)
disk 4000 (iops, if you know the limit here making it a % is good)
ms 300 (msecs average response time)
o peso deste servidor seria 4390 (maior seria pior aqui). Você pode ver aqui onde, talvez, se a CPU é menos preocupante, você pode alterar seu 'peso' no cálculo para tomar a decisão de qual cliente usar com mais precisão para o seu ambiente.
O modo como você coleta isso pode fazer a diferença com a frequência com que pode ser coletado e com a confiabilidade dele (talvez um nó tenha morrido desde que você fez a lista de servidores menos usados). Uma abordagem é executar um daemon de relatórios em cada candidato e consultá-lo quando você receber uma solicitação do cliente, talvez por meio de multicast. O daemon de relatórios pode coletar estatísticas com muita frequência para tornar as informações de decisão mais precisas possíveis.
Não está claro o quão transitória é a configuração que você está gerando, o que é uma consideração importante ao fazer a distribuição. Você terá clientes conectados por longos períodos de tempo? É possível que você precise desconectar e redistribuir clientes porque um servidor ficou sobrecarregado? Talvez algo que você já tenha considerado.
Dependendo de quão transitória você é e quanto você sabe sobre as consultas, você também pode adicionar mais dados às métricas de decisão:
- o peso esperado do cliente atualmente sendo atendido pelo candidato (se você também der pesos aos clientes)
- conjunto de dados já na memória (se o tamanho dos dados exceder a capacidade de memória do servidor e você tiver mais do que alguns servidores, poderá melhorar a utilização da RAM equilibrando consultas para conjuntos de dados específicos para servidores que já os possuem na memória)
- tempo de atividade do servidor (uma caixa nova totalmente descarregada geralmente será esmagada em cenários baseados em peso, em que as decisões são tomadas com frequência)
Espero que isso ajude! É um problema interessante.