1. Обзор зоопарка, предыстория и роль
зоопарк производит фон:
После преобразования проекта из монолитного в распределенный возникнут проблемы совместной работы между несколькими узлами. Такие как:
- Кто и какой узел выполняет ежедневные запланированные задачи?
- Обнаружение службы во время вызовов RPC?
- Как гарантировать идемпотентность одновременных запросов
- ....
Эти проблемы можно обобщить как проблемы координации нескольких узлов.Это очень ненадежно и нежелательно с точки зрения производительности, если узлы сами координируют свои действия. Координация должна осуществляться отдельной службой, которая должна быть надежной и производительной.
Резюме зоозащитника:
ZooKeeper — это служба координации распределенных приложений. Он предоставляет набор простых API-интерфейсов, на основе которых распределенные приложения могут использовать для синхронизации такую информацию, как состояние узла, конфигурация и регистрация службы. Он написан на языке JAVA и поддерживает клиентов на языках JAVA и C.
узел узла
Базовая единица данных в zookeeper называется узлом, и узел может содержать дочерние узлы, которые в конечном итоге отображаются на уровне дерева. Каждый узел имеет уникальный путь пути. Клиент загружает данные узла на основе PATH, и zookeeper уведомит клиента, отслеживая путь в режиме реального времени после его получения.
Во-вторых, развертывание и общая конфигурация
Zookeeper разработан на основе JAVA и может работать до тех пор, пока после загрузки имеется соответствующая среда JVM. Его номер порта по умолчанию — 2181, чтобы убедиться, что он не конфликтует перед запуском.
Примечания к выпуску:
3.5.5, выпущенный 20 мая 2019 г., является первым стабильным выпуском ветки 3.5. Этот выпуск считается преемником стабильной ветки 3.4 и готов к работе. Основанный на версии 3.4, он содержит следующие новые функции.
- динамическая реконфигурация
- местное собрание
- Новый тип узла: контейнер, TTL
- Поддержка SSL для атомарного широковещательного протокола
- Возможность удаления наблюдателей
- многопоточный обработчик фиксации
- Обновление до Netty 4.1
- Сборка Maven
Также обратите внимание: рекомендуемая минимальная версия JDK – 1.8. В документации указано:
- apache-zookeeper-xxx-tar.gz представляет исходный код
- рабочая версия apache-zookeeper-xxx-bin.tar.gz
ссылка для скачивания:zookeeper.apache.org/releases.contracts…Конкретный процесс развертывания:
#下载
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/apache-zookeeper-3.5.5-bin.tar.gz
#解压
tar -zxvf apache-zookeeper-3.5.5-bin.tar.gz
#拷贝默认配置
cd {zookeeper_home}/conf
cp zoo_sample.cfg zoo.cfg
#启动
{zookeeper_home}/bin/zkServer.sh
Общее описание конфигурационного файла:
# zookeeper时间配置中的基本单位 (毫秒)
tickTime=2000
# 允许follower初始化连接到leader最大时长,它表示tickTime时间倍数 即:initLimit*tickTime
initLimit=10
# 允许follower与leader数据同步最大时长,它表示tickTime时间倍数
syncLimit=5
#zookeper 数据存储目录
dataDir=/tmp/zookeeper
#对客户端提供的端口号
clientPort=2181
#单个客户端与zookeeper最大并发连接数
maxClientCnxns=60
# 保存的数据快照数量,之外的将会被清除
autopurge.snapRetainCount=3
#自动触发清除任务时间间隔,小时为单位。默认为0,表示不自动清除。
autopurge.purgeInterval=1
Команда клиента:
Список основных командclose закрыть текущую сессиюconnect host:port Повторно подключитесь к указанному сервису Zookeeper.create [-s] [-e] [-c] [-t ttl] path [data] [acl]создать узелdelete [-v version] pathУдалить узел (дочерние узлы не могут существовать)deleteall pathУдалить путь и все дочерние узлыsetquota -n|-b val pathустановить квоту узла -n количество дочерних узлов -b количество байтовlistquota pathПросмотр квоты узлаdelquota [-n|-b] pathудалить квоту узлаget [-s] [-w] pathПросмотр данных узла -s содержит статус узла -w добавить прослушиватель getAcl [-s] путьls [-s] [-w] [-R] pathСписок дочерних узлов -s статус -R рекурсивно просмотреть все дочерние узлы -w добавить прослушивательprintwatches on|offПечатать ли события прослушиванияquit Выйти из клиентаhistory Посмотреть историю выполненияredo cmdnoПовторите выполнение команды, номер команды в истории определяет путь удаления часов [-c|-d|-a] [-l]удалить указанный слушательset [-s] [-v version] path dataНастройкиsetAcl [-s] [-v version] [-R] path aclУстановить разрешения ACL для узловstat [-w] pathПосмотреть статус узла -w добавить слушателяsync pathУзел принудительной синхронизации
Добавляйте, удаляйте, изменяйте и проверяйте данные узла
# 列出子节点
ls /
#创建节点
create /luban "luban is good man"
# 查看节点
get /luban
# 创建子节点
create /luban/sex "man"
# 删除节点
delete /luban/sex
# 删除所有节点 包括子节点
deleteall /luban
[zk: 127.0.0.1:2181(CONNECTED) 20] ls /
[admin, brokers, cluster, config, consumers, controller, controller_epoch, isr_change_notification, latest_producer_id_block, log_dir_event_notification, tmp0000000095, zookeeper]
[zk: 127.0.0.1:2181(CONNECTED) 21] create /xiaoqiang "xiaoqiang is a good man"
Created /xiaoqiang
[zk: 127.0.0.1:2181(CONNECTED) 22] get /xiaoqiang
xiaoqiang is a good man
[zk: 127.0.0.1:2181(CONNECTED) 23] create /xiaoqiang/age 17
Created /xiaoqiang/age
[zk: 127.0.0.1:2181(CONNECTED) 24] delete /xiaoqiang/age
[zk: 127.0.0.1:2181(CONNECTED) 25] deleteall /xiaoqiang
3. Введение в узлы Zookeeper
Узлы в zookeeper называются znodes.Структура хранения аналогична файловой системе и хранится в древовидной структуре. Разница в том, что znode не имеет понятия о каталогах и не может выполнять такие команды, как cd. Структура znode содержит следующее:
- path: уникальный путь
- childNode: дочерний узел
- stat: атрибут статуса
- type: тип узла
Тип узла
Типы |
описывать |
---|---|
PERSISTENT |
постоянный узел |
PERSISTENT_SEQUENTIAL |
Узел постоянного серийного номера |
EPHEMERAL |
Временный узел (не может иметь дочерних узлов) |
EPHEMERAL_SEQUENTIAL |
Временный порядковый узел (не может иметь дочерних узлов) |
- PERSISTENT (постоянный узел)
Постоянно сохраняемые узлы также создаются по умолчанию.
#默认创建的就是持久节点
create /test
- PERSISTENT_SEQUENTIAL (узел постоянного порядкового номера)
Zookeeper добавит порядковый номер в качестве суффикса к пути при его создании. Он очень подходит для таких сценариев, как распределенные блокировки и распределенные выборы. Просто добавьте параметр -s при его создании.
#创建序号节点
create -s /test
#返回创建的实际路径
Created /test0000000001
create -s /test
#返回创建的实际路径2
Created /test0000000002
- EPHEMERAL (эфемерный узел)
Эфемерные узлы автоматически удаляются при отключении сеанса клиента. Он подходит для таких сценариев, как контроль пульса и обнаружение служб. Добавьте параметр -e при его создании.
#创建临时节点, 断开会话 在连接将会自动删除
create -e /temp
- EPHEMERAL_SEQUENTIAL (узел временного порядкового номера)
Аналогично постоянным узлам последовательности, за исключением того, что EPHEMERAL_SEQUENTIAL является временным и будет удален после отключения сеанса. Добавляйте -e -s при создании
create -e -s /temp/seq
Свойства узла
# 查看节点属性
stat /luban
Его свойства описаны в следующей таблице:
#创建节点的事物ID
cZxid = 0x385
#创建时间
ctime = Tue Sep 24 17:26:28 CST 2019
#修改节点的事物ID
mZxid = 0x385
#最后修改时间
mtime = Tue Sep 24 17:26:28 CST 2019
# 子节点变更的事物ID
pZxid = 0x385
#这表示对此znode的子节点进行的更改次数(不包括子节点)
cversion = 0
# 数据版本,变更次数
dataVersion = 0
#权限版本,变更次数
aclVersion = 0
#临时节点所属会话ID
ephemeralOwner = 0x0
#数据长度
dataLength = 17
#子节点数(不包括子子节点)
numChildren = 0
Мониторинг узла:
Клиенты могут добавить параметр -w, чтобы отслеживать изменения узлов и подузлов в режиме реального времени и получать уведомления в режиме реального времени. Это очень удобно для обеспечения целостности данных в распределенных ситуациях. Он используется следующим образом:
настройки разрешений acl
Полное название ACL — Список контроля доступа (Access Control List), который используется для управления правами доступа к ресурсам. ZooKeeper использует ACL для управления доступом к своим узлам. Контроль разрешений осуществляется на основе схемы:id:разрешение. Схема представляет режим авторизации, соответствующее значение режима идентификатора, а разрешение представляет собой определенные биты разрешения на добавление, удаление и изменение.
схема: модель аутентификации
строить планы |
описывать |
---|---|
world |
Открытый режим, мир означает, что весь мир доступен (это настройка по умолчанию) |
ip |
IP-режим, ограничение IP-адреса клиента, чтобы предотвратить вопросы |
auth |
Режим аутентификации по паролю пользователя, который можно предотвратить только в том случае, если в сеанс добавлена аутентификация. |
digest |
Подобно авторизации, разница в том, что аутентификация использует пароли в виде открытого текста, а дайджест использует зашифрованные пароли sha-1+base64. Дайджест более распространен в практическом использовании. |
бит разрешения
биты разрешения |
разрешение |
описывать |
---|---|---|
c |
CREATE |
Может создавать дочерние узлы |
d |
DELETE |
Дочерние узлы могут быть удалены (только узлы следующего уровня) |
r |
READ |
Может читать данные узлов и отображать список дочерних узлов. |
w |
WRITE |
Данные узла могут быть установлены |
a |
ADMIN |
Можно установить разрешения списка управления доступом к узлу |
связанные с acl команды:
Заказ |
Как пользоваться |
описывать |
---|---|---|
getAcl |
getAcl |
Чтение разрешения ACL |
setAcl |
setAcl |
Установить разрешения ACL |
addauth |
addauth |
Добавить аутентифицированного пользователя |
мировое разрешениеПримерСинтаксис: setAcl world:anyone: Примечание.
- Просмотр разрешений узла по умолчанию:
#创建一个节点
create -e /testAcl
#查看节点权限
getAcl /testAcl
#返回的默认权限表示 ,所有人拥有所有权限。
'world,'anyone: cdrwa
- Изменить разрешение по умолчанию на чтение и запись
#设置为rw权限
setAcl /testAcl world:anyone:rw
# 可以正常读
get /testAcl
# 无法正常创建子节点
create -e /testAcl/t "hi"
# 返回没有权限的异常
Authentication is not valid : /testAcl/t
Пример IP-разрешений:Синтаксис: setAclip::
Пример режима авторизации:грамматика:
- setAcl auth:::
- addauth дайджест :
Пример разрешения на дайджест:грамматика:
- setAcl дайджест :::
- addauth дайджест :
Примечание 1. Ключ генерируется с помощью SHA1 и base64 в сочетании с Base64 и может быть сгенерирован с помощью следующей команды.
echo -n <用户名>:<密码> | openssl dgst -binary -sha1 | openssl base64
Примечание 2. После того, как для узла установлено разрешение дайджеста, перед доступом необходимо выполнить addauth, и текущий сеанс можно предотвратить.
- Установить разрешения на дайджест
#先 sha1 加密,然后base64加密
echo -n luban:123456 | openssl dgst -binary -sha1 | openssl base64
#返回密钥
2Rz3ZtRZEs5RILjmwuXW/wT13Tk=
#设置digest权限
setAcl /luban digest:luban:2Rz3ZtRZEs5RILjmwuXW/wT13Tk=:cdrw
- Просмотр узла не покажет никаких разрешений
#查看节点
get /luban
#显示没有权限访问
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /luban
- Посмотреть в следующий раз после добавления аутентификации в текущий сеанс
#给当前会话添加权限帐户
addauth digest luban:123456
#在次查看
get /luban
#获得返回结果
luban is good man
Специальные инструкции для ACL: Разрешения действительны только для текущего узла и не будут наследоваться дочерними узлами. Например, IP-узел анти-опроса A ограничен, но это не препятствует дочернему узлу /A/B IP-анти-опроса A.
Еще не подписались на мой официальный аккаунт?
- Отсканируйте QR-код в конце статьи и перейдите в официальный аккаунт [Xiaoqiang's Advanced Road], чтобы получить следующее:
- Учебные материалы: видеоуроки 1T: обучающие видеоролики по интерфейсу и серверной части Javaweb, обучающие видеоролики по машинному обучению/искусственному интеллекту, обучающие видеоролики по системе Linux, видеоуроки по IELTS;
- Более 100 книг: классические обязательные к просмотру книги, включая сборник решений по C/C++, Java, Python и LeetCode;
- Программные инструменты: почти все программное обеспечение, которое вы можете использовать в процессе программирования;
- Исходный код проекта: 20 исходный код проекта JavaWeb.