Pisco de peito vermelho redondo ponderado via TTL - possível?


9

Atualmente, uso o round robin do DNS para balanceamento de carga, o que funciona muito bem. Os registros ficam assim (eu tenho um TTL de 120 segundos)

;; ANSWER SECTION:
orion.2x.to.        116 IN  A   80.237.201.41
orion.2x.to.        116 IN  A   87.230.54.12
orion.2x.to.        116 IN  A   87.230.100.10
orion.2x.to.        116 IN  A   87.230.51.65

Aprendi que nem todo ISP / dispositivo trata essa resposta da mesma maneira. Por exemplo, alguns servidores DNS alternam os endereços aleatoriamente ou sempre os alternam. Alguns apenas propagam a primeira entrada, outros tentam determinar qual é o melhor (regionalmente próximo) observando o endereço IP.

No entanto, se a base de usuários for grande o suficiente (se espalha por vários ISPs etc.), ela se equilibra muito bem. As discrepâncias do servidor carregado do mais alto para o mais baixo quase nunca ultrapassam 15%.

No entanto, agora eu tenho o problema de introduzir mais servidores nos sistemas e que nem todos têm as mesmas capacidades.

Atualmente, tenho apenas servidores de 1 Gbps, mas também quero trabalhar com servidores de 100 Mbps e 10 Gbps.

Então, o que eu quero é introduzir um servidor com 10 Gbps com um peso de 100, um servidor de 1 Gbps com um peso de 10 e um servidor de 100 Mbps com um peso de 1.

Eu adicionei servidores duas vezes anteriormente para trazer mais tráfego para eles (o que funcionou bem - a largura de banda quase dobrou). Mas adicionar um servidor de 10 Gbps 100 vezes ao DNS é um pouco ridículo.

Então, pensei em usar o TTL.

Se eu der o servidor A 240 segundos TTL e o servidor B apenas 120 segundos (o que é quase o mínimo para usar o round robin, como muitos servidores DNS configurados para 120 se um TTL inferior for especificado (pelo que ouvi dizer)). Eu acho que algo assim deve ocorrer em um cenário ideal:

First 120 seconds
50% of requests get server A -> keep it for 240 seconds.
50% of requests get server B -> keep it for 120 seconds

Second 120 seconds
50% of requests still  have server A cached -> keep it for another 120 seconds.
25% of requests get server A -> keep it for 240 seconds
25% of requests get server B -> keep it for 120 seconds

Third 120 seconds
25% will get server A (from the 50% of Server A that now expired) -> cache 240 sec
25% will get server B  (from the 50% of Server A  that now expired) -> cache 120 sec
25% will have server A cached for another 120 seconds
12.5% will get server B (from the 25% of server B that now expired) -> cache 120sec
12.5% will get server A (from the 25% of server B that now expired) -> cache 240 sec

Fourth 120 seconds
25% will have server A cached -> cache for another 120 secs
12.5% will get server A (from the 25% of b that now expired) -> cache 240 secs
12.5% will get server B (from the 25% of b that now expired) -> cache 120 secs
12.5% will get server A (from the 25% of a that now expired) -> cache 240 secs
12.5% will get server B (from the 25% of a that now expired) -> cache 120 secs
6.25% will get server A (from the 12.5% of b that now expired) -> cache 240 secs
6.25% will get server B (from the 12.5% of b that now expired) -> cache 120 secs
12.5% will have server A cached -> cache another 120 secs
... I think I lost something at this point, but I think you get the idea...

Como você pode ver, isso fica bastante complicado de prever e com certeza não funcionará dessa maneira na prática. Mas definitivamente deve ter um efeito na distribuição!

Eu sei que o round robin ponderado existe e é apenas controlado pelo servidor raiz. Ele apenas percorre os registros DNS ao responder e retorna registros DNS com uma probabilidade definida que corresponde à ponderação. Meu servidor DNS não suporta isso e meus requisitos não são tão precisos. Se não pesar perfeitamente, tudo bem, mas deve seguir na direção certa.

Eu acho que usar o campo TTL poderia ser uma solução mais elegante e fácil - e não exige um servidor DNS que controle isso dinamicamente, economizando recursos - o que, na minha opinião, é o ponto principal do balanceamento de carga DNS versus balanceadores de carga de hardware.

Minha pergunta agora é: Existem práticas recomendadas / métodos / regras práticas para ponderar a distribuição de rodízios usando o atributo TTL dos registros DNS?

Editar:

