Работа с znodes
Шаг 1. Создание znode
Для создания узла znode используйте команду create
, после которой определите полный путь к новому znode, а затем введите данные для сохранения в этом znode. Существуют следующие типы znode (при их создании могут потребоваться дополнительные флаги в команде create
):
-
Постоянный (persistent). Команда
create
не требует дополнительного флага (тип по умолчанию):create /z_persistent "Test configuration"
Вывод на экран:
Created /z_persistent
-
Последовательный (sequential). Используйте флаг
-s
после ключевого словаcreate
:create -s /z_sequential "Test configuration 2"
ПРИМЕЧАНИЕZooKeeper добавляет 10-значный постфикс к заданному названию znode. Это изменение гарантирует уникальность названия последовательного znode.
Вывод на экран:
Created /z_sequential0000000007
-
Эфемерный (ephemeral). Используйте флаг
-e
после ключевого словаcreate
:create -e /z_ephemeral "Test configuration 3"
Вывод на экран:
Created /z_ephemeral
Шаг 2. Получение данных znode
Для получения данных от заданного znode воспользуйтесь командой get
и укажите полный путь к znode:
get /z_persistent
Вывод на экран содержит не только данные, хранимые в указанном znode, но также его метаданные из структуры stat:
Test configuration cZxid = 0x2000000019 ctime = Wed Dec 15 11:15:27 UTC 2021 mZxid = 0x2000000019 mtime = Wed Dec 15 11:15:27 UTC 2021 pZxid = 0x2000000019 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 18 numChildren = 0
Ниже приведены примеры получения данных от двух других znodes.
ВАЖНО
|
[zk: localhost:2181(CONNECTED) 7]get /z_sequential0000000007 Test configuration 2 cZxid = 0x200000001c ctime = Wed Dec 15 11:17:47 UTC 2021 mZxid = 0x200000001c mtime = Wed Dec 15 11:17:47 UTC 2021 pZxid = 0x200000001c cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 20 numChildren = 0 [zk: localhost:2181(CONNECTED) 8]get /z_ephemeral Test configuration 3 cZxid = 0x200000001d ctime = Wed Dec 15 11:18:35 UTC 2021 mZxid = 0x200000001d mtime = Wed Dec 15 11:18:35 UTC 2021 pZxid = 0x200000001d cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x100005560090006 dataLength = 20 numChildren = 0
ПРИМЕЧАНИЕ
Начиная с версии ZooKeeper 3.5 команда get /znode не выводит данные о znode для нод-контейнеров.
В этом случае используйте команду get -s /znode .
|
Шаг 3. Запись данных в znode
Для обновления данных в заданном znode введите команду set
, полный путь к этому znode и затем данные для сохранения:
set /z_persistent "The test configuration has been updated with the command set"
Пример вывода:
cZxid = 0x2000000019 ctime = Wed Dec 15 11:15:27 UTC 2021 mZxid = 0x200000001e mtime = Wed Dec 15 11:24:46 UTC 2021 pZxid = 0x2000000019 cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 60 numChildren = 0
После этого команда get
вернет обновленные данные из znode:
get /z_persistent
Вывод на экран:
The test configuration has been updated with the command set cZxid = 0x2000000019 ctime = Wed Dec 15 11:15:27 UTC 2021 mZxid = 0x200000001e mtime = Wed Dec 15 11:24:46 UTC 2021 pZxid = 0x2000000020 cversion = 2 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 60 numChildren = 2
Шаг 4. Создание дочерних узлов znode
Для добавления дочерних узлов к определенному znode используйте стандартную команду create
и задайте путь к родительскому узлу вместо корневого пути /
:
create /z_persistent/child1 "Test child 1"
Приведенные ниже примеры команд создают дочерние узлы в родительском узле z_persistent
:
-
Создайте первый дочерний узел:
create /z_persistent/child1 "Test child 1"
Вывод на экран:
Created /z_persistent/child1
-
Создайте второй дочерний узел:
create /z_persistent/child2 "Test child 2"
Вывод на экран:
Created /z_persistent/child2
Шаг 5. Получение списка дочерних узлов для определенного znode
Чтобы получить список дочерних узлов для определенного znode, введите команду ls
и после нее укажите полный путь к родительскому znode:
ls /z_persistent
Вывод на экран:
[child2, child1]
Для получения списка дочерних узлов корневого узла используйте путь /
:
ls /
Полученный список:
[zookeeper, Arenadata.Hadoop-1.solr.server, z_sequential0000000007, hadoop-ha, z_ephemeral, hbase, z_persistent]
Кроме того, можно использовать команду ls2
для получения не только списка дочерних узлов заданного znode, но также и его метаданных.
ls2 /
Вывод на экран:
[zookeeper, Arenadata.Hadoop-1.solr.server, hadoop-ha, z_ephemeral, z_sequential0000000007, hbase, z_persistent] cZxid = 0x0 ctime = Thu Jan 01 00:00:00 UTC 1970 mZxid = 0x0 mtime = Thu Jan 01 00:00:00 UTC 1970 pZxid = 0x2000000030 cversion = 17 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 7
Шаг 6. Получение метаданных znode
Для получения метаданных заданного znode, входящих в структуру stat, введите команду stat
и полный путь к этому znode. В отличие от команды get
, вывод содержит метаданные, но не сами данные:
stat /z_persistent
Вывод на экран:
cZxid = 0x2000000019 ctime = Wed Dec 15 11:15:27 UTC 2021 mZxid = 0x200000001e mtime = Wed Dec 15 11:24:46 UTC 2021 pZxid = 0x2000000020 cversion = 2 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 60 numChildren = 2 [zk: localhost:2181(CONNECTED) 15] stat /z_sequential0000000007 cZxid = 0x200000001c ctime = Wed Dec 15 11:17:47 UTC 2021 mZxid = 0x200000001c mtime = Wed Dec 15 11:17:47 UTC 2021 pZxid = 0x200000001c cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 20 numChildren = 0 [zk: localhost:2181(CONNECTED) 16] stat /z_ephemeral cZxid = 0x200000001d ctime = Wed Dec 15 11:18:35 UTC 2021 mZxid = 0x200000001d mtime = Wed Dec 15 11:18:35 UTC 2021 pZxid = 0x200000001d cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x100005560090006 dataLength = 20 numChildren = 0
Шаг 7. Наблюдение за изменениями в znode
Средства наблюдения в ZooKeeper позволяют клиенту получать уведомления об изменениях в наблюдаемых узлах. Добавьте watch с помощью команды get
и дополнительного аргумента, задающего название watcher.
РЕКОМЕНДАЦИЯ
Можно добавлять watch с помощью команд: |
get /z_persistent 1
Вывод на экран такой же, как и при обычном вызове команды get
:
The test configuration has been updated with the command set cZxid = 0x2000000019 ctime = Wed Dec 15 11:15:27 UTC 2021 mZxid = 0x200000001e mtime = Wed Dec 15 11:24:46 UTC 2021 pZxid = 0x2000000020 cversion = 2 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 60 numChildren = 2
Теперь проверьте настройку, изменив данные в узле с помощью команды set
:
set /z_persistent "Updated"
Вывод на экран содержит не только обычный вывод этой команды, но также уведомление, сообщающее клиенту о произошедшем изменении в налюдаемом znode:
WATCHER:: WatchedEvent state:SyncConnected type:NodeDataChanged path:/z_persistent cZxid = 0x2000000019 ctime = Wed Dec 15 11:15:27 UTC 2021 mZxid = 0x2000000021 mtime = Wed Dec 15 11:37:02 UTC 2021 pZxid = 0x2000000020 cversion = 2 dataVersion = 2 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 7 numChildren = 2
Учитывайте, что каждый watch срабатывает только один раз. При следующем выполнении команды set
уведомление не будет послано, если клиент не настроит новый watch перед выполнением этой команды.
[zk: localhost:2181(CONNECTED) 24] set /z_persistent "Updated 2" cZxid = 0x2000000019 ctime = Wed Dec 15 11:15:27 UTC 2021 mZxid = 0x2000000022 mtime = Wed Dec 15 11:37:51 UTC 2021saying pZxid = 0x2000000020 cversion = 2 dataVersion = 3 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 9 numChildren = 2
Шаг 8. Удаление znode
Для окончательного удаления znode введите команду rmr
и после нее путь к этому узлу.
rmr /z_persistent
Если теперь попробовать получить данные от znode, которого уже нет, или его дочерних узлов, вывод на экран будет свидетельствовать о его удалении:
-
Проверка родительского узла:
get /z_persistent
Вывод на экран:
Node does not exist: /z_persistent
-
Проверка дочернего узла:
get /z_persistent/child1
Вывод на экран:
Node does not exist: /z_persistent/child1
В завершение проверьте автоматическое удаление эфемерных узлов при закрытии соединения с клиентом. Для этого закройте текущий сеанс с помощью команды quit
и начните новый сеанс с помощью скрипта zkCli.sh. После этого командой ls /
проверьте список дочерних узлов корневого znode. Вы получите следующий результат:
-
Постоянный znode
/z_persistent
удален, так как мы удалили его ранее. -
Последовательный znode
/z_sequential0000000007
доступен. -
Эфемерный znode
/z_ephemeral
удален автоматически.
ls /
Вывод на экран:
[zookeeper, Arenadata.Hadoop-1.solr.server, z_sequential0000000007, hadoop-ha, hbase]