Zookeeper - Краткое руководство
ZooKeeper - это распределенная служба координации для управления большим набором хостов. Координация и управление сервисом в распределенной среде - сложный процесс. ZooKeeper решает эту проблему с помощью простой архитектуры и API. ZooKeeper позволяет разработчикам сосредоточиться на основной логике приложения, не беспокоясь о распределенной природе приложения.
Фреймворк ZooKeeper изначально был создан в Yahoo! для доступа к своим приложениям простым и надежным способом. Позже Apache ZooKeeper стал стандартом для организованного сервиса, используемого Hadoop, HBase и другими распределенными фреймворками. Например, Apache HBase использует ZooKeeper для отслеживания состояния распределенных данных.
Прежде чем двигаться дальше, важно, чтобы мы кое-что знали о распределенных приложениях. Итак, давайте начнем обсуждение с краткого обзора распределенных приложений.
Распределенное приложение
Распределенное приложение может работать в нескольких системах в сети в заданное время (одновременно) за счет координации между собой для быстрого и эффективного выполнения конкретной задачи. Обычно сложные и трудоемкие задачи, выполнение которых нераспределенным приложением (работающим в одной системе) занимает несколько часов, распределенное приложение может выполнить за несколько минут, используя вычислительные возможности всей задействованной системы.
Время выполнения задачи можно еще больше сократить, настроив распределенное приложение для работы в большем количестве систем. Группа систем, в которых работает распределенное приложение, называетсяCluster и каждая машина, работающая в кластере, называется Node.
Распределенное приложение состоит из двух частей: Server и Clientприменение. Серверные приложения фактически распределены и имеют общий интерфейс, так что клиенты могут подключаться к любому серверу в кластере и получать тот же результат. Клиентские приложения - это инструменты для взаимодействия с распределенным приложением.
Преимущества распределенных приложений
Reliability - Отказ одной или нескольких систем не приводит к отказу всей системы.
Scalability - Производительность может быть увеличена по мере необходимости путем добавления дополнительных машин с незначительными изменениями конфигурации приложения без простоев.
Transparency - Скрывает сложность системы и показывает себя как единое целое / приложение.
Проблемы распределенных приложений
Race condition- Две или более машины пытаются выполнить определенную задачу, которая на самом деле должна выполняться только одной машиной в любой момент времени. Например, общие ресурсы должны быть изменены только на одной машине в любой момент времени.
Deadlock - Две или более операций, ожидающих завершения друг друга бесконечно.
Inconsistency - Частичный сбой данных.
Для чего предназначен Apache ZooKeeper?
Apache ZooKeeper - это служба, используемая кластером (группой узлов) для координации между собой и поддержки общих данных с помощью надежных методов синхронизации. ZooKeeper сам по себе является распределенным приложением, предоставляющим услуги для написания распределенного приложения.
Общие услуги, предоставляемые ZooKeeper, следующие:
Naming service- Определение узлов в кластере по имени. Он похож на DNS, но для узлов.
Configuration management - Самая последняя и актуальная информация о конфигурации системы для присоединяющегося узла.
Cluster management - Присоединение / выход узла в кластере и статус узла в реальном времени.
Leader election - Выбор узла лидером для координации.
Locking and synchronization service- Блокировка данных при их изменении. Этот механизм помогает в автоматическом восстановлении после сбоя при подключении других распределенных приложений, таких как Apache HBase.
Highly reliable data registry - Доступность данных даже при выходе из строя одного или нескольких узлов.
Распределенные приложения предлагают множество преимуществ, но они также создают несколько сложных и труднопреодолимых проблем. Фреймворк ZooKeeper предоставляет полный механизм для решения всех проблем. Состояние гонки и взаимоблокировка обрабатываются с помощьюfail-safe synchronization approach. Другой главный недостаток - несогласованность данных, которую ZooKeeper решает с помощьюatomicity.
Преимущества ZooKeeper
Вот преимущества использования ZooKeeper -
Simple distributed coordination process
Synchronization- Взаимное исключение и взаимодействие между серверными процессами. Этот процесс помогает в Apache HBase для управления конфигурацией.
Ordered Messages
Serialization- Кодируйте данные по определенным правилам. Убедитесь, что ваше приложение работает стабильно. Этот подход можно использовать в MapReduce для координации очереди для выполнения запущенных потоков.
Reliability
Atomicity - Передача данных либо успешна, либо полностью завершена, но ни одна транзакция не является частичной.
Прежде чем углубляться в работу ZooKeeper, давайте взглянем на фундаментальные концепции ZooKeeper. В этой главе мы обсудим следующие темы -
- Architecture
- Иерархическое пространство имен
- Session
- Watches
Архитектура ZooKeeper
Взгляните на следующую диаграмму. Он изображает «архитектуру клиент-сервер» ZooKeeper.
Каждый из компонентов, являющихся частью архитектуры ZooKeeper, описан в следующей таблице.
Часть | Описание |
---|---|
Клиент | Клиенты, один из узлов в нашем кластере распределенных приложений, получают доступ к информации с сервера. В течение определенного интервала времени каждый клиент отправляет сообщение на сервер, чтобы сервер знал, что клиент жив. Точно так же сервер отправляет подтверждение, когда клиент подключается. Если от подключенного сервера нет ответа, клиент автоматически перенаправляет сообщение на другой сервер. |
Сервер | Сервер, один из узлов в нашем ансамбле ZooKeeper, предоставляет все услуги клиентам. Дает подтверждение клиенту, чтобы сообщить, что сервер жив. |
Ансамбль | Группа серверов ZooKeeper. Минимальное количество узлов, необходимое для формирования ансамбля, - 3. |
Лидер | Узел сервера, который выполняет автоматическое восстановление в случае отказа любого из подключенных узлов. Лидеры выбираются при запуске службы. |
Последователь | Узел сервера, который следует инструкции лидера. |
Иерархическое пространство имен
На следующей диаграмме изображена древовидная структура файловой системы ZooKeeper, используемой для представления памяти. Узел ZooKeeper упоминается какznode. Каждый znode идентифицируется именем и отделяется последовательностью путей (/).
На схеме сначала у вас есть корень znodeразделены по "/". Под root у вас есть два логических пространства именconfig и workers.
В config пространство имен используется для централизованного управления конфигурацией и workers пространство имен используется для именования.
Под configпространство имен, каждый znode может хранить до 1 МБ данных. Это похоже на файловую систему UNIX, за исключением того, что родительский узел znode также может хранить данные. Основная цель этой структуры - хранить синхронизированные данные и описывать метаданные znode. Эта структура называетсяZooKeeper Data Model.
Каждый znode в модели данных ZooKeeper поддерживает statструктура. Стат просто предоставляетmetadataзнод. Он состоит из номера версии, списка управления действиями (ACL), метки времени и длины данных.
Version number- Каждый znode имеет номер версии, что означает, что каждый раз, когда данные, связанные с znode, изменяются, соответствующий номер версии также будет увеличиваться. Использование номера версии важно, когда несколько клиентов zookeeper пытаются выполнять операции над одним и тем же узлом.
Action Control List (ACL)- ACL - это в основном механизм аутентификации для доступа к znode. Он управляет всеми операциями чтения и записи znode.
Timestamp- Timestamp представляет время, прошедшее с момента создания и изменения znode. Обычно выражается в миллисекундах. ZooKeeper идентифицирует каждое изменение znodes из «ID транзакции» (zxid).Zxid уникален и поддерживает время для каждой транзакции, так что вы можете легко определить время, прошедшее от одного запроса до другого.
Data length- Общий объем данных, хранящихся в znode, - это длина данных. Вы можете хранить не более 1 МБ данных.
Типы знодей
Z-узлы подразделяются на постоянные, последовательные и эфемерные.
Persistence znode- Постоянный znode остается живым даже после отключения клиента, создавшего этот конкретный znode. По умолчанию все z-узлы являются постоянными, если не указано иное.
Ephemeral znode- Эфемерные znodes активны, пока клиент жив. Когда клиент отключается от ансамбля ZooKeeper, эфемерные z-узлы удаляются автоматически. По этой причине только эфемерные znodes не могут иметь потомков. Если удален эфемерный znode, то следующий подходящий узел займет его позицию. Эфемерные зоды играют важную роль в выборах Лидера.
Sequential znode- Последовательные z-узлы могут быть постоянными или эфемерными. Когда новый znode создается как последовательный znode, ZooKeeper устанавливает путь к znode, добавляя 10-значный порядковый номер к исходному имени. Например, если znode с путем/myapp создается как последовательный znode, ZooKeeper изменит путь к /myapp0000000001и установите следующий порядковый номер как 0000000002. Если два последовательных znode создаются одновременно, то ZooKeeper никогда не использует один и тот же номер для каждого znode. Последовательные z-узлы играют важную роль в блокировке и синхронизации.
Сессии
Сеансы очень важны для работы ZooKeeper. Запросы в сеансе выполняются в порядке FIFO. Как только клиент подключается к серверу, будет установлен сеанс иsession id закрепляется за клиентом.
Клиент отправляет heartbeatsчерез определенный интервал времени, чтобы сеанс оставался действительным. Если ансамбль ZooKeeper не получает контрольные сообщения от клиента в течение периода, превышающего период (тайм-аут сеанса), указанный при запуске службы, он решает, что клиент умер.
Таймауты сеанса обычно выражаются в миллисекундах. Когда сеанс завершается по какой-либо причине, эфемерные z-узлы, созданные во время этого сеанса, также удаляются.
Часы
Часы - это простой механизм, позволяющий клиенту получать уведомления об изменениях в ансамбле ZooKeeper. Клиенты могут устанавливать часы при чтении определенного znode. Часы отправляют уведомление зарегистрированному клиенту при любом изменении znode (на котором регистрируется клиент).
Изменения Znode - это модификация данных, связанных с znode, или изменения в дочерних znode. Часы запускаются только один раз. Если клиент снова хочет получить уведомление, это необходимо сделать с помощью другой операции чтения. По истечении сеанса подключения клиент будет отключен от сервера, и связанные с ним часы также будут удалены.
После запуска ансамбль ZooKeeper будет ждать подключения клиентов. Клиенты подключатся к одному из узлов ансамбля ZooKeeper. Это может быть ведущий или ведомый узел. Как только клиент подключен, узел назначает идентификатор сеанса конкретному клиенту и отправляет подтверждение клиенту. Если клиент не получает подтверждения, он просто пытается подключить другой узел в ансамбле ZooKeeper. После подключения к узлу клиент будет регулярно посылать контрольные сигналы узлу, чтобы убедиться, что соединение не потеряно.
If a client wants to read a particular znode, он отправляет read requestк узлу с путем znode, и узел возвращает запрошенный znode, получая его из своей собственной базы данных. По этой причине в ансамбле ZooKeeper чтение выполняется быстро.
If a client wants to store data in the ZooKeeper ensemble, он отправляет на сервер путь znode и данные. Подключенный сервер перешлет запрос лидеру, а затем лидер повторно отправит запрос записи всем фолловерам. Если только большинство узлов ответят успешно, то запрос на запись будет успешным, и успешный код возврата будет отправлен клиенту. В противном случае запрос на запись не будет выполнен. Строгое большинство узлов называетсяQuorum.
Узлы в ансамбле ZooKeeper
Давайте проанализируем эффект наличия разного количества узлов в ансамбле ZooKeeper.
Если мы имеем a single node, то ансамбль ZooKeeper откажет, когда этот узел откажет. Это способствует возникновению «единой точки отказа» и не рекомендуется в производственной среде.
Если мы имеем two nodes и один узел выходит из строя, у нас тоже нет большинства, поскольку один из двух не является большинством.
Если мы имеем three nodesи один узел выходит из строя, у нас большинство, так что это минимальное требование. Для ансамбля ZooKeeper обязательно наличие как минимум трех узлов в действующей производственной среде.
Если мы имеем four nodesи два узла выходят из строя, он снова выходит из строя, и это похоже на наличие трех узлов. Дополнительный узел не служит никакой цели, поэтому лучше добавлять узлы в нечетных числах, например, 3, 5, 7.
Мы знаем, что процесс записи дороже, чем процесс чтения в ансамбле ZooKeeper, так как все узлы должны записывать одни и те же данные в свою базу данных. Поэтому для сбалансированной среды лучше иметь меньшее количество узлов (3, 5 или 7), чем большое количество узлов.
На следующей схеме изображен ZooKeeper WorkFlow, а в следующей таблице поясняются его различные компоненты.
Составная часть | Описание |
---|---|
Написать | Процесс записи обрабатывается ведущим узлом. Лидер пересылает запрос на запись всем znodes и ожидает ответов от znodes. Если половина znodes отвечает, то процесс записи завершен. |
Читать | Чтение выполняется внутри конкретного подключенного znode, поэтому нет необходимости взаимодействовать с кластером. |
Реплицированная база данных | Он используется для хранения данных в zookeeper. Каждый znode имеет свою собственную базу данных, и каждый znode имеет одни и те же данные в любое время с помощью согласованности. |
Лидер | Лидер - это Znode, который отвечает за обработку запросов на запись. |
Последователь | Последователи получают запросы на запись от клиентов и пересылают их ведущему узлу. |
Обработчик запросов | Присутствует только в ведущем узле. Он управляет запросами на запись от ведомого узла. |
Атомные трансляции | Отвечает за трансляцию изменений от ведущего узла к ведомым узлам. |
Давайте проанализируем, как узел-лидер может быть выбран в ансамбле ZooKeeper. Считайте, что естьNколичество узлов в кластере. Процесс избрания лидера выглядит следующим образом -
Все узлы создают последовательный эфемерный znode с одним и тем же путем, /app/leader_election/guid_.
Ансамбль ZooKeeper добавит 10-значный порядковый номер к пути, и созданный znode будет /app/leader_election/guid_0000000001, /app/leader_election/guid_0000000002, и т.п.
Для данного экземпляра узел, который создает наименьшее число в znode, становится лидером, а все остальные узлы - последователями.
Каждый ведомый узел наблюдает за znode, имеющим следующий наименьший номер. Например, узел, создающий znode/app/leader_election/guid_0000000008 буду смотреть зноде /app/leader_election/guid_0000000007 и узел, который создает znode /app/leader_election/guid_0000000007 буду смотреть зноде /app/leader_election/guid_0000000006.
Если лидер выходит из строя, то соответствующий ему znode /app/leader_electionN удаляется.
Следующий в очереди узел-последователь получит уведомление через наблюдатель об удалении лидера.
Следующий в строке подчиненный узел проверит, есть ли другие z-узлы с наименьшим номером. Если нет, то он возьмет на себя роль лидера. В противном случае он находит узел, который создал znode с наименьшим номером в качестве лидера.
Точно так же все остальные узлы-последователи выбирают узел, который создал znode с наименьшим номером в качестве лидера.
Выборы лидера - сложный процесс, когда он проводится с нуля. Но сервис ZooKeeper делает это очень просто. Давайте перейдем к установке ZooKeeper в целях разработки в следующей главе.
Перед установкой ZooKeeper убедитесь, что ваша система работает на любой из следующих операционных систем:
Any of Linux OS- Поддерживает разработку и развертывание. Это предпочтительно для демонстрационных приложений.
Windows OS - Поддерживает только развитие.
Mac OS - Поддерживает только развитие.
Сервер ZooKeeper создан на Java и работает на JVM. Вам необходимо использовать JDK 6 или выше.
Теперь следуйте инструкциям ниже, чтобы установить ZooKeeper framework на свой компьютер.
Шаг 1. Проверка установки Java
Мы полагаем, что в вашей системе уже установлена среда Java. Просто проверьте это с помощью следующей команды.
$ java -version
Если на вашем компьютере установлена Java, вы можете увидеть версию установленной Java. В противном случае выполните простые шаги, указанные ниже, чтобы установить последнюю версию Java.
Шаг 1.1: Загрузите JDK
Загрузите последнюю версию JDK, перейдя по следующей ссылке, и загрузите последнюю версию. Ява
Последней версией (на момент написания этого руководства) является JDK 8u 60, а файл - «jdk-8u60-linuxx64.tar.gz». Загрузите файл на свой компьютер.
Шаг 1.2: Извлеките файлы
Обычно файлы загружаются в downloadsпапка. Проверьте это и извлеките установку tar, используя следующие команды.
$ cd /go/to/download/path
$ tar -zxf jdk-8u60-linux-x64.gz
Шаг 1.3: перейдите в каталог opt
Чтобы сделать Java доступной для всех пользователей, переместите извлеченное содержимое Java в папку «/ usr / local / java».
$ su
password: (type password of root user)
$ mkdir /opt/jdk $ mv jdk-1.8.0_60 /opt/jdk/
Шаг 1.4: Установите путь
Чтобы установить путь и переменные JAVA_HOME, добавьте следующие команды в файл ~ / .bashrc.
export JAVA_HOME = /usr/jdk/jdk-1.8.0_60
export PATH=$PATH:$JAVA_HOME/bin
Теперь примените все изменения к текущей работающей системе.
$ source ~/.bashrc
Шаг 1.5: альтернативы Java
Используйте следующую команду, чтобы изменить альтернативы Java.
update-alternatives --install /usr/bin/java java /opt/jdk/jdk1.8.0_60/bin/java 100
Шаг 1.6
Проверьте установку Java с помощью команды проверки (java -version) объяснено в шаге 1.
Шаг 2: Установка ZooKeeper Framework
Шаг 2.1: Загрузите ZooKeeper
Чтобы установить ZooKeeper framework на свой компьютер, перейдите по следующей ссылке и загрузите последнюю версию ZooKeeper. http://zookeeper.apache.org/releases.html
На данный момент последняя версия ZooKeeper - 3.4.6 (ZooKeeper-3.4.6.tar.gz).
Шаг 2.2: Извлеките tar-файл
Извлеките файл tar, используя следующие команды -
$ cd opt/
$ tar -zxf zookeeper-3.4.6.tar.gz $ cd zookeeper-3.4.6
$ mkdir data
Шаг 2.3: Создайте файл конфигурации
Откройте файл конфигурации с именем conf/zoo.cfg используя команду vi conf/zoo.cfg и все следующие параметры установить в качестве отправной точки.
$ vi conf/zoo.cfg
tickTime = 2000
dataDir = /path/to/zookeeper/data
clientPort = 2181
initLimit = 5
syncLimit = 2
После успешного сохранения файла конфигурации снова вернитесь в терминал. Теперь вы можете запустить сервер zookeeper.
Шаг 2.4: Запустите сервер ZooKeeper
Выполните следующую команду -
$ bin/zkServer.sh start
После выполнения этой команды вы получите следующий ответ:
$ JMX enabled by default
$ Using config: /Users/../zookeeper-3.4.6/bin/../conf/zoo.cfg $ Starting zookeeper ... STARTED
Шаг 2.5: Запустите CLI
Введите следующую команду -
$ bin/zkCli.sh
После ввода указанной выше команды вы будете подключены к серверу ZooKeeper и получите следующий ответ.
Connecting to localhost:2181
................
................
................
Welcome to ZooKeeper!
................
................
WATCHER::
WatchedEvent state:SyncConnected type: None path:null
[zk: localhost:2181(CONNECTED) 0]
Остановить сервер ZooKeeper
После подключения сервера и выполнения всех операций вы можете остановить сервер zookeeper, используя следующую команду.
$ bin/zkServer.sh stop
Интерфейс командной строки (CLI) ZooKeeper используется для взаимодействия с ансамблем ZooKeeper в целях разработки. Это полезно для отладки и работы с различными параметрами.
Для выполнения операций интерфейса командной строки ZooKeeper сначала включите сервер ZooKeeper ( «bin / zkServer.sh start» ), а затем клиент ZooKeeper ( «bin / zkCli.sh» ). После запуска клиента вы можете выполнить следующую операцию -
- Создать znodes
- Получить данные
- Следите за изменениями в znode
- Установить данные
- Создайте дочерние элементы znode
- Список дочерних элементов znode
- Проверить состояние
- Удалить / Удалить znode
Теперь давайте посмотрим на приведенную выше команду одну за другой на примере.
Создать Znodes
Создайте znode с заданным путем. ВflagАргумент указывает, будет ли созданный znode эфемерным, постоянным или последовательным. По умолчанию все znodes постоянны.
Ephemeral znodes (флаг: e) будет автоматически удален по истечении сеанса или при отключении клиента.
Sequential znodes гарантия того, что путь znode будет уникальным.
Ансамбль ZooKeeper добавит порядковый номер вместе с 10-значным заполнением к пути znode. Например, путь znode / myapp будет преобразован в / myapp0000000001, а следующим порядковым номером будет / myapp0000000002 . Если флаги не указаны, то znode считаетсяpersistent.
Синтаксис
create /path /data
Образец
create /FirstZnode “Myfirstzookeeper-app”
Вывод
[zk: localhost:2181(CONNECTED) 0] create /FirstZnode “Myfirstzookeeper-app”
Created /FirstZnode
Чтобы создать Sequential znode, Добавить -s flag как показано ниже.
Синтаксис
create -s /path /data
Образец
create -s /FirstZnode second-data
Вывод
[zk: localhost:2181(CONNECTED) 2] create -s /FirstZnode “second-data”
Created /FirstZnode0000000023
Чтобы создать Ephemeral Znode, Добавить -e flag как показано ниже.
Синтаксис
create -e /path /data
Образец
create -e /SecondZnode “Ephemeral-data”
Вывод
[zk: localhost:2181(CONNECTED) 2] create -e /SecondZnode “Ephemeral-data”
Created /SecondZnode
Помните, что при потере клиентского соединения эфемерный znode будет удален. Вы можете попробовать это, выйдя из ZooKeeper CLI, а затем снова открыв CLI.
Получить данные
Он возвращает связанные данные znode и метаданные указанного znode. Вы получите такую информацию, как время последнего изменения данных, место его изменения и информацию о данных. Этот интерфейс командной строки также используется для назначения часов для отображения уведомлений о данных.
Синтаксис
get /path
Образец
get /FirstZnode
Вывод
[zk: localhost:2181(CONNECTED) 1] get /FirstZnode
“Myfirstzookeeper-app”
cZxid = 0x7f
ctime = Tue Sep 29 16:15:47 IST 2015
mZxid = 0x7f
mtime = Tue Sep 29 16:15:47 IST 2015
pZxid = 0x7f
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 22
numChildren = 0
Чтобы получить доступ к последовательному znode, вы должны ввести полный путь к znode.
Образец
get /FirstZnode0000000023
Вывод
[zk: localhost:2181(CONNECTED) 1] get /FirstZnode0000000023
“Second-data”
cZxid = 0x80
ctime = Tue Sep 29 16:25:47 IST 2015
mZxid = 0x80
mtime = Tue Sep 29 16:25:47 IST 2015
pZxid = 0x80
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 13
numChildren = 0
Часы
Часы показывают уведомление при изменении данных указанного znode или дочерних znode. Вы можете установитьwatch только в get команда.
Синтаксис
get /path [watch] 1
Образец
get /FirstZnode 1
Вывод
[zk: localhost:2181(CONNECTED) 1] get /FirstZnode 1
“Myfirstzookeeper-app”
cZxid = 0x7f
ctime = Tue Sep 29 16:15:47 IST 2015
mZxid = 0x7f
mtime = Tue Sep 29 16:15:47 IST 2015
pZxid = 0x7f
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 22
numChildren = 0
Вывод похож на обычный getкоманда, но она будет ждать изменений znode в фоновом режиме. <Начать здесь>
Установить данные
Установите данные указанного znode. После завершения этой операции установки вы можете проверить данные с помощьюget Команда CLI.
Синтаксис
set /path /data
Образец
set /SecondZnode Data-updated
Вывод
[zk: localhost:2181(CONNECTED) 1] get /SecondZnode “Data-updated”
cZxid = 0x82
ctime = Tue Sep 29 16:29:50 IST 2015
mZxid = 0x83
mtime = Tue Sep 29 16:29:50 IST 2015
pZxid = 0x82
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x15018b47db00000
dataLength = 14
numChildren = 0
Если вы назначили watch вариант в get (как в предыдущей команде), то вывод будет аналогичен показанному ниже -
Вывод
[zk: localhost:2181(CONNECTED) 1] get /FirstZnode “Mysecondzookeeper-app”
WATCHER: :
WatchedEvent state:SyncConnected type:NodeDataChanged path:/FirstZnode
cZxid = 0x7f
ctime = Tue Sep 29 16:15:47 IST 2015
mZxid = 0x84
mtime = Tue Sep 29 17:14:47 IST 2015
pZxid = 0x7f
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 23
numChildren = 0
Создать дочерний / подузел
Создание дочерних элементов похоже на создание новых узлов. Единственная разница в том, что путь дочернего znode также будет иметь родительский путь.
Синтаксис
create /parent/path/subnode/path /data
Образец
create /FirstZnode/Child1 firstchildren
Вывод
[zk: localhost:2181(CONNECTED) 16] create /FirstZnode/Child1 “firstchildren”
created /FirstZnode/Child1
[zk: localhost:2181(CONNECTED) 17] create /FirstZnode/Child2 “secondchildren”
created /FirstZnode/Child2
Список детей
Эта команда используется для вывода списка и отображения children знод.
Синтаксис
ls /path
Образец
ls /MyFirstZnode
Вывод
[zk: localhost:2181(CONNECTED) 2] ls /MyFirstZnode
[mysecondsubnode, myfirstsubnode]
Проверить состояние
Statusописывает метаданные указанного znode. Он содержит такие сведения, как отметка времени, номер версии, ACL, длина данных и дочерний узел.
Синтаксис
stat /path
Образец
stat /FirstZnode
Вывод
[zk: localhost:2181(CONNECTED) 1] stat /FirstZnode
cZxid = 0x7f
ctime = Tue Sep 29 16:15:47 IST 2015
mZxid = 0x7f
mtime = Tue Sep 29 17:14:24 IST 2015
pZxid = 0x7f
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 23
numChildren = 0
Удалить Znode
Удаляет указанный znode и рекурсивно всех его дочерних узлов. Это могло бы произойти, только если бы такой znode был доступен.
Синтаксис
rmr /path
Образец
rmr /FirstZnode
Вывод
[zk: localhost:2181(CONNECTED) 10] rmr /FirstZnode
[zk: localhost:2181(CONNECTED) 11] get /FirstZnode
Node does not exist: /FirstZnode
удалять (delete /path) команда похожа на remove команда, за исключением того факта, что она работает только на узлах без дочерних узлов.
ZooKeeper имеет официальную привязку API для Java и C. Сообщество ZooKeeper предоставляет неофициальный API для большинства языков (.NET, python и т. Д.). Используя ZooKeeper API, приложение может подключаться, взаимодействовать, манипулировать данными, координировать и, наконец, отключаться от ансамбля ZooKeeper.
ZooKeeper API имеет богатый набор функций для простого и безопасного использования всех функций ансамбля ZooKeeper. ZooKeeper API предоставляет как синхронные, так и асинхронные методы.
Ансамбль ZooKeeper и ZooKeeper API полностью дополняют друг друга во всех аспектах, и это приносит большую пользу разработчикам. Давайте обсудим привязку Java в этой главе.
Основы ZooKeeper API
Приложение, взаимодействующее с ансамблем ZooKeeper, называется ZooKeeper Client или просто Client.
Znode является основным компонентом ансамбля ZooKeeper, а ZooKeeper API предоставляет небольшой набор методов для управления всеми деталями znode с помощью ансамбля ZooKeeper.
Клиент должен следовать приведенным ниже инструкциям, чтобы иметь четкое и чистое взаимодействие с ансамблем ZooKeeper.
Присоединяйтесь к ансамблю ZooKeeper. Ансамбль ZooKeeper присваивает клиенту идентификатор сеанса.
Периодически отправляйте контрольные сообщения на сервер. В противном случае у ансамбля ZooKeeper истекает срок действия идентификатора сеанса, и клиенту необходимо повторно подключиться.
Получить / установить znodes, пока активен идентификатор сеанса.
Отключитесь от ансамбля ZooKeeper, как только все задачи будут выполнены. Если клиент неактивен в течение длительного времени, ансамбль ZooKeeper автоматически отключит его.
Связывание Java
Давайте разберемся с наиболее важным набором ZooKeeper API в этой главе. Центральная часть ZooKeeper API - этоZooKeeper class. Он предоставляет параметры для подключения ансамбля ZooKeeper в своем конструкторе и имеет следующие методы:
connect - подключиться к ансамблю ZooKeeper
create - создать znode
exists - проверить, существует ли znode и его информацию
getData - получить данные из определенного znode
setData - установить данные в определенном узле
getChildren - получить все подузлы, доступные в конкретном znode
delete - получить конкретный znode и всех его потомков
close - закрыть соединение
Подключитесь к ансамблю ZooKeeper
Класс ZooKeeper предоставляет функциональные возможности подключения через свой конструктор. Подпись конструктора следующая -
ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher)
Где,
connectionString - Ведущий ансамбля ZooKeeper.
sessionTimeout - тайм-аут сеанса в миллисекундах.
watcher- объект, реализующий интерфейс «Наблюдатель». Ансамбль ZooKeeper возвращает статус соединения через объект-наблюдатель.
Давайте создадим новый вспомогательный класс ZooKeeperConnection и добавить метод connect. Вconnect создает объект ZooKeeper, подключается к ансамблю ZooKeeper, а затем возвращает объект.
Вот CountDownLatch используется для остановки (ожидания) основного процесса, пока клиент не подключится к ансамблю ZooKeeper.
Ансамбль ZooKeeper отвечает на статус подключения через Watcher callback. Обратный вызов Watcher будет вызываться, когда клиент подключится к ансамблю ZooKeeper, а обратный вызов Watcher вызываетcountDown метод CountDownLatch снять блокировку, await в основном процессе.
Вот полный код для подключения к ансамблю ZooKeeper.
Кодирование: ZooKeeperConnection.java
// import java classes
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
// import zookeeper classes
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.AsyncCallback.StatCallback;
import org.apache.zookeeper.KeeperException.Code;
import org.apache.zookeeper.data.Stat;
public class ZooKeeperConnection {
// declare zookeeper instance to access ZooKeeper ensemble
private ZooKeeper zoo;
final CountDownLatch connectedSignal = new CountDownLatch(1);
// Method to connect zookeeper ensemble.
public ZooKeeper connect(String host) throws IOException,InterruptedException {
zoo = new ZooKeeper(host,5000,new Watcher() {
public void process(WatchedEvent we) {
if (we.getState() == KeeperState.SyncConnected) {
connectedSignal.countDown();
}
}
});
connectedSignal.await();
return zoo;
}
// Method to disconnect from zookeeper server
public void close() throws InterruptedException {
zoo.close();
}
}
Сохраните приведенный выше код, и он будет использован в следующем разделе для подключения ансамбля ZooKeeper.
Создать Znode
Класс ZooKeeper предоставляет create methodдля создания нового znode в ансамбле ZooKeeper. Подписьcreate метод выглядит следующим образом -
create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
Где,
path- Знодейский путь. Например, / myapp1, / myapp2, / myapp1 / mydata1, myapp2 / mydata1 / myanothersubdata
data - данные для хранения по указанному пути znode
acl- список контроля доступа создаваемого узла. ZooKeeper API предоставляет статический интерфейсZooDefs.Idsчтобы получить базовый список ACL. Например, ZooDefs.Ids.OPEN_ACL_UNSAFE возвращает список acl для открытых znodes.
createMode- тип узла: эфемерный, последовательный или и то, и другое. Этоenum.
Давайте создадим новое приложение Java, чтобы проверить createфункциональность ZooKeeper API. Создать файлZKCreate.java. В основном методе создайте объект типаZooKeeperConnection и позвонить в connect способ подключения к ансамблю ZooKeeper.
Метод подключения вернет объект ZooKeeper zk. Теперь позвоните вcreate метод zk объект с индивидуальным path и data.
Полный программный код для создания znode выглядит следующим образом:
Кодирование: ZKCreate.java
import java.io.IOException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
public class ZKCreate {
// create static instance for zookeeper class.
private static ZooKeeper zk;
// create static instance for ZooKeeperConnection class.
private static ZooKeeperConnection conn;
// Method to create znode in zookeeper ensemble
public static void create(String path, byte[] data) throws
KeeperException,InterruptedException {
zk.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
}
public static void main(String[] args) {
// znode path
String path = "/MyFirstZnode"; // Assign path to znode
// data in byte array
byte[] data = "My first zookeeper app”.getBytes(); // Declare data
try {
conn = new ZooKeeperConnection();
zk = conn.connect("localhost");
create(path, data); // Create the data to the specified path
conn.close();
} catch (Exception e) {
System.out.println(e.getMessage()); //Catch error message
}
}
}
После того, как приложение скомпилировано и выполнено, в ансамбле ZooKeeper будет создан znode с указанными данными. Вы можете проверить это с помощью ZooKeeper CLIzkCli.sh.
cd /path/to/zookeeper
bin/zkCli.sh
>>> get /MyFirstZnode
Exists - проверьте наличие Znode
Класс ZooKeeper предоставляет exists methodчтобы проверить наличие znode. Он возвращает метаданные znode, если указанный znode существует. Подписьexists метод выглядит следующим образом -
exists(String path, boolean watcher)
Где,
path - Знодейский путь
watcher - логическое значение, чтобы указать, смотреть ли указанный znode или нет
Давайте создадим новое приложение Java, чтобы проверить «существует» функциональность ZooKeeper API. Создайте файл «ZKExists.java» . В основном методе создайте объект ZooKeeper, «zk», используя объект «ZooKeeperConnection» . Затем вызовите метод «существует» объекта «zk» с настраиваемым «путем» . Полный список выглядит следующим образом -
Кодирование: ZKExists.java
import java.io.IOException;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.data.Stat;
public class ZKExists {
private static ZooKeeper zk;
private static ZooKeeperConnection conn;
// Method to check existence of znode and its status, if znode is available.
public static Stat znode_exists(String path) throws
KeeperException,InterruptedException {
return zk.exists(path, true);
}
public static void main(String[] args) throws InterruptedException,KeeperException {
String path = "/MyFirstZnode"; // Assign znode to the specified path
try {
conn = new ZooKeeperConnection();
zk = conn.connect("localhost");
Stat stat = znode_exists(path); // Stat checks the path of the znode
if(stat != null) {
System.out.println("Node exists and the node version is " +
stat.getVersion());
} else {
System.out.println("Node does not exists");
}
} catch(Exception e) {
System.out.println(e.getMessage()); // Catches error messages
}
}
}
После того, как приложение скомпилировано и выполнено, вы получите следующий результат.
Node exists and the node version is 1.
getData Метод
Класс ZooKeeper предоставляет getDataдля получения данных, вложенных в указанный znode, и его статуса. ПодписьgetData метод выглядит следующим образом -
getData(String path, Watcher watcher, Stat stat)
Где,
path - Знодейский путь.
watcher - Функция обратного вызова типа Watcher. Ансамбль ZooKeeper будет уведомлять через обратный вызов Watcher, когда данные указанного znode изменяются. Это разовое уведомление.
stat - Возвращает метаданные znode.
Давайте создадим новое приложение Java, чтобы понять getDataфункциональность ZooKeeper API. Создать файлZKGetData.java. В основном методе создайте объект ZooKeeperzk используя он ZooKeeperConnectionобъект. Затем позвоните вgetData метод объекта zk с настраиваемым путем.
Вот полный программный код для получения данных из указанного узла:
Кодирование: ZKGetData.java
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.data.Stat;
public class ZKGetData {
private static ZooKeeper zk;
private static ZooKeeperConnection conn;
public static Stat znode_exists(String path) throws
KeeperException,InterruptedException {
return zk.exists(path,true);
}
public static void main(String[] args) throws InterruptedException, KeeperException {
String path = "/MyFirstZnode";
final CountDownLatch connectedSignal = new CountDownLatch(1);
try {
conn = new ZooKeeperConnection();
zk = conn.connect("localhost");
Stat stat = znode_exists(path);
if(stat != null) {
byte[] b = zk.getData(path, new Watcher() {
public void process(WatchedEvent we) {
if (we.getType() == Event.EventType.None) {
switch(we.getState()) {
case Expired:
connectedSignal.countDown();
break;
}
} else {
String path = "/MyFirstZnode";
try {
byte[] bn = zk.getData(path,
false, null);
String data = new String(bn,
"UTF-8");
System.out.println(data);
connectedSignal.countDown();
} catch(Exception ex) {
System.out.println(ex.getMessage());
}
}
}
}, null);
String data = new String(b, "UTF-8");
System.out.println(data);
connectedSignal.await();
} else {
System.out.println("Node does not exists");
}
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
Когда приложение скомпилировано и выполнено, вы получите следующий результат
My first zookeeper app
И приложение будет ждать дальнейшего уведомления от ансамбля ZooKeeper. Измените данные указанного znode с помощью ZooKeeper CLIzkCli.sh.
cd /path/to/zookeeper
bin/zkCli.sh
>>> set /MyFirstZnode Hello
Теперь приложение напечатает следующий вывод и завершит работу.
Hello
setData Метод
Класс ZooKeeper предоставляет setDataдля изменения данных, вложенных в указанный znode. ПодписьsetData метод выглядит следующим образом -
setData(String path, byte[] data, int version)
Где,
path - Знодейский путь
data - данные для хранения по указанному пути znode.
version- Текущая версия znode. ZooKeeper обновляет номер версии znode при изменении данных.
Давайте теперь создадим новое приложение Java, чтобы понять setDataфункциональность ZooKeeper API. Создать файлZKSetData.java. В основном методе создайте объект ZooKeeperzk используя ZooKeeperConnectionобъект. Затем позвоните вsetData метод zk объект с указанным путем, новыми данными и версией узла.
Вот полный программный код для изменения данных, прикрепленных в указанном znode.
Код: ZKSetData.java
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import java.io.IOException;
public class ZKSetData {
private static ZooKeeper zk;
private static ZooKeeperConnection conn;
// Method to update the data in a znode. Similar to getData but without watcher.
public static void update(String path, byte[] data) throws
KeeperException,InterruptedException {
zk.setData(path, data, zk.exists(path,true).getVersion());
}
public static void main(String[] args) throws InterruptedException,KeeperException {
String path= "/MyFirstZnode";
byte[] data = "Success".getBytes(); //Assign data which is to be updated.
try {
conn = new ZooKeeperConnection();
zk = conn.connect("localhost");
update(path, data); // Update znode data to the specified path
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
После того, как приложение скомпилировано и выполнено, данные указанного znode будут изменены, и их можно будет проверить с помощью ZooKeeper CLI, zkCli.sh.
cd /path/to/zookeeper
bin/zkCli.sh
>>> get /MyFirstZnode
getChildrenMethod
Класс ZooKeeper предоставляет getChildrenдля получения всех подузлов конкретного znode. ПодписьgetChildren метод выглядит следующим образом -
getChildren(String path, Watcher watcher)
Где,
path - Знодейский путь.
watcher- Функция обратного вызова типа «Наблюдатель». Ансамбль ZooKeeper будет уведомлять, когда указанный znode будет удален или дочерний элемент под znode будет создан / удален. Это разовое уведомление.
Кодирование: ZKGetChildren.java
import java.io.IOException;
import java.util.*;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.data.Stat;
public class ZKGetChildren {
private static ZooKeeper zk;
private static ZooKeeperConnection conn;
// Method to check existence of znode and its status, if znode is available.
public static Stat znode_exists(String path) throws
KeeperException,InterruptedException {
return zk.exists(path,true);
}
public static void main(String[] args) throws InterruptedException,KeeperException {
String path = "/MyFirstZnode"; // Assign path to the znode
try {
conn = new ZooKeeperConnection();
zk = conn.connect("localhost");
Stat stat = znode_exists(path); // Stat checks the path
if(stat!= null) {
//“getChildren” method- get all the children of znode.It has two
args, path and watch
List <String> children = zk.getChildren(path, false);
for(int i = 0; i < children.size(); i++)
System.out.println(children.get(i)); //Print children's
} else {
System.out.println("Node does not exists");
}
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
Перед запуском программы создадим два подузла для /MyFirstZnode используя ZooKeeper CLI, zkCli.sh.
cd /path/to/zookeeper
bin/zkCli.sh
>>> create /MyFirstZnode/myfirstsubnode Hi
>>> create /MyFirstZnode/mysecondsubmode Hi
Теперь при компиляции и запуске программы будут выведены созданные выше znodes.
myfirstsubnode
mysecondsubnode
Удалить Znode
Класс ZooKeeper предоставляет deleteметод удаления указанного znode. Подписьdelete метод выглядит следующим образом -
delete(String path, int version)
Где,
path - Знодейский путь.
version - Текущая версия znode.
Давайте создадим новое приложение Java, чтобы понять deleteфункциональность ZooKeeper API. Создать файлZKDelete.java. В основном методе создайте объект ZooKeeperzk с помощью ZooKeeperConnectionобъект. Затем позвоните вdelete метод zk объект с указанным path и версия узла.
Полный программный код для удаления znode выглядит следующим образом:
Кодирование: ZKDelete.java
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
public class ZKDelete {
private static ZooKeeper zk;
private static ZooKeeperConnection conn;
// Method to check existence of znode and its status, if znode is available.
public static void delete(String path) throws KeeperException,InterruptedException {
zk.delete(path,zk.exists(path,true).getVersion());
}
public static void main(String[] args) throws InterruptedException,KeeperException {
String path = "/MyFirstZnode"; //Assign path to the znode
try {
conn = new ZooKeeperConnection();
zk = conn.connect("localhost");
delete(path); //delete the node with the specified path
} catch(Exception e) {
System.out.println(e.getMessage()); // catches error messages
}
}
}
Zookeeper предоставляет гибкую инфраструктуру координации для распределенной среды. Платформа ZooKeeper поддерживает многие из лучших на сегодняшний день промышленных приложений. В этой главе мы обсудим некоторые из наиболее заметных приложений ZooKeeper.
Yahoo!
Фреймворк ZooKeeper изначально создавался на Yahoo! Хорошо спроектированное распределенное приложение должно отвечать таким требованиям, как прозрачность данных, лучшая производительность, надежность, централизованная конфигурация и координация. Итак, они разработали фреймворк ZooKeeper для удовлетворения этих требований.
Apache Hadoop
Apache Hadoop - движущая сила роста индустрии больших данных. Hadoop полагается на ZooKeeper для управления конфигурацией и координации. Давайте рассмотрим сценарий, чтобы понять роль ZooKeeper в Hadoop.
Предположим, что a Hadoop cluster мосты 100 or more commodity servers. Следовательно, существует потребность в услугах по координации и именованию. Поскольку задействованы вычисления большого количества узлов, каждый узел должен синхронизироваться друг с другом, знать, где получить доступ к службам, и знать, как они должны быть настроены. На данный момент кластерам Hadoop требуются межузловые сервисы. ZooKeeper предоставляет возможности дляcross-node synchronization и обеспечивает сериализацию и синхронизацию задач в проектах Hadoop.
Несколько серверов ZooKeeper поддерживают большие кластеры Hadoop. Каждый клиентский компьютер связывается с одним из серверов ZooKeeper для получения и обновления информации о синхронизации. Некоторые из примеров в реальном времени -
Human Genome Project- Проект "Геном человека" содержит терабайты данных. Каркас Hadoop MapReduce можно использовать для анализа набора данных и поиска интересных фактов для человеческого развития.
Healthcare - Больницы могут хранить, извлекать и анализировать огромные наборы медицинских карт пациентов, обычно в терабайтах.
Apache HBase
Apache HBase - это распределенная база данных NoSQL с открытым исходным кодом, используемая для доступа чтения / записи в реальном времени к большим наборам данных и работающая поверх HDFS. HBase следуетmaster-slave architectureгде HBase Master управляет всеми подчиненными. Рабы упоминаются какRegion servers.
Установка распределенного приложения HBase зависит от работающего кластера ZooKeeper. Apache HBase использует ZooKeeper для отслеживания состояния распределенных данных на главном и региональном серверах с помощьюcentralized configuration management и distributed mutexмеханизмы. Вот некоторые из вариантов использования HBase -
Telecom- В телекоммуникационной отрасли хранятся миллиарды записей мобильных вызовов (около 30 ТБ / месяц), и доступ к этим записям вызовов в режиме реального времени становится огромной задачей. HBase можно использовать для простой и эффективной обработки всех записей в реальном времени.
Social network- Подобно телекоммуникационной отрасли, такие сайты, как Twitter, LinkedIn и Facebook, получают огромные объемы данных через сообщения, созданные пользователями. HBase можно использовать для поиска последних тенденций и других интересных фактов.
Apache Solr
Apache Solr - это быстрая поисковая платформа с открытым исходным кодом, написанная на Java. Это невероятно быстрая и отказоустойчивая распределенная поисковая система. Построен на вершинеLucene, это высокопроизводительная полнофункциональная система текстового поиска.
Solr широко использует все функции ZooKeeper, такие как управление конфигурацией, выборы лидера, управление узлами, блокировка и синхронизация данных.
Solr состоит из двух частей: indexing и searching. Индексирование - это процесс сохранения данных в надлежащем формате, чтобы их можно было найти позже. Solr использует ZooKeeper как для индексации данных на нескольких узлах, так и для поиска на нескольких узлах. ZooKeeper предоставляет следующие функции -
Добавляйте / удаляйте узлы по мере необходимости
Репликация данных между узлами с последующим минимизацией потери данных
Обмен данными между несколькими узлами и последующий поиск на нескольких узлах для более быстрых результатов поиска
Некоторые из вариантов использования Apache Solr включают электронную коммерцию, поиск работы и т. Д.