Назад | Перейти на главную страницу

Consul service discovery - можно вернуть только 1 хост?

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

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

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

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

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

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

Предположим, у вас есть 3 запущенных сервиса, зарегистрированных в consul, и запрос 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
}