O balanceamento HAProxy URI não é muito equilibrado

3

Estou tentando usar o HAProxy 1.4.22 com balanceamento de URI e tipo de hash consistentes para balancear a carga entre três back-ends de cache de verniz. Meu entendimento é que isso nunca alcançará um equilíbrio perfeito entre os servidores, mas deve ser melhor do que os resultados que estou vendo.

A parte relevante da minha configuração do HAproxy se parece com:

backend varnish
    # hash balancing
    balance uri
    hash-type consistent

    server varnish1 10.0.0.1:80 check observe layer7 maxconn 5000 id 1 weight 75 
    server varnish2 10.0.0.2:80 check observe layer7 maxconn 5000 id 2 weight 50
    server varnish3 10.0.0.3:80 check observe layer7 maxconn 5000 id 3 weight 50

Eu tenho auto-teste apontando meu próprio arquivo de hosts no novo servidor proxy, e até mesmo tentei redirecionar a página inicial para um back-end separado que é balanceado para obter aquele valor fora do hash balanceado , isso parece funcionar bem. Eu reforcei o verniz1 para um peso de 75 como teste, mas isso não pareceu ajudar. Minha carga está sendo desproporcionalmente equilibrada e não entendo por que isso acontece.

Um detalhe interessante é que, se eu inverter os IDs, a ID mais alta SEMPRE obterá a maior parte do tráfego. Por que o ID afetaria o equilíbrio?

Ajustar pesos é bom, mas como os padrões de tráfego do meu site mudam (nós somos um site de notícias e o post mais popular pode mudar rapidamente) Eu não quero ter que ajustar constantemente os pesos. Eu entendo que nunca estará em perfeito equilíbrio, mas eu estava esperando melhores resultados do que ter um servidor com um peso menor recebendo 25 vezes mais conexões do que outro servidor com um peso maior.

Meu objetivo foi reduzir a carga do DB e do servidor de aplicativos reduzindo a duplicação no nível de cache para o qual o balanceamento de Upr de HAproxy é recomendado, mas, se estiver desbalanceado, isso não funcionará para mim.

Algum conselho?

    
por Pax 11.04.2013 / 17:17

2 respostas

5

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.

    
por 11.04.2013 / 20:10
2

Acabei mudando a configuração assim:

backend varnish
        # hash balancing
        balance uri
        hash-type consistent

        server varnish1 64.106.164.122:80 check observe layer7 maxconn 5000 id 1 weight 75
        server varnish2 64.106.164.121:80 check observe layer7 maxconn 5000 id 715827882 weight 50
        server varnish3 64.106.164.117:80 check observe layer7 maxconn 5000 id 1431655764 weight 38

Acontece que os IDs parecem importar muito, eu tenho estes espaçados agora em toda a gama e isso parece ajudar o equilíbrio. Eu ajustei os pesos, assim como você pode ver.

Agora, obtendo um resultado assim:

O servidor do meio ainda está subutilizado, mas isso é o mais próximo do equilíbrio que eu consegui, e tudo bem para o meu propósito. Estou usando o HAproxy para fazer o hashing de URI para poder adicionar esse terceiro servidor de verniz sem aumentar a carga de backend, e parece estar funcionando bem, estou vendo uma diminuição notável na carga de backend com três servidores de verniz balanceados URI versus dois balanceados aleatoriamente queridos.

A diferença disso é que os IDs são muito importantes e devem ser espaçados, o que eu não vi claramente em nenhum outro lugar. Uma vez que os IDs estão espalhados, alterar os pesos ajuda, mas ainda é muito imprevisível e requer muitos ajustes e tentativa e erro. Aumentar drasticamente o peso de um servidor pode fazer com que o tráfego caia significativamente, o que é um resultado estranho.

    
por 15.04.2013 / 09:36