Как реализовать распределенный замок с Zookeeper?

1. Общие сведения

Zookeeper недавнего исследования, в начале контакта Zookeeper, Zookeeper не знает, что толк. Zookeeper много информации и будет описан как «класс файловой системы Unix / Linux» промежуточного программного обеспечения, потому что будет трудно Zookeeper и распространенным классом Unix / Linux приложения файловой системы вместе.

Позже в грубом чтения «технология распределенного совместный процесса Zookeeper объяснить» и «согласованность с Paxos Zookeeper распространена принципами и практикой» два книг, и написала ряд практической CU дема, предварительно Zookeeper для определенного понимания.

Но более поверхностный, в целях дальнейшего углубления понимания Zookeeper, я использую свободное время, чтобы написать эту статью соответствующих демо - основа распределенных стопорной реализацию Zookeeper. При написании децентрализованной демо Lock, так что я Watcher механизм Zookeeper, Zookeeper лучшего понимания использования и так далее.

Но я написал распределенный замок довольно просто, не достаточно, чтобы достичь красивой, только практика, только для справки. Ну, экскурс остановиться здесь, то мы должны говорить о Zookeeper распределенной реализации блокировки на основе.

2. монопольная блокировка и писать реализацию блокировки

Я проиллюстрирую эксклюзивную блокировку и запись блокировки подробного процесса внедрения, и вместе с соответствующей схемой, чтобы помочь вам понять процесс реализации. Здесь говорить о реализации монопольной блокировки.

2.1 эксклюзивные реализации блокировки

Также известен как эксклюзивный замок монопольной блокировки, легко понять их цели из буквального смысла. То есть, если действие, прежде чем O1 процесса блокировки доступа к ресурсам R1, в конце доступа к операции O1 к ресурсам R1, другие операции не может получить доступ к ресурсу R1. Будьте более простое определение исключительной блокировки, то это определение того, как достичь «класса файловой системы Unix / Linux» структурировать Zookeeper в это? Перед блокированием ответа, мы смотрим на фото:

Структура узла монопольная блокировка Zookeeper

Как было показано выше, для исключительной блокировки, можно рассматривать как ресурс блокировки узлов R1, R1 рассматривается как работающие ресурсы доступа O1 создать блокировку узла, удаление блокировки ресурсов релиза R1 рассматривается как узел. Таким образом, мы будем монопольная блокировка определение Zookeeper соответствует конкретной структуре узла, приобретая замок путем создания узла блокировки, удаление узла, снимает блокировку. Подробный процесс выглядит следующим образом:

  • Несколько клиентов заблокировать временный узел, чтобы создать конкуренцию

  • В какой узел-клиент успешно создан замок, другой клиентский узел установлен в положение блокировки наблюдающий 3

  • Держа замок блокировки узла клиента или удалить клиентские сбои, удалите стопорный узел Zookeeper

  • Другие клиенты уведомлен замок удалены узел

  • Повторяя выше четыре шага, пока клиент не дожидаясь получения блокировки

Т.е. монопольной блокировки Вышеприведенные конкретные шаги по реализации, это не очень сложно, не повторяются.

Приобретите эксклюзивную блокировку блок-схему

реализация блокировки 2,2 чтения-записи

Добившись эксклюзивную блокировку, и этот фестиваль, как говорят, читать и писать замки. Блокировка чтения-запись, содержащая замок и блокировку записи на ресурс R1 плюс операцию чтения O1 замка, и замок получается, другие операции могут быть одновременно считывать блокировку ресурса R1 обеспечиваются, Shared операции чтения.

Если операция O1 R1 плюс блокировка записи на ресурсе и получить блокировку, то другие операционные ресурсы R1 установить различные типы замков блокируются. В заключении, с общими замками для чтения, в то время как эксклюзивные замки записи. Таким образом, в Zookeeper, мы можем достичь вышеуказанной операции делает какой вид структуры узла?

Чтение-запись блокировки структуры узла Zookeeper

В Zookeeper структура в связи с различными узлами для чтения и записи и эксклюзивные замки, клиент блокировки чтения-записи не должны блокировать узел, чтобы создать конкуренцию. Таким образом, в самом начале, все клиенты будут создавать свой собственный узел блокировки. Если ничего другого, все узлы не могут быть созданы успешно запирает, корпус замка, показанного в структуре узла Рисунок 3. После этого клиент получает все дочерние узлы / share_lock Zookeeper от конца, и определяет, будет ли приобретаемой собственный замок. Если клиент создает узел блокировки чтения приобретает состояние блокировки (один из которых может встретиться) следующим образом:

  • Номера узлов, которые создаются строки перед всеми другими дочерними узлами

  • В передней части узла, который вы создаете узел блокировки свободной записи

