Обнаружение сервисов в ZooKeeper
|
ПРИМЕЧАНИЕ
Концепции и основные компоненты ZooKeeper описаны в статье ZooKeeper. |
Обзор
Service Discovery — механизм ZooKeeper, действующий как реестр, в котором отслеживаются адреса всех экземпляров. Экземпляры имеют динамически назначаемые сетевые пути.
Система Service Discovery предоставляет механизм для:
-
регистрации сервисов и экземпляров сервисов;
-
поиска экземпляров конкретного сервиса;
-
уведомления об изменении экземпляров сервиса.
Процедура Service Discovery состоит из двух фаз:
-
Регистрация сервиса (Service Registration).
-
Обнаружение сервиса (Service Discovery).
Для ипользования механизма Service Discovery с учетом балансировки нагрузки используется пакет curator-x-discovery из состава клиентской библиотеки Java/JVM для Apache ZooKeeper Apache Curator.
Механизм Service Discovery представлен на следующей схеме.
Ниже описаны стадии Service Discovery.
Регистрация сервиса (Service Registration)
Когда появляется экземпляр сервиса Kafka, он регистрируется в Service Registry ZooKeeper в пространстве имен (namespace) своего сервиса, добавляя свой эфемерный znode. Znode хранит host:port сервера в качестве своих данных. Экземпляр сервиса отправляет запросы heartbeat для подтверждения своего существования (регистрации).
Service Registry — компонент, содержащий базу данных всех доступных экземпляров сервисов. Он хранит сведения о доступных в настоящее время экземплярах каждого сервиса и их сетевые данные для установления соединения.
Service Registry отслеживает изменения в запущенных экземплярах, опрашивая среду развертывания или подписываясь на события. Когда Service Registry обнаруживает новый доступный экземпляр сервиса, он записывает его в свою базу данных. Service Registry также отменяет регистрацию отказавших (отключенных) экземпляров сервиса.
Apache Curator представляет экземпляр сервиса как класс ServiceInstance. ServiceInstances имеют имя, идентификатор, адрес, порт и/или порт ssl, а также необязательную полезную нагрузку (определяемую пользователем). ServiceInstances сериализуются и хранятся в ZooKeeper следующим образом:
base path
|_______ service A name
|__________ instance 1 id --> (serialized ServiceInstance)
|__________ instance 2 id --> (serialized ServiceInstance)
|__________ ...
|_______ service B name
|__________ instance 1 id --> (serialized ServiceInstance)
|__________ instance 2 id --> (serialized ServiceInstance)
|__________ ...
|_______ ...
Обнаружение сервиса (Service Discovery)
После регистрации экземпляров сервисов обнаружение сервиса происходит в следующей последовательности:
-
Клиент подключается к ансамблю ZooKeeper и запрашивает нужный сервис.
-
При помощи класса
ServiceProvider, используемого в Apache Curator, ZooKeeper использует алгоритм балансировки нагрузки для выбора одного из доступных экземпляров сервиса и возвращаетhost:portдля одного из зарегистрированных экземпляров. -
Клиент подключается к экземпляру сервиса.