«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. Борьба за лидерство

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

  1. All the instances must agree on a common key to contend.
  2. Next, the instance creates a session using the agreed key through Consul session management and KV capabilities.
  3. 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.
  4. The instances need to continually watch for the session to acquire the leadership again in case of failure or release.
  5. 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.

  1. The leader creates a session in Consul.
  2. Then it is elected (elected.first).
  3. 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 могут помочь получить блокировку и выбрать лидера.