«1. Обзор
В этом уроке мы увидим, как выбор лидерства с Consul помогает обеспечить стабильность данных. Мы предоставим практический пример того, как управлять распределенной блокировкой в параллельных приложениях.
2. Что такое Консул?
Consul — это инструмент с открытым исходным кодом, который предоставляет реестр служб и обнаружение на основе проверки работоспособности. Кроме того, он включает в себя графический веб-интерфейс пользователя (GUI) для просмотра и простого взаимодействия с Consul. Он также охватывает дополнительные возможности управления сеансами и хранилища ключей-значений (KV).
В следующих разделах мы сосредоточимся на том, как мы можем использовать управление сеансами Consul и хранилище KV для выбора лидера в приложениях с несколькими экземплярами.
3. Основы Consul
Агент Consul — самый важный компонент, работающий на каждом узле кластера Consul. Он отвечает за проверку здоровья; регистрация, обнаружение и разрешение услуг; хранение данных конфигурации; и многое другое.
Агент Consul может работать в двух разных режимах — Сервер и Агент.
Основными обязанностями Consul Server являются ответы на запросы, поступающие от агентов, и выбор лидера. Лидерство выбирается с использованием протокола консенсуса для обеспечения согласованности (как определено CAP) на основе алгоритма Raft.
В задачу этой статьи не входит детальное рассмотрение того, как работает консенсус. Тем не менее стоит отметить, что узлы могут находиться в одном из трех состояний: лидер, кандидат или ведомый. Он также хранит данные и отвечает на запросы, поступающие от агентов.
Агент легче, чем сервер Consul. Он отвечает за проверку работоспособности зарегистрированных служб и пересылку запросов на сервер. Давайте посмотрим на простую диаграмму кластера Consul:
Consul может помочь и другими способами — например, в параллельных приложениях, в которых один экземпляр должен быть ведущим.
Давайте посмотрим в следующих разделах, как Consul с помощью управления сессиями и хранилища KV может обеспечить эту важную возможность.
4. Выбор лидера с помощью Consul
В распределенных развертываниях служба, удерживающая блокировку, является лидером. Поэтому для высокодоступных систем очень важно управлять блокировками и лидерами.
Consul предоставляет простое в использовании хранилище KV и управление сессиями. Эти функции служат для построения выборов лидеров, поэтому давайте изучим принципы, лежащие в их основе.
4.1. Борьба за лидерство
Первое, что делают все экземпляры распределенной системы, — это соревнуются за лидерство. Борьба за лидерство включает в себя ряд шагов:
- All the instances must agree on a common key to contend.
- Next, the instance creates a session using the agreed key through Consul session management and KV capabilities.
- Third, they should acquire the session. If the return value is true, the lock belongs to the instance, and if false, the instance is a follower.
- The instances need to continually watch for the session to acquire the leadership again in case of failure or release.
- Finally, the leader can release the session, and the process begins again.
После избрания лидера остальные экземпляры используют 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 Docker, доступный в Docker Hub, крупнейшем в мире репозитории образов контейнеров.
Мы развернем Consul с помощью Docker, выполнив команду:
docker run -d --name consul -p 8500:8500 -e CONSUL_BIND_INTERFACE=eth0 consul
«
«Consul запущен и должен быть доступен по адресу localhost:8500.
- The leader creates a session in Consul.
- Then it is elected (elected.first).
- The rest of the instances watch until the session is released:
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 могут помочь получить блокировку и выбрать лидера.