O sistema é um sistema de servidor proxy de encaminhamento. A quantidade de largura de banda (não solicitações) excede o que um único servidor com Ethernet pode suportar. Então, preciso de uma solução de balanceamento que distribua a largura de banda para vários servidores. Existem métodos alternativos para usar o DNS? É claro que posso usar um balanceador de carga com canal de fibra etc., mas os custos são ridículos e também aumentam apenas a largura do gargalo e não o eliminam. A única coisa em que consigo pensar são nos endereços IP anycast (é anycast ou multicast?), Mas não tenho os meios para configurar esse sistema.


Esteja preparado para ser atingido na cabeça com uma cópia da RFC 2181 § 5.2 por um amplo espectro de entrevistados.
JdeBP

bem, eu percebo que o RR não foi projetado para balanceamento de carga. mas funciona muito bem ... então ... eu também não estou ciente de uma alternativa. é claro que existem, mas eles não são possíveis para mim, ou são muito caros ou muito complicados.
The Shurrican

@JdeBP sim, bom local - os TTLs em um RRset DEVEM ser os mesmos.
Alnitak

Respostas:


2

Primeiro, concordo completamente com o @Alnitak que o DNS não foi projetado para esse tipo de coisa, e a melhor prática é não (ab) usar o DNS como um balanceador de carga ruim.

Minha pergunta agora é ... existem melhores prectices / methos / regras práticas para ponderar a distribuição de rodízios usando o atributo TTL dos registros DNS?

Para responder à premissa da pergunta, a abordagem usada para executar round robin ponderado com basix usando DNS é:

  • Ajuste a ocorrência relativa de registros nas respostas DNS autoritativas. Ou seja, se Server Ahouver 1/3 de tráfego e Server B2/3, 1/3 das respostas DNS autoritativas aos proxies DNS conterão apenas A o IP e 2/3 das respostas apenas B. (Se 2 ou mais servidores compartilharem o mesmo 'peso', eles poderão ser agrupados em uma resposta).
  • Mantenha um TTL DNS baixo, para que a carga não balanceada seja nivelada relativamente rapidamente. Como os proxies DNS a jusante têm um número muito desigual de clientes por trás deles, convém reorganizar os registros com frequência.

O serviço DNS da Route 53 da Amazon usa esse método .

A quantidade de largura de banda (não solicitações) excede o que um único servidor com Ethernet pode suportar. Então, preciso de uma solução de balanceamento que distribua a largura de banda para vários servidores.

Direita. Pelo que entendi, você tem algum tipo de serviço de downloads / distribuição de vídeo / download de arquivos grandes 'barato', em que a taxa de bits total do serviço excede 1 GBit.

Sem conhecer as especificidades exatas do seu serviço e do layout do servidor, é difícil ser preciso. Mas uma solução comum neste caso é:

  • Rodízio de DNS para duas ou mais instâncias do balanceador de carga no nível TCP / IP ou HTTP.
  • Cada instância do balanceador de carga está altamente disponível (2 balanceadores de carga idênticos cooperando para manter sempre um endereço IP).
  • Cada instância do balanceador de carga usando round robin ponderado ou manipulação de conexão aleatória ponderada com os servidores back-end.

Esse tipo de configuração pode ser criado com software de código aberto ou com dispositivos criados por finalidade de muitos fornecedores. A tag de balanceamento de carga aqui é um excelente ponto de partida, ou você pode contratar administradores de sistemas que fizeram isso antes para consultar você ...


4

Minha pergunta agora é ... existem melhores prectices / methos / regras práticas para ponderar a distribuição de rodízios usando o atributo TTL dos registros DNS?

Sim, a melhor prática é não fazê-lo !

Por favor, repita depois de mim

  • DNS não é para balanceamento de carga
  • DNS não fornece resiliência
  • O DNS não fornece recursos de failover

DNS é para mapear um nome para um ou mais endereços IP . Qualquer equilíbrio subsequente que você obtiver é por sorte, não por design.


1
more IP addresses... como isso não está se equilibrando? Além disso, foi por isso que dei uma introdução apropriada à minha pergunta. se eu não fizesse isso, eu aprovaria o seu post como um COMENTÁRIO, mas, assim, tenho que rebaixá-lo. maby não é ser design, mas funciona muito bem e oferece grandes vantagens em comparação com todas as alternativas. e é isso que sites como google, facebook, amazon etc. também pensam e usam. no entanto, comentário observado. eu atualizei a minha pergunta com mais informações sobre o cenário e pedimos-lhe para sugerir uma solução alternativa balanceamento @Alnitak
O Shurrican

2
O balanceamento dessa maneira não oferece garantia de perfeição, pois muitos problemas do lado do cliente surgem fora do seu controle. Isso é duplamente verdade quando você quer 'pesar' porque, fundamentalmente, você não pode garantir rodízio em primeiro lugar. O DNS é apenas um serviço de consultoria, os clientes não precisam segui-lo à risca. Eu acho que é o ponto que @Alnitak queria fazer
Matthew Ife

