ZooKeeper — это распределенная служба координации распределенных приложений с открытым исходным кодом,Google
изChubby
Реализация с открытым исходным кодом.
Apache ZooKeeper is an effort to develop and maintain an open-source server which enables highly reliable distributed coordination.
Принцип введение и объяснение
- алгоритм консенсуса
ZooKeeper以Fast Paxos
(Paxos) для обеспечения согласованности данных для каждого экземпляра zk в кластере. Как правило, развертывается кластер, а количество машин устанавливается равным нечетному числу, что легче удовлетворить условию голосования > N/2.
- модель хранения
/
├── app1
│ ├── p_1
│ ├── p_2
│ └── p_3
└── app2
Подобно древовидной модели папок операционной системы, отличие от папок в том, что данные могут храниться на каждом узле (не более
1M
), данные на каждом узле могут содержать номер версии.
-
zNode
Тип узла
2
Измерение деления: в зависимости от того, может ли узел быть постоянно сохраненным, разделенным на постоянные узлы и временные узлы, в зависимости от того, может ли серийный номер узла последовательно увеличиваться (аналогичноmysql
изauto_increment
), разделенные на последовательные узлы и непоследовательные узлы,
Примечание. После версии 3.6.0 новыеContainer Nodes
(узел-контейнер), который характеризуется тем, что если все дочерние узлы под ним будут удалены, то узел также будет удален когда-то в будущем.
ZooKeeper has the notion of container nodes. Container nodes are special purpose nodes useful for recipes such as leader, lock, etc. When the last child of a container is deleted, the container becomes a candidate to be deleted by the server at some point in the future.
постоянный узел
(client
После создания постоянного узла, даже сzk
отключен, узел остается вzk
середина)
Постоянные последовательные узлы
(eg: /order/quartz/wm000001 , /order/quartz/wm000002, /order/quartz/wm000003...)
временный узел
(client
иzk
После отключения узел автоматически удаляется)
Узел временной последовательности
- прослушиватель событий
-
Created event
(событие создания узла) -
Deleted event
(событие удаления узла) -
Changed event
(событие изменения данных узла) -zkClient.subscribeChildChanges();
//Подписка на изменения в дочерних узлах -
zkClient.subscribeDataChanges();
//Подписка на события изменения данных узла (включая удаление данных) -
zkClient.subscribeStateChanges();
//Статус заказа меняется (состояние включает в себя: подключение, отключение, сбой аутентификации и т.д.)
-
Вышеупомянутые события являются общими, информацию о других событиях можно найти в официальной документации. На практике собственный метод записи редко используется для мониторинга событий, но для мониторинга событий используются некоторые сторонние клиенты zk с открытым исходным кодом, такие как zkClient.
-
ACL(Access Control List)
Контроль доступа- Каждый узел имеет 5 разрешений на операции:
Create、Read、Write、Delete、Admin
короткое имяcrwda
. в:Delete
Это относится к тому, имеет ли дочерний узел разрешение на удаление, а остальные четыре разрешения относятся к разрешению на операцию собственного узла. - Метод проверки подлинности:
world:
Режим по умолчанию, неограниченный, доступный по всему миру.auth:
Добавьте авторизованных пользователей в контекст.digest:
Аутентификация по имени пользователя/паролюip: ip
проверка подлинности адреса
- Каждый узел имеет 5 разрешений на операции:
Сценарии применения
- Сценарий приложения 1: распределенная конфигурация
ВАЖНО: Информация о конфигурации сохраняется в
db
иzk
Посередине (для подстраховки безопасность данных выше) получите интерфейс фонового управления, а после модификации конфигурации сохраните ее вdb
, затем напишите синхронноzk
в узле. Когда приложение запустится, подключитесь кzk
Читайте конфигурацию в узле и одновременно отслеживайте изменение данных узла и получайте уведомления в режиме реального времени при изменении конфигурации.
- Сценарий приложения 2: устранение единых точек отказа
(Single Point of Failure,SPOF)
└── ./OrderNoService
├── A0000001
10.0.0.1:8001
└── A0000002
10.0.0.2:8001
Несколько экземпляров службы, которые запускаются в
zk
На временном узле последовательности вызывающая сторона соглашается взять наименьший узел в качествеMaster
,когдаmaster
После завершения соединения узел автоматически удаляется, вызывающий абонент уведомляется о событии, и для вызова используется новый минимальный узел.(
эквивалентноslave
Повышен доmaster)
- Сценарий приложения 3: децентрализация
На приведенном выше рисунке левая сторона представляет собой традиционную централизованную архитектуру. Недостаток заключается в том, что каждый раз, когда новый экземпляр службы добавляется или отключается, его необходимо настраивать.
nginx
Конфигурация центрального узла(
Либо вручную, либо автоматически с помощью инструментов)
, что не способствует динамической эластичной корректировке в эпоху облачных вычислений, а общая доступность сильно зависит от центрального узла.(
центральный кластер)
Все зависают, система недоступна.
- Сценарий приложения 4: распределенная блокировка
Order
└── 3456890
├── 000001
├── 000002
└── 000003
Принцип: запуск экземпляров нескольких программ при обработке заказов.
3456890
Например, перед тем, как каждая программа запускает обработку экземпляра, создайте временный узел последовательности, а затем проверьте, является ли созданный вами узел наименьшим, если нет, то это означает, что блокировка не захвачена, если да, то это означает, что блокировка захватывается, и программа, захватившая блокировку, обрабатывается, после чего удаляем узел, чтобы снять блокировку. В то же время другие программы в состоянии ожидания прослушивают родительский узел, чтобы получить уведомление об освобождении блокировки в режиме реального времени.Order/3456890
Когда дочерний узел изменится, когда дочерний узел изменится, повторите процесс обнаружения только сейчас, пока созданный вами узел не станет самым маленьким. иredis SETNX
По сравнению с распределенными блокировками, такими какzk
Распределенный замокTop N
такие как проблемы ограниченного доступа к ресурсам (аналогично семафорам в параллелизме). Например: нужно напечатать кучу программ, а принтеров всего 2 (или длина очереди на печать всего 2, и максимум 2 программам можно разрешить отправлять задания на печать одновременно), аналогично по идее только что самые маленькие первые 2 узла могут быть обнаружены, только программа которая создает минимальные первые 2 узла считается получившей сигнал, разрешающий подачу задания на печать.
- Сценарий приложения 5: распределенная очередь
Queue
└── Queue1
├── 000001
├── 000002
└── 000003
Как показано выше, создайте
Queue/Queue1
как очередь (илиTopic
), и затем каждый раз, когда создается последовательный узел, он рассматривается как сообщение (данные, хранящиеся в узле, являются содержимым сообщения), и производитель каждый раз создает новый узел, который отправляется как сообщение, и потребитель слушает его.Queue1
При изменении дочернего узла (или опросе по времени) в качестве сообщения потребления каждый раз берется наименьший узел, после обработки узел удаляется. эквивалентно реализацииFIFO
очередь (первым пришел, первым ушел). Примечание:zk
Фреймворк обеспечивает этоCP
(Согласованность), не предназначенный для сценариев с высокой степенью параллелизма и высокой производительностью, если в высокой степени параллелизма,qps
При высоких условиях следует рассматривать распределенную очередь как подходящую.
- Сценарий приложения 7: Создание распределенного уникального
id
Order
└── OrderId
├── 000001
├── 000002
└── 000003
Идея: Каждый раз новый
Id
, создать постоянный узел последовательности, а порядковый номер узла, возвращенный операцией создания, является новымId
, а затем удалите узел меньше вашего собственного.
последняя глава
В настоящее время многие проекты с открытым исходным кодом в большей или меньшей степени полагаются на
zookeeper
,Например:dubbo,disconf,kafka,...
В распределенной среде
zk
Какие сценарии для этого можно использовать, в основном зависит от фантазии разработчика!