Обнаружение сервиса Консул - можно вернуть только 1 хост?

Я создаю облачный стек, используя консул для обнаружения сервисов, но я попал в стену, поэтому я спрашиваю людей интернета об этом.

То, что я хочу сделать, - это зарегистрировать службу в консуле с нескольких хостов, но возвращать только один из них для всех запросов, пока служба работает. Если быть точным:

  • узел A, узел B, узел C способны предоставить услугу X
  • все узлы работают и работают
  • и все они регистрируют службу в консуле.

В этот момент, когда я запрашиваю консул для этих данных, я получу все три узла в качестве ответа. Я хочу получить только один из них, если служба предоставляется этим узлом, но если нет, я бы хотел получить другой узел для всех вопросов.

Точнее, с примером: я создаю кластер xtradb, и один из узлов должен реплицироваться из нашего старого центра обработки данных. Может быть только один, который реплицируется в данный момент, но если этот узел выходит из строя, некоторые другие узлы должны продолжать репликацию.

Я могу решить эту проблему с помощью внешнего хоста мониторинга, но это может быть SPOF, поэтому лучше всего будет поставить сценарий контроля репликации на всех узлах, который запрашивает консула: "Являюсь ли я ответственным хостом за репликацию?" и если ответ - да, то настройте реплику локально. Теоретически, если этот узел выйдет из строя, консул может проголосовать за нового "мастера реплики" - и агент на этом узле настроит репликацию.

Итак, способен ли консул на это? Если нет, есть ли другой способ добиться этого? (Мы работаем на GCP, поэтому я не могу кворум с дисками или с плавающими IP-адресами. Все хосты независимы, мне нужен некоторый уровень, который может иметь консенсус по хостам.) В худшем случае я напишу это сам, но было бы лучше иметь готовое к производству решение.

1 ответ

Решение

Предполагается, что у вас есть 3 службы, запущенные и зарегистрированные консулом, и запросcurl -s 'http://localhost:8500/v1/catalog/service/consul' | jq '' в результате этого

[{
  "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
}]

Поскольку все доступно, вы должны иметь возможность использовать первый в буквенно-цифровом порядке:

# 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
}
Другие вопросы по тегам