Zookeeper
Zookeeper: дизайн для распределенных приложений分布式协调服务
ZooKeeper является открытым исходным кодом分布式应用
из分布式协调服务
. Он содержит простой原语集
, распределенные приложения могут реализовывать на его основе службы синхронизации, обслуживания конфигурации и службы именования. Zookeeper разработан так, чтобы его было легко программировать, он использует модель данных, аналогичную структуре дерева каталогов файловой системы, работает на языке java и имеет привязки для java и c.
协调服务
очень сложно правильно реализовать. Они особенно подвержены ошибкам, таким как условия гонки, взаимоблокировки и т. д. Мотивация ZooKeeper состоит в том, чтобы упростить внедрение служб координации с нуля для распределенных приложений.
Цели дизайна
ZooKeeper очень прост.
ZooKeeper позволяет распределенным процессам координировать друг с другом через общее иерархическое пространство имен, организованное аналогично стандартной файловой системе. пространство имен называетсяznode
состоит из записей данных, которые на языке ZooKeeper очень похожи на файлы и каталоги в стандартной файловой системе. В отличие от типичных файловых систем для хранения, данные ZooKeeper хранятся в памяти, что означает, что ZooKeeper может обеспечить высокую пропускную способность и низкую задержку.
Реализация Zookeeper ориентирована на высокую производительность, высокую доступность и строго последовательный доступ. Аспект производительности ZooKeeper означает, что его можно использовать в больших распределенных системах. Аспект надежности делает его не единой точкой отказа. Строгий порядок означает, что сложные примитивы синхронизации могут быть реализованы на стороне клиента.
Zookeeper копируется
Как и распределенный процесс, который он координирует, сам Zookeeper реплицируется на набор хостов, называемый «ансамблем».
Каждый сервер (сервер), входящий в состав службы Zookeeper (Сервис), должен знать друг друга. Они поддерживают граф состояний в памяти, а также постоянно хранимый журнал транзакций и моментальные снимки. Пока доступно большинство этих серверов, доступна вся служба ZooKeeper.Клиент (клиент) подключается к любому серверу Zookeeper. Клиент поддерживает соединение TCP, через которое он отправляет запросы, получает ответы, получает события мониторинга и отправляет сердцебиение. Если подключение TCP к серверу прерывается, клиент подключится к другому серверу.
Зокипер заказан
ZooKeeper помечает каждое обновление номером, который отражает порядок всех транзакций ZooKeeper. Последующие операции могут использовать этот порядок для реализации абстракций более высокого уровня, таких как примитивы синхронизации.
ZooKeeper работает быстро
Особенно быстро при работе с нагрузками, в которых преобладает чтение. Приложения ZooKeeper работают на тысячах машин и лучше всего работают в ситуациях, когда чтение чаще, чем запись, с соотношением примерно 10:1.
Модель данных Zookeeper и иерархические пространства имен
Пространства имен, предоставляемые ZooKeeper, очень похожи на стандартные файловые системы. путь определяется косой чертой/
Отдельный ряд элементов. Каждый узел в пространстве имен ZooKeeper идентифицируется путем.
Zookeeper默认节点
и临时节点
В отличие от стандартных файловых систем, каждый узел в пространстве имен ZooKeeper может иметь связанные с ним данные, а также дочерние узлы. Это похоже на то, что файл или каталог могут существовать в файловой системе. ZooKeeper предназначен для хранения связанных данных координации, таких как информация о состоянии, конфигурация, информация о местоположении и т. д., поэтому данные, хранящиеся на каждом узле, обычно небольшие, в диапазоне от байта (байта) до килобайта (КБ). Мы используем термин znode, чтобы было понятно, что мы говорим об узлах данных ZooKeeper.
Znode поддерживает состояние (stat
), которая содержит номер версии и отметку времени, представляющие изменения данных, изменения списка управления доступом (ACL), и может использоваться для проверки кэша и скоординированных обновлений. Каждый раз, когда данные znode изменяются, номер версии увеличивается. Например, всякий раз, когда клиент извлекает данные, он также получает информацию о версии соответствующих данных.
Данные, хранящиеся на каждом узле в пространстве имен, считываются и записываются атомарно. Чтение znode получит все его данные, а запись заменит все его данные.
ZooKeeper также имеет концепцию временных узлов. При создании временного узла сеанс клиента остается активным, временные узлы уже существуют. А когда в конце сеанса удаляются переходные узлы.
Zookeeper条件更新
и监视
(watches)
ZooKeeper поддерживает концепцию «часов». Клиенты могут настроить часы на znode. Когда znode изменится, часы будут запущены и удалены. Когда часы срабатывают, клиент получает пакет, описывающий изменение znode при срабатывании «часов». Если соединение между клиентом и сервером Zookeeper потеряно, клиент получит локальное уведомление.
Zookeeper保证
(Guarantees)
Zookeeper работает очень быстро и очень просто. Однако, поскольку он предназначен в качестве основы для создания более сложных сервисов, таких как «синхронизация», он предоставляет несколько наборов гарантий:
- Последовательная согласованность — запросы на изменение от клиентов будут применяться в том порядке, в котором они были отправлены.
- Атомарность — изменения либо успешны, либо терпят неудачу, нет частичного успеха, частичного отказа.
- Единый образ системы — клиенты видят одно и то же представление службы Zookeeper независимо от того, к какому серверу они подключены.
- Надежность. После применения запроса на изменение результат изменения сохраняется до тех пор, пока не будет перезаписан следующим изменением.
- Своевременность — системное представление клиента всегда является последним в пределах определенного диапазона времени.
Простой API
Цель разработки ZooKeeper — предоставить очень простой программный интерфейс. Поэтому он поддерживает только эти операции:
-
create
Создайте узел по определенному адресу в дереве (пространства имен).
-
delete
Удалить узел.
-
exists
Определить, существует ли узел на определенном пути.
-
get data
Получить данные узла.
-
set data
Запишите данные в узел.
-
get children
Извлекает список дочерних узлов узла.
-
sync
Дождитесь завершения передачи данных.
Zookeeper实现原理
ZooKeeper ComponentsПоказывает высокоуровневые компоненты службы ZooKeeper. УдалитьRequest Processor
Кроме того, каждый сервер, входящий в состав службы ZooKeeper, реплицирует копию каждого компонента.
replicated database
представляет собой базу данных в памяти, содержащую все дерево данных. Записи данных сериализуются на диск перед применением к базе данных в памяти.
Каждый сервер Zookeeper предоставляет услуги клиентам, а клиенты подключаются к конкретному серверу Zookeeper для отправки запросов. Запросы на чтение получаются из локальной копии базы данных сервера. Запросы на изменение состояния сервиса Zookeeper, запросы на запись обрабатываются через протокол консенсуса.
В рамках Соглашения клиент все запросы на запись передаются на отдельный сервер, этот сервер называется лидером. Остальная часть сервера, известный последователь, получать сообщения сообщения (предложение) и доставили сообщение от лидера Соглашения. Слой сообщений поддерживает синхронизацию между лидером и последователем, а также замена обновления при лидерам отказа.
Zookeeper использует собственный протокол атомарных сообщений. Поскольку уровень сообщений является атомарным, Zookeeper может гарантировать, что локальные реплики не будут несогласованными. Когда лидер получает запрос на запись, он вычисляет состояние, в котором находится система, и когда применить запрос на запись, и преобразует это в транзакцию, содержащую новое состояние.
использовать
Программный интерфейс Zookeeper намеренно очень прост. Однако с помощью этих программных интерфейсов возможны операции более высокого порядка, такие как примитивы синхронизации, группировка элементов, принадлежность и т. д.
представление
Zookeeper разработан, чтобы быть эффективным. Но так ли это на самом деле? Исследования, проведенные командой разработчиков Zookeeper в научно-исследовательском центре Yahoo, показывают, что это правда. (См. график ниже: пропускная способность Zookeeper как функция отношения чтения/записи). Особенно высокая производительность в приложениях, в которых операций чтения больше, чем операций записи, поскольку операции записи вызывают синхронизацию состояния на всех серверах. (Больше «чтений», чем «записей» — типичные сценарии для служб координации.)
Пропускная способность Zookeeper изменяется с соотношением чтения-записи
График «Пропускная способность Zookeeper как функция отношения чтения/записи» является результатом работы Zookeeper версии 3.2 на сервере с двумя жесткими дисками Xeon 2Gh + 2 x 15K RPM SATA. Один диск используется в качестве выделенного устройства журнала для Zookeeper. Снимки записываются на диск операционной системы. Запрос на запись — это запись 1 КБ данных, а запрос на чтение — чтение 1 КБ данных. «Серверы» указывает размер ансамбля Zookeeper, то есть количество серверов, составляющих службу Zookeeper. Около 30 других серверов использовались в качестве симулированных клиентов. Ансамбль Zookeeper настроен так, чтобы не позволять клиентам подключаться к лидеру.Примечание. Производительность чтения/записи версии 3.2 была улучшена до 2 раз по сравнению с предыдущей версией 3.1.
Тесты также показывают надежность Zookeeper. На рисунке «Надежность при наличии ошибок» показано, как Zookeeper реагирует на различные сбои. События, отмеченные на рисунке, следующие:
-
Последователь терпит неудачу, а затем восстанавливается.
-
Другой последователь терпит неудачу, а затем восстанавливается.
-
Лидер провалился.
-
Оба Последователя терпят неудачу, а затем восстанавливаются.
-
Другой лидерский недостаток.
надежность
Из этого рисунка можно сделать несколько важных выводов. Во-первых, если фолловер выходит из строя и быстро восстанавливается, Zookeeper может поддерживать высокую пропускную способность, несмотря на сбой. Но, возможно, более важно то, что алгоритм выбора лидера позволяет системе восстанавливаться достаточно быстро, чтобы избежать общего падения пропускной способности. Судя по наблюдениям, Zookeeper потребовалось менее 200 мс, чтобы выбрать нового лидера. В-третьих, как только фолловер восстановится, пропускная способность Zookeeper может снова подняться до уровня, который был, когда он впервые начал обрабатывать запросы.О проекте ZooKeeper
Zookeeper успешно используется во многих промышленных приложениях. В Yahoo Zookeeper используется в качестве службы координации и аварийного переключения для промежуточного программного обеспечения Yahoo для обмена сообщениями, высоко масштабируемой системы публикации и подписки, которая управляет репликацией и распределением данных для десятков тысяч тем. Zookeeper также используется в службе сканирования Yahoo для управления отработкой отказа. Многие из рекламных систем Yahoo также используют Zookeeper для надежного обслуживания.