eu entendo isso perfeitamente. citação da minha pergunta: eu aprendi que nem todo ISP / dispositivo trata essa resposta da mesma maneira. Por exemplo, alguns servidores DNS alternam os endereços aleatoriamente ou sempre os alternam. Alguns apenas propagam a primeira entrada, outros tentam determinar qual é o melhor (próximo da região) observando o endereço IP. No entanto, se a base de usuários for grande o suficiente (se espalha por vários ISPs etc.), ela se equilibra muito bem. As discrepâncias do servidor carregado do mais alto para o mais baixo quase nunca ultrapassam 15%.
O Shurrican

@JoeHopfgartner, a única maneira infalível de fornecer resiliência, redunância e balanceamento é na camada IP - ou seja, roteamento BGP e balanceadores de carga da camada 4. Eu não disse isso nesta resposta, porque já o disse dezenas de vezes em outras respostas.
Alnitak

A redundância é importante para sua solução? IE, se um servidor cair, ele será tratado adequadamente? Porque se é a sua abertura, uma lata de worms com RR-DNS.
Matthew Ife

2

Dê uma olhada no PowerDNS . Permite criar um back-end de tubo personalizado. Modifiquei um exemplo de back-end DNS do balanceador de carga escrito em perl para usar o módulo Algorithm :: ConsistentHash :: Ketama. Isso permite definir pesos arbitrários da seguinte forma:

my $ketamahe = Algorithm::ConsistentHash::Ketama->new();

# Configure servers and weights
$ketamahe->add_bucket("192.168.1.2", 50);
$ketamahe->add_bucket("192.168.1.25", 50);

E um outro:

# multi-colo hash
my $ketamamc = Algorithm::ConsistentHash::Ketama->new();

# Configure servers and weights
$ketamamc->add_bucket("192.168.1.2", 33);
$ketamamc->add_bucket("192.168.1.25", 33);
$ketamamc->add_bucket("192.168.2.2", 17);
$ketamamc->add_bucket("192.168.2.2", 17);

Adicionei um cname do domínio de nível superior desejado a um subdomínio que chamo gslb, ou Global Server Load Balancing. A partir daí, invoco esse servidor DNS personalizado e envio registros A de acordo com meus pesos desejados.

Funciona como um campeão. O hash do ketama tem a propriedade agradável de interrupção mínima da configuração existente à medida que você adiciona servidores ou ajusta pesos.

Eu recomendo a leitura de servidores DNS alternativos, de Jan-Piet Mens. Ele tem muitas boas idéias e código de exemplo.

Eu também recomendo abandonar a modulação TTL. Você já está muito longe e adicionar outro kludge na parte superior tornará a solução de problemas e a documentação extremamente difíceis.


1

Você pode usar o PowerDNS para executar round robin ponderado, embora a distribuição de carga de maneira tão desequilibrada (100: 1?) Possa ficar muito interessante, pelo menos com os algoritmos que usei na minha solução, em que cada entrada RR tem um peso associado a ela , entre 1 e 100, e um valor aleatório é usado para incluir ou excluir registros.

Aqui está um artigo que escrevi sobre o uso do back-end do MySQL no PowerDNS para fazer o DNS RR ponderado: http://www.mccartney.ie/wordpress/2008/08/wrr-dns-with-powerdns/

O RIPienaar também possui alguns exemplos baseados em Ruby (usando o back-end do tubo PowerDNS): http://code.google.com/p/ruby-pdns/wiki/RecipeWeightedRoundRobin


1

Para lidar com esse tipo de configuração, você precisa procurar uma solução real de balanceamento de carga. Leia Servidor virtual Linux e HAProxy . Você obtém o benefício adicional de os servidores serem removidos automaticamente do pool se eles falharem e os efeitos forem muito mais facilmente compreendidos. A ponderação é simplesmente uma configuração a ser ajustada.


O problema disso é que eu tenho um problema de largura de banda e não um número de solicitações que um único servidor pode manipular. Portanto, uma solução em que eu tenho que direcionar todo o tráfego através de um nó não é uma solução para mim. A única coisa que consigo pensar ao lado da solução DNS é um endereço IP multicast. Eu editei minha pergunta de acordo.
O Shurrican

desculpe eu anycast média, não multicast (eu acho)
O Shurrican

1
Se a largura de banda for o problema, você deve examinar este + LACP nos seus comutadores. Você pode então conectar várias placas 10G nos dispositivos de balanceamento de carga.
Mark Harrigan

votei isso porque é interessante ... mas, quando tenho o meu switch como gargalo!
O Shurrican
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.