O HAProxy pode selecionar um back-end baseado em uma tabela de pesquisa?

3

Digamos que eu tenha os itens A, B e C. Eu tenho dois servidores de back-end: server01 e server02.

O item A pode ser manipulado pelo server01, o item B e C podem ser manipulados pelo server02. Novos itens e servidores são adicionados e removidos, e nós atualizamos programaticamente uma tabela de hash entre o id do item e o servidor backend em um arquivo, Redis, Memcache ou similar (qualquer que seja o suporte do proxy).

Posso criar um frontend como /items/${id} e ter a rota HAProxy para o servidor de back-end correto com base em ${id} ? Então, pesquisando qual ID está associada a qual servidor?

Se não, o Nginx seria capaz de fazer isso?

    
por kvz 09.01.2015 / 11:44

2 respostas

4

Sim, você pode fazer isso facilmente com o HAProxy. Basta criar uma ACL com uma lista de IDs servidos pelo servidor e aplicá-la a uma diretiva de servidor de uso. IE:

acl server1-ids path_beg -i /items/id1 /istems/id2
use-server server1 if server1-ids
    
por 12.01.2015 / 20:21
4

Você pode usar mapas para que funcione.

Isso está perfeitamente descrito em um post no blog HAProxy.com. Eles estão mapeando com base no cabeçalho Host , mas seria trivial alterar a configuração para funcionar na URL.

Um benefício extra aqui é que você pode adicionar e remover dinamicamente entradas de mapeamento usando as palavras-chave http-[request|response] [set-map|del-map] ou o soquete de administração.
As alterações feitas com http-[request|response] ou através do soquete não são mantidas entre as reinicializações, então você gostaria de ter algum processo fora de banda para atualizar o arquivo de mapa ao mesmo tempo, mas isso é outra questão.

Supondo que você tenha um back-end para cada servidor e receba um arquivo de mapa chamado /etc/haproxy/items.map com esses conteúdos:

#itemPath    backendname
/item/a      bk_server01
/item/b      bk_server02
/item/c      bk_server02

Você faria algo assim em seu front-end:

frontend ft_items
  [...]
  use_backend %[path,lower,map(/etc/haproxy/items.map,bk_default)]

Se você tiver os dois servidores no mesmo back-end, escreverá uma ACL no front-end que capture todos os itens ( acl items path_beg /items ), envie-os para o back-end ( use_backend servers if items ) e substitua o use_backend de linha do frontend com linhas use_server apropriadamente clasificadas no backend.

    
por 22.10.2015 / 14:52