Descoberta do serviço Consul - é possível devolver apenas 1 host?

1

Estou construindo uma pilha de nuvens usando o cônsul para a descoberta de serviços, mas atropelei uma parede, então eu pergunto às pessoas da internet sobre isso.

O que eu quero fazer é registrar um serviço no consul de vários hosts, mas retornar apenas um deles para todas as consultas enquanto o serviço estiver ativo. Para ser exato:

  • nó A, nó B, nó C são todos capazes de fornecer serviço X
  • todos os nós estão ativos e em execução
  • e todos eles registram o serviço em cônsul.

Neste momento, quando eu consultar o consul para esses dados, receberei todos os três nós como resposta. Eu quero obter apenas um deles, desde que o serviço seja fornecido por esse nó, mas se não, eu gostaria de obter um outro nó para todas as perguntas.

Para ser mais exato com um exemplo: Eu construo um cluster xtradb, e um dos nós tem que replicar a partir do datacenter antigo de nós. Poderia haver apenas um, que está sendo replicado em um determinado momento, mas se esse nó ficar inativo, alguns dos outros nós terão que continuar replicando.

Eu posso resolver isso com um host de monitoramento externo, mas isso pode ser um SPOF, então o melhor seria colocar um script de supervisão de replicação em todos os nós, que está consultando o cônsul sobre 'eu sou o host responsável pela replicação? ' e se a resposta for sim, então configure a réplica localmente. Teoricamente, se esse nó for desativado, o cônsul poderá votar no novo 'mestre de réplica' --- e o agente nesse nó configurará a replicação.

Então, o cônsul é capaz disso? Se não, existe alguma outra maneira de conseguir isso? (Estamos rodando no GCP para que eu não possa quorum com discos, ou com IPs flutuantes. Todos os hosts são independentes, eu preciso de alguma camada que possa ter consenso sobre hosts.) No pior cenário, eu escreverei isso sozinho, mas seria melhor ter uma solução pronta para produção.

    
por banyek 24.08.2016 / 13:55

1 resposta

1

Supondo que você tenha 3 serviços em execução e registrados com o consul e uma consulta curl -s 'http://localhost:8500/v1/catalog/service/consul' | jq '' resultando neste

[{
  "Node": "local01-consul0001.local",
  "Address": "192.168.33.11",
  "ServiceID": "consul",
  "ServiceName": "consul",
  "ServiceTags": [
    "master"
  ],
  "ServiceAddress": "",
  "ServicePort": 8300
},
{
  "Node": "local01-consul0002.local",
  "Address": "192.168.33.12",
  "ServiceID": "consul",
  "ServiceName": "consul",
  "ServiceTags": [
    "master"
  ],
  "ServiceAddress": "",
  "ServicePort": 8300
},
{
  "Node": "local01-consul0003.local",
  "Address": "192.168.33.13",
  "ServiceID": "consul",
  "ServiceName": "consul",
  "ServiceTags": [
    "master"
  ],
  "ServiceAddress": "",
  "ServicePort": 8300
}]

Como todos estão disponíveis, você deve poder usar o primeiro em ordem alfanumérica:

# curl -s  'http://localhost:8500/v1/catalog/service/consul'  | jq '.[0]'
{
  "Node": "local01-consul0001.local",
  "Address": "192.168.33.11",
  "ServiceID": "consul",
  "ServiceName": "consul",
  "ServiceTags": [
    "master"
  ],
  "ServiceAddress": "",
  "ServicePort": 8300
}
    
por 29.08.2016 / 14:10