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

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

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

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

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

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

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

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

1
задан 24 August 2016 в 21:41
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
}
1
ответ дан 3 December 2019 в 23:42

Теги

Похожие вопросы