1. Обзор
В этом уроке мы увидим, как выбор лидерства с Consul помогает обеспечить стабильность данных. Мы предоставим практический пример того, как управлять распределенной блокировкой в параллельных приложениях.
2. Что такое консул?
Consul — это инструмент с открытым исходным кодом, который предоставляет реестр служб и обнаружение на основе проверки работоспособности. Кроме того, он включает в себя графический веб-интерфейс пользователя (GUI) для просмотра и простого взаимодействия с Consul. Он также охватывает дополнительные возможности управления сеансами и хранилища ключей-значений (KV).
В следующих разделах мы сосредоточимся на том, как мы можем использовать управление сеансами Consul и хранилище KV для выбора лидера в приложениях с несколькими экземплярами .
3. Основы Консула
Агент Consul — самый важный компонент, работающий на каждом узле кластера Consul. Он отвечает за проверку здоровья; регистрация, обнаружение и разрешение услуг; хранение данных конфигурации; и многое другое.
Агент Consul может работать в двух разных режимах — Сервер и Агент.
Основные обязанности Consul Server — отвечать на запросы, поступающие от агентов, и выбирать лидера. Лидерство выбирается с использованием протокола консенсуса для обеспечения согласованности (согласно определению CAP) на основе алгоритма Raft .
Подробное описание того, как работает консенсус, не входит в задачи этой статьи. Тем не менее стоит отметить, что узлы могут находиться в одном из трех состояний: лидер, кандидат или ведомый. Он также хранит данные и отвечает на запросы, поступающие от агентов.
Агент легче, чем сервер Consul. Он отвечает за проверку работоспособности зарегистрированных служб и пересылку запросов на сервер. Давайте посмотрим на простую схему кластера Consul:
Consul может помочь и другими способами — например, в параллельных приложениях, в которых один экземпляр должен быть ведущим.
Давайте посмотрим в следующих разделах, как Consul с помощью управления сеансами и хранилища KV может обеспечить эту важную возможность.
4. Выборы руководства с консулом
В распределенных развертываниях служба, удерживающая блокировку, является ведущей. Поэтому для высокодоступных систем очень важно управлять блокировками и лидерами.
Consul предоставляет простое в использовании хранилище KV и управление сессиями . Эти функции служат для построения выборов лидеров , поэтому давайте изучим принципы, лежащие в их основе.
4.1. Конфликт за лидерство
Первое, что делают все экземпляры, принадлежащие распределенной системе, — соревнуются за лидерство. Борьба за лидерство включает в себя ряд шагов:
- Все экземпляры должны согласовать общий ключ для соперничества.
- Затем экземпляр создает сеанс, используя согласованный ключ с помощью управления сеансом Consul и возможностей KV.
- В-третьих, они должны приобрести сеанс. Если возвращаемое значение равно
true
, блокировка принадлежит экземпляру, а еслиfalse
, то экземпляр является последователем. - Экземпляры должны постоянно следить за сеансом, чтобы снова получить лидерство в случае сбоя или освобождения .
- Наконец, лидер может освободить сеанс, и процесс начинается снова.
После избрания лидера остальные экземпляры используют 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
.
Выполним сниппет и проверим проделанные шаги:
- Лидер создает сессию в Консуле.
- Затем он избирается (
selected.first
). - Остальные экземпляры наблюдают до тех пор, пока сессия не будет освобождена :
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
.
Давайте откроем браузер и щелкнем раздел «ключ-значение», чтобы подтвердить создание сеанса:
Поэтому один из параллельных экземпляров создал сеанс, используя согласованный ключ для приложения. Только когда сессия освобождается, процесс может начаться заново, и новый экземпляр может стать лидером.
5. Вывод
В этой статье мы показали основы выбора лидерства в высокопроизводительных приложениях с несколькими экземплярами. Мы продемонстрировали, как управление сессиями и возможности хранилища KV Consul могут помочь получить блокировку и выбрать лидера.
Как всегда, код доступен на GitHub .