Обнаружение сервиса Консул - можно вернуть только 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
}