Não tenho certeza se isso é muito útil, mas lutei um pouco com o mesmo problema - e foi o que concluímos;
O balanceamento de carga baseado em hash, como você já estabeleceu, nunca fornecerá um balanceamento de carga perfeito. O comportamento que você vê pode simplesmente ser explicado por ter algumas das páginas mais visitadas / maiores no mesmo servidor - por ter poucas páginas que recebem muito tráfego, e muitas páginas que recebem pouco tráfego, isso será suficiente para inclinar as estatísticas.
Sua configuração é usar hashing consistente. O ID e o peso do servidor determinam o servidor final para o qual a entrada em hash será direcionada - é por isso que seu balanceamento é afetado por isso. A documentação é bastante clara que, embora este seja um bom algoritmo para balanceamento de caches - pode exigir que você altere os IDs e aumente o peso total dos servidores para obter uma distribuição mais uniforme.
Se você pegar uma grande amostra de endereços únicos (mais de 1000), e visitar cada um desses momentos, deverá ver que o contador de sessão é muito mais igual entre os três backends do que se permitir tráfego contra o balanceador, pois isso também é afetado pelo padrão de tráfego do site.
O meu conselho seria certificar-se de que você hash o URL inteiro, não apenas o que está à esquerda de "?". Isso é controlado usando balance uri whole
na configuração. Ref. a documentação do haproxy . Se você tem um monte de URLs que têm a mesma base, mas com vários parâmetros GET - isso definitivamente lhe dará melhores resultados.
Eu também levaria em consideração como o balanceamento de carga afeta a capacidade de seus servidores de cache. Se isso não afetar efetivamente a redundância de alguma forma - eu não me preocuparia muito com isso, já que obter um balanceamento de carga perfeito não é algo que você provavelmente conseguirá com o hashing URI.
Espero que isso ajude.