Если клиент создает узел блокировки записи, из-за эксклюзивные замки записи. Так что состояние блокировки, чтобы быть проще, просто заблокировать узел, чтобы определить, следует ли создать свою собственную строку перед другими дочерними узлами может быть.

不同于独占锁,读写锁的实现稍微复杂一下。读写锁有两种实现方式,各有异同,接下来就来说说这两种实现方式。

读写锁的第一种实现

第一种实现是对 /sharelock 节点设置 watcher,当 /sharelock 下的子节点被删除时,未获取锁的客户端收到 /share_lock 子节点变动的通知。在收到通知后,客户端重新判断自己创建的子节点是否可以获取锁,如果失败,再次等待通知。详细流程如下:

  • 所有客户端创建自己的锁节点

  • 从 Zookeeper 端获取 /sharelock 下所有的子节点,并对 /sharelock 节点设置 watcher

  • 判断自己创建的锁节点是否可以获取锁,如果可以,持有锁。否则继续等待

  • 持有锁的客户端删除自己的锁节点,其他客户端收到 /share_lock 子节点变动的通知

  • 重复步骤2、3、4,直至无客户端在等待获取锁了

上述步骤对于的流程图如下:

Эквайринг стопорное записи блок-схема реализации

上面获取读写锁流程并不复杂,但却存在性能问题。以图3所示锁节点结构为例,第一个锁节点 host1-W-0000000001 被移除后,Zookeeper 会将 /share_lock 子节点变动的通知分发给所有的客户端。

但实际上,该子节点变动通知除了能影响 host2-R-0000000002 节点对应的客户端外,分发给其他客户端则是在做无用功,因为其他客户端即使获取了通知也无法获取锁。所以这里需要做一些优化,优化措施是让客户端只在自己关心的节点被删除时,再去获取锁。

读写锁的第二种实现

在了解读写锁第一种实现的弊端后,我们针对这一实现进行优化。这里客户端不再对 /share_lock 节点进行监视,而只对自己关心的节点进行监视。还是以图3的锁节点结构进行举例说明,host2-R-0000000002 对应的客户端 C2 只需监视 host1-W-0000000001 节点是否被删除即可。

С3, соответствующий клиент host3-W-0000000003 только контролирует ли host2-R-0000000002 узел может быть удален только host2-R-0000000002 узел удален, клиент C3, чтобы получить блокировку. И уведомление удаляются узлы host1-W-0000000001, C3, порожденный клиентом бесполезно, даже если клиент C3 в ответ на уведомление не смогут получить блокировку.

Подытожьте, блокировка узлов различных клиентов, заинтересованных различны. Если клиент создает блокировку чтения узлов, клиенту просто нужно найти номер узла меньше, чем последняя блокировка чтения узла блокировки записи, и вы можете установить Бодрствующий. И если это узел блокировки записи, даже проще, клиент только на одном узле множество наблюдател может. Деталь процесса заключается в следующем:

  • Все клиенты, чтобы создать свой собственный узел блокировки

  • Получить все дочерние узлы / share_lock от конца Zookeeper

  • Блокировка узла, чтобы определить, следует ли создавать свои собственные замки могут быть приобретены, если вы можете, удерживая блокировку. В противном случае он установлен в положении блокировки наблюдатела узел вы заботитесь о

  • Удержание блокировки узла клиента, чтобы удалить их собственный замок, клиент получает уведомление о том, удаляется узел и получить блокировку

  • Повторите шаг 4 до клиента, не дожидаясь получения блокировки

Для описанных выше шагов блок-схемы заключаются в следующем:

2 представлена ​​блок-схема реализована блокировка записи приобретают

3. Письменное в последний

В данной статье подробно описывается процесс реализации на основе Zookeeper распределенной блокировки, и для достижения более простой демо распределены блокировки на основе двух принципов блокировки описано выше, код размещен на GitHub, друга в необходимости и поиска.

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

Источник: https://segmentfault.com/a/1190000010895869

рекомендация

отblog.csdn.net/Java__xiaoze/article/details/90638755