Найти в Дзене

Знакомимся с ZooKeeper

Оглавление

Apache ZooKeeper — это централизованный сервис для управления конфигурацией, синхронизации распределённых систем и управления именами. Он часто используется в распределённых системах для координации и управления состояниями, которые необходимо разделять между узлами кластера.

Он был создан как часть экосистемы Apache Hadoop для упрощения управления большими кластерами и является важной частью многих распределённых систем, таких как Apache Kafka, HBase, Solr и других. ZooKeeper решает задачи синхронизации, конфигурационного управления, управления распределёнными блокировками и лидерства в распределённых приложениях.

Зачем нужен ZooKeeper

В распределённых системах часто возникает необходимость синхронизировать состояние между множеством узлов. Например:

  • Убедиться, что только один узел выполняет определённую задачу (лидерство).
  • Управление конфигурацией, которая должна быть согласована между всеми узлами.
  • Обнаружение изменений в кластере (например, добавление или удаление узлов).
  • Поддержка распределённой блокировки для предотвращения конкурентного доступа к разделяемым ресурсам.

ZooKeeper помогает решить эти задачи путём предоставления простого API для работы с координируемыми данными.

Основные принципы ZooKeeper:

1. Простота и производительность: ZooKeeper разработан для того, чтобы быть простым в использовании и высокопроизводительным. Он работает в режиме "лидер-последователь", где один узел является лидером, а остальные — последователями, что обеспечивает согласованность данных.

2. Надёжность: ZooKeeper гарантирует, что данные всегда будут доступны, даже если один из серверов выйдет из строя. Он использует репликацию данных на несколько серверов (кворумную систему), чтобы обеспечивать высокую доступность и устойчивость к сбоям.

3. Последовательность: Все операции в ZooKeeper либо завершены, либо не завершены (атомарность). Это особенно важно для распределённых систем, где важно обеспечить согласованность данных на всех узлах.

4. Согласованность: Все клиенты видят единое, согласованное состояние системы, даже если один из серверов выходит из строя.

5. Легкость масштабирования: ZooKeeper может поддерживать большое количество клиентов и управлять большим количеством данных, что делает его подходящим для работы в крупных распределённых системах.

Основные компоненты ZooKeeper:

1. ZNode: Это базовая единица данных в ZooKeeper, которая похожа на файл или каталог в файловой системе. Узлы (ZNode) могут содержать данные и другие узлы (подобно каталогам). ZNode может быть:

Постоянным (persistent) — он существует, пока его не удалят вручную.
Эфемерным (ephemeral) — он существует только пока клиент, создавший узел, остаётся подключённым к ZooKeeper.

2. Кворум: Это группа узлов (серверов) ZooKeeper, которые работают вместе для обеспечения надёжности. Обычно, чтобы принять решение, требуется согласие большинства узлов в кворуме.

3. Watcher: Клиенты могут устанавливать наблюдателей (watchers) на узлы ZNode. Наблюдатель оповещает клиента о любых изменениях в состоянии узла (например, если узел был изменён или удалён).

4. Сессии: Клиенты взаимодействуют с ZooKeeper через сессии. Сессия может быть временной и завершиться, если клиент отключится. Эфемерные узлы удаляются автоматически при завершении сессии.

Основные функции ZooKeeper:

1. Управление конфигурацией: ZooKeeper может хранить конфигурационные данные, которые можно обновлять и распространять по всем узлам. Это позволяет динамически изменять настройки системы без перезагрузки всех узлов.

2. Синхронизация: ZooKeeper предоставляет механизм для синхронизации работы нескольких клиентов. Например, он может использоваться для координации работы между узлами, чтобы избежать конфликтов при обновлении данных.

3. Распределённые блокировки: ZooKeeper может реализовывать механизмы распределённых блокировок, что позволяет клиентам координировать доступ к общим ресурсам.

4. Лидерство (Leader Election): В распределённых системах часто требуется выбрать один узел, который будет выполнять роль лидера. ZooKeeper предоставляет механизмы для выбора лидера среди нескольких клиентов.

5. Наблюдение за состоянием (Watchers): Клиенты могут отслеживать изменения в структуре или содержимом ZNode, что позволяет им динамически реагировать на изменения в системе.

Преимущества ZooKeeper:

  • Высокая производительность: ZooKeeper оптимизирован для работы с большим количеством операций, что делает его подходящим для высоконагруженных систем.
  • Надёжность и отказоустойчивость: Даже если один или несколько узлов выйдут из строя, система продолжит работать.
  • Простота использования: API ZooKeeper достаточно прост и предоставляет мощные инструменты для синхронизации и координации.

Примеры использования ZooKeeper:

1. Apache Kafka: ZooKeeper используется для координации брокеров Kafka, управления метаданными и распределённой синхронизации.

2. Apache HBase: ZooKeeper управляет распределёнными серверами HBase и координирует их работу.

3. Распределённые базы данных: ZooKeeper может использоваться для управления распределёнными транзакциями и выбора лидера в базе данных.

Проблемы и ограничения:

1. Сложность администрирования: Несмотря на простоту использования для разработчиков, настройка и поддержка ZooKeeper могут быть сложными, особенно в больших кластерах.

