Я создаю облачный стек с помощью 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
}