Перейти к основному содержимому

Выборы руководства с консулом

· 5 мин. чтения

1. Обзор

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

2. Что такое консул?

Consul — это инструмент с открытым исходным кодом, который предоставляет реестр служб и обнаружение на основе проверки работоспособности. Кроме того, он включает в себя графический веб-интерфейс пользователя (GUI) для просмотра и простого взаимодействия с Consul. Он также охватывает дополнительные возможности управления сеансами и хранилища ключей-значений (KV).

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

3. Основы Консула

Агент Consul — самый важный компонент, работающий на каждом узле кластера Consul. Он отвечает за проверку здоровья; регистрация, обнаружение и разрешение услуг; хранение данных конфигурации; и многое другое.

Агент Consul может работать в двух разных режимах — Сервер и Агент.

Основные обязанности Consul Server — отвечать на запросы, поступающие от агентов, и выбирать лидера. Лидерство выбирается с использованием протокола консенсуса для обеспечения согласованности (согласно определению CAP) на основе алгоритма Raft .

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

Агент легче, чем сервер Consul. Он отвечает за проверку работоспособности зарегистрированных служб и пересылку запросов на сервер. Давайте посмотрим на простую схему кластера Consul:

./7804bda1670d74573686fe82e8229eed.jpg

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

Давайте посмотрим в следующих разделах, как Consul с помощью управления сеансами и хранилища KV может обеспечить эту важную возможность.

4. Выборы руководства с консулом

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

Consul предоставляет простое в использовании хранилище KV и управление сессиями . Эти функции служат для построения выборов лидеров , поэтому давайте изучим принципы, лежащие в их основе.

4.1. Конфликт за лидерство

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

  1. Все экземпляры должны согласовать общий ключ для соперничества.
  2. Затем экземпляр создает сеанс, используя согласованный ключ с помощью управления сеансом Consul и возможностей KV.
  3. В-третьих, они должны приобрести сеанс. Если возвращаемое значение равно true , блокировка принадлежит экземпляру, а если false , то экземпляр является последователем.
  4. Экземпляры должны постоянно следить за сеансом, чтобы снова получить лидерство в случае сбоя или освобождения .
  5. Наконец, лидер может освободить сеанс, и процесс начинается снова.

После избрания лидера остальные экземпляры используют Consul KV и управление сессиями для обнаружения лидера:

  • Получение согласованного ключа
  • Получение информации о сеансе, чтобы узнать лидера

4.2. Практический пример

Нам нужно создать ключ и значение вместе с сеансом в Consul с несколькими запущенными экземплярами. Чтобы помочь в этом, мы будем использовать реализацию Java с открытым исходным кодом Kinguin Digital Limited Leadership Consul .

Во-первых, давайте включим зависимость:

<dependency>
<groupId>com.github.kinguinltdhk</groupId>
<artifactId>leadership-consul</artifactId>
<version>${kinguinltdhk.version}</version>
<exclusions>
<exclusion>
<groupId>com.ecwid.consul</groupId>
<artifactId>consul-api</artifactId>
</exclusion>
</exclusions>
</dependency>

Мы исключили зависимость consul-api , чтобы избежать коллизий в разных версиях Java.

Для общего ключа мы будем использовать:

services/%s/leader

Давайте проверим весь процесс с помощью простого фрагмента:

new SimpleConsulClusterFactory()
.mode(SimpleConsulClusterFactory.MODE_MULTI)
.debug(true)
.build()
.asObservable()
.subscribe(i -> System.out.println(i));

Затем мы создаем кластер с несколькими экземплярами с помощью asObservable() , чтобы облегчить подписчикам доступ к событиям. Лидер создает сеанс в Consul, и все экземпляры проверяют сеанс, чтобы подтвердить лидерство.

Наконец, мы настраиваем конфигурацию консула и управление сеансом , а также согласованный ключ между экземплярами для выбора лидера:

cluster:
leader:
serviceName: cluster
serviceId: node-1
consul:
host: localhost
port: 8500
discovery:
enabled: false
session:
ttl: 15
refresh: 7
election:
envelopeTemplate: services/%s/leader

4.3. Как это проверить

Есть несколько вариантов установки Consul и запуска агента .

Одна из возможностей развертывания Consul — через контейнеры . Мы будем использовать образ Consul Docker , доступный в Docker Hub, крупнейшем в мире репозитории образов контейнеров.

Мы развернем Consul с помощью Docker, выполнив команду:

docker run -d --name consul -p 8500:8500 -e CONSUL_BIND_INTERFACE=eth0 consul

Консул запущен и должен быть доступен по адресу localhost:8500 .

Выполним сниппет и проверим проделанные шаги:

  1. Лидер создает сессию в Консуле.
  2. Затем он избирается ( selected.first ).
  3. Остальные экземпляры наблюдают до тех пор, пока сессия не будет освобождена :
INFO: multi mode active
INFO: Session created e11b6ace-9dc7-4e51-b673-033f8134a7d4
INFO: Session refresh scheduled on 7 seconds frequency
INFO: Vote frequency setup on 10 seconds frequency
ElectionMessage(status=elected, vote=Vote{sessionId='e11b6ace-9dc7-4e51-b673-033f8134a7d4', serviceName='cluster-app', serviceId='node-1'}, error=null)
ElectionMessage(status=elected.first, vote=Vote{sessionId='e11b6ace-9dc7-4e51-b673-033f8134a7d4', serviceName='cluster-app', serviceId='node-1'}, error=null)
ElectionMessage(status=elected, vote=Vote{sessionId='e11b6ace-9dc7-4e51-b673-033f8134a7d4', serviceName='cluster-app', serviceId='node-1'}, error=null)

Consul также предоставляет веб-интерфейс, доступный по адресу http://localhost:8500/ui .

Давайте откроем браузер и щелкнем раздел «ключ-значение», чтобы подтвердить создание сеанса:

./2444df22ec3d2fa85193cd60905a95ea.jpg

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

5. Вывод

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

Как всегда, код доступен на GitHub .