ZooKeeper: пространство имен и операции

Модель данных ZooKeeper:

ZooKeeper имеет иерархическое пространство имен (как показано ниже), очень похожее на распределенную файловую систему. Единственное отличие состоит в том, что каждый узел в пространстве имен может иметь связанные с ним данные, а также дочерние элементы. Это похоже на наличие файловой системы, которая позволяет файлу также быть каталогом.

Корневой узел содержит еще четыре узла, и три из этих узлов имеют подчиненные узлы. Листовые узлы — это данные.

Znode:

Каждый узел в дереве ZooKeeper называется znode.Znodes поддерживают структуру статистики, которая включает номера версий для изменений данных, изменений ACL. Структура статистики также имеет метки времени. Номер версии вместе с отметкой времени позволяет ZooKeeper проверять кэш и координировать обновления. Каждый раз, когда данные znode изменяются, номер версии увеличивается.

Znodes может содержать или не содержать данные. Если znode содержит какие-либо данные, данные сохраняются в виде массива байтов. Точный формат массива байтов зависит от каждого приложения, и ZooKeeper не поддерживает его анализ напрямую. Отсутствие данных часто передает важную информацию о znode. Например: - в типичном приложении master-worker отсутствие master znode означает, что в данный момент мастер не выбран.

API ZooKeeper предоставляет следующие операции: create /path data Создает znode с именем /path и содержащий данные.

delete /path Удаляет znode/путь

exists /path Проверяет, существует ли /path

setData /path data Устанавливает данные znode/path в данные

getData /path Возвращает данные в /path

getChildren /path Возвращает список дочерних элементов по /path

Одно важное замечание: ZooKeeper не разрешает частичную запись или чтение данных znode. При установке данных znode или их чтении содержимое znode заменяется или считывается полностью.

Различные режимы Znode:

Znodes могут быть созданы в четырех различных режимах: постоянный, эфемерный, presistent_sequential и ephemeral_sequential.

Постоянные и эфемерные узлы

Znode может быть как постоянным, так и эфемерным. Постоянный znode/path можно удалить только с помощью вызова для удаления. Эфемерный znode, напротив, удаляется, если создавший его клиент выходит из строя или просто закрывает соединение с ZooKeeper.

Постоянные znode полезны, когда znode хранит некоторые данные от имени приложения, и эти данные необходимо сохранять даже после того, как их создатель больше не является частью системы.

Эфемерные зноды передают информацию о каком-то аспекте приложения, которое должно существовать только до тех пор, пока действителен сеанс его создателя.

Последовательные узлы:

Последовательному узлу присваивается уникальное монотонно возрастающее целое число. Этот порядковый номер добавляется к пути, используемому для создания znode. Например, если клиент создает последовательный znode с путем /tasks/task-, ZooKeeper назначает порядковый номер, например 1, и добавляет его к пути. Путь znode становится /tasks/task-1. Последовательные узлы обеспечивают простой способ создания узлов с уникальными именами. Они также позволяют легко увидеть порядок создания znodes.

Версия:

Каждый znode имеет связанный с ним номер версии, который увеличивается при каждом изменении его данных. Пару операций в API можно выполнить условно: setData и delete. Оба вызова принимают версию в качестве входного параметра, и операция завершается успешно только в том случае, если версия, переданная клиентом, совпадает с текущей версией на сервере. Использование версий важно, когда несколько клиентов ZooKeeper могут пытаться выполнять операции над одним и тем же znode.

Смотреть:

Отслеживание — это одноразовая операция, что означает, что оно запускает одно уведомление для любых изменений в znodes. Регистрация для получения уведомления для данного znode состоит из установки часов. Чтобы получать несколько уведомлений с течением времени, клиент должен установить новые часы при получении каждого уведомления.

Доступ к данным:

Данные, хранящиеся на каждом узле в пространстве имен, считываются и записываются атомарно. Чтение получает все байты данных, связанные с znode, а запись заменяет все данные. Каждый узел имеет список управления доступом (ACL), который ограничивает, кто и что может делать.

ZooKeeper не разрабатывался как база данных или хранилище больших объектов. Вместо этого он управляет данными координации. Эти данные могут поступать в виде конфигурации, информации о состоянии, рандеву и т. д.

Семантика часов:

Мы можем установить часы с тремя вызовами, которые считывают состояние ZooKeeper: exists, getData и getChildren. В следующем списке подробно описаны события, которые могут запускать часы, и вызовы, которые их включают:

Created event: Enabled with a call to exists.
Deleted event: Enabled with a call to exists, `getData`, and `getChildren`.
Changed event: Enabled with a call to exists and `getData`.
Child event: Enabled with a call to `getChildren`.

Удалить часы:

Мы можем удалить часы, зарегистрированные на znode, с помощью вызова removeWatches. Кроме того, клиент ZooKeeper может удалять часы локально, даже если нет подключения к серверу, установив для локального флага значение true. В следующем списке подробно описаны события, которые будут запущены после успешного удаления часов.

Child Remove event: Watcher which was added with a call to `getChildren`.
Data Remove event: Watcher which was added with a call to exists or `getData`.

Разрешения ACL:

ZooKeeper поддерживает следующие разрешения:

`CREATE`: you can create a child node
`READ`: you can get data from a node and list its children.
`WRITE`: you can set data for a node
`DELETE`: you can delete a child node
`ADMIN`: you can set permissions