2. Ограничения по объему данных: ZooKeeper не предназначен для хранения больших объемов данных, и его лучше использовать для управления метаданными и координацией.

3. Требования к сети: ZooKeeper чувствителен к задержкам в сети, и его производительность может снизиться в условиях сетевых проблем.

Альтернативы ZooKeeper:

Хотя ZooKeeper остаётся популярным решением, существуют и другие системы координации, такие как:

  • etcd: Легковесная система координации, разработанная CoreOS, которая используется в Kubernetes для хранения конфигураций и управления кластером.
  • Consul: Сервис-реестр и система координации от HashiCorp, которая также предоставляет функции управления конфигурацией и сервисами.
-2

Пример разворачивания ZooKeeper в Docker Compose

Для разворачивания ZooKeeper в Docker Compose нам понадобятся:

1. Docker и Docker Compose установлены на вашей машине.

2. Минимальная конфигурация для ZooKeeper, которая упростит развертывание.

Шаги:

1. Создайте файл docker-compose.yml

-3

Объяснение:

  • version: '3': Версия файла Docker Compose. Здесь используется версия 3, которая поддерживается в большинстве современных версий Docker Compose.
  • services:zookeeper: Здесь мы определяем сервис под именем zookeeper.
  • image: 'zookeeper:3.7.0': Мы используем официальное изображение ZooKeeper версии 3.7.0, которое располагается на Docker Hub.
  • container_name: zookeeper: Название контейнера, которое будет видно в системе Docker.
  • ports:"2181:2181": Маппинг порта ZooKeeper на хосте. Порт 2181 — это порт по умолчанию, на котором ZooKeeper слушает запросы клиентов.
  • environment:
    ZOO_MY_ID: 1: Это идентификатор ZooKeeper-сервера, необходимый для кластера. Хотя в нашем случае используется одиночный экземпляр ZooKeeper, это необходимо для корректной работы.
    ZOO_SERVERS: server.1=0.0.0.0:2888:3888: Это строка конфигурации для кластера ZooKeeper. 0.0.0.0 указывает, что сервер слушает на всех доступных интерфейсах. Порты 2888 и 3888 используются для связи между узлами кластера (излишне в одиночной конфигурации, но обязательны для корректной работы).
  • volumes:./data:/data: Монтирование локальной директории ./data для хранения данных ZooKeeper.
    ./datalog:/datalog: Монтирование директории для хранения журналов операций.
  • test: Это команда, которая будет запускаться для проверки состояния контейнера. В данном случае, мы выполняем команду:
echo ruok | nc 127.0.0.1 2181

— это команда, которая отправляет запрос "ruok" (Are you OK?) ZooKeeper.
nc 127.0.0.1 2181 — это утилита nc (netcat), которая используется для подключения к порту 2181 (порт ZooKeeper).
Если ZooKeeper работает корректно, он должен вернуть строку imok.Конструкция [ $$(echo ruok | nc 127.0.0.1 2181) == \"imok\" ] || exit 1 проверяет, что ответ от ZooKeeper — это imok. Если ответ не равен imok, команда завершится с кодом возврата 1 (ошибка), что укажет Docker на то, что контейнер не здоров.

  • interval: Это интервал, с которым Docker будет проверять состояние контейнера. В данном примере проверка запускается каждые 2 секунды.
  • timeout: Тайм-аут для выполнения команды проверки. Если команда выполнится дольше, чем за 5 секунд, она будет считаться неудачной.
  • retries: Количество неудачных проверок перед тем, как Docker пометит контейнер как "нездоровый". В данном примере контейнер помечается как "нездоровый" после 3-х неудачных попыток.
  • start_period: Период времени после запуска контейнера, в течение которого Docker не учитывает результаты проверок (даёт контейнеру время для запуска). Здесь это значение установлено в 10 секунд. То есть первые 10 секунд после запуска контейнера Docker не будет считать его "нездоровым", даже если проверка завершится неудачей.

2. Запуск ZooKeeper

После того как вы создали файл docker-compose.yml, выполните следующую команду в той же директории, где находится этот файл:

docker-compose up

3. Остановка и удаление контейнера

Чтобы остановить контейнер ZooKeeper, выполните команду:

docker-compose down

Это остановит и удалит контейнеры, но сохранит данные, которые были смонтированы на локальные директории ./data и ./datalog.

Как проверить статус здоровья:

После того как вы запустите контейнер с помощью docker-compose up, вы можете проверить статус здоровья контейнера с помощью команды:

docker ps

Вы увидите колонку STATUS, которая будет содержать информацию о состоянии контейнера, включая информацию о его здоровье (например, healthy, unhealthy, или starting).

Пример вывода команды docker ps:

-4

Если проверка здоровья не прошла, статус будет выглядеть как unhealthy.

Если Вам интересно, что еще можно найти на канале QA Helper, прочитайте статью: Вместо оглавления. Что вы найдете на канале QA Helper - справочник тестировщика?

Не забудьте подписаться на канал, чтобы не пропустить полезную информацию: QA Helper - справочник тестировщика

Пишите в комментариях какой пункт было бы интересно рассмотреть более подробно.

Обязательно прочитайте: Что должен знать и уметь тестировщик

Также будет интересно почитать: Вопросы которые задают на собеседовании тестировщикам