Не знаете этих понятий, советую не писать в резюме "знакомый" зоозащитник

Java
Не знаете этих понятий, советую не писать в резюме "знакомый" зоозащитник

Я разобрал кое-какую архитектуру Java и материалы интервью (микросервисы, кластеры, распределенное, промежуточное ПО и т.д.), а друзья, кому нужно, могут обратить внимание на официальный аккаунт [Внутренние дела Программиста], и получить самостоятельно без всяких рутин

Нытье

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

интервьюер: использовалzookeeper?

я: использовал, дайdubboРегистрация и обнаружение службы

интервьюер:знаниеzookeeperчто это?

я: Я знаю, регистрационный центр

интервьюер: Тогда как вы используете это в своем проекте?zookeeperиз?

яspringbootизapplication.propertiesдобавить файл конфигурацииzookeeperСервисный адрес подойдет. . .

在这里插入图片描述
. В приведенном выше диалоге вроде бы нет ничего плохого, но кажется, что что-то не так, в результате каждый раз, когда я так отвечаю на интервью, меня пропускают.

Почему вас спрашивают о зоопарке? Поскольку в моем резюме указано, что я умею пользоваться zookeeper, интервьюер понимает, что «умелое» использование — это не конфигурация, а запуск проекта так же прост, как и не сообщать об ошибке. Поэтому все же необходимо иметь всестороннее представление о соответствующих знаниях зоокипера.


1. Первое знакомство с зоопарком?

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

1. Модель данных Zookeeper

zookeeperПоддерживается структура данных, похожая на файловую систему, и каждый подкаталог (/WeChat, /WeChat/Official Account) называетсяznodeто есть узел. Подобно файловой системе, мы можем легкоznodeУзлы можно добавлять, удалять и т. д., а такжеznodeдобавить, удалить子znode, разница в том, что файловая система такая,znodeДанные могут быть сохранены (строго говоря, данные должны быть сохранены, по умолчанию используется нулевой символ).

так какzookeeperструктура узла каталога. При получении и создании узлов вы должны начать с“/”в начале, иначе при получении узла будет сообщено об ошибкеPath must start with / character.

[zk: localhost:2181(CONNECTED) 13] get test
Command failed: java.lang.IllegalArgumentException: Path must start with / character

Имя корневого узла должно быть“/XXX”, вы должны указать каталог корневого узла при создании дочерних узлов“/XXX/CCC”,“/XXX/AAA”.

Например: хотите получить следующее изображение程序员内点事Узлы должны объединять полные путиget /微信/公众号/程序员内点事

get /微信/公众号/程序员内点事

在这里插入图片描述

znodeиспользуется для храненияbyte级илиkb级данные, максимальное количество данных, которое может быть сохранено, составляет1MB(Пожалуйста, обрати внимание: объем данных узла включает не только его собственные данные хранилища, но также имена всех его дочерних узлов преобразуются в байты и подсчитываются, поэтомуznodeКоличество дочерних узлов не ограничено) Хотя размер хранилища узла можно изменить вручную, обычно это делать не рекомендуется.


2. атрибуты узла znode

ОдинznodeУзлы могут не только хранить данные, но и обладать некоторыми другими особыми свойствами. Далее мы создаем/testУзел анализирует значение своих различных атрибутов.

[zk: localhost:2181(CONNECTED) 6] get /test
456
cZxid = 0x59ac //
ctime = Mon Mar 30 15:20:08 CST 2020
mZxid = 0x59ad
mtime = Mon Mar 30 15:22:25 CST 2020
pZxid = 0x59ac
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0  
Свойства узла аннотация
cZxid Идентификатор транзакции при создании узла данных
mZxid Идентификатор последней транзакции, когда узел данных был изменен
pZxid Идентификатор транзакции родительского узла текущего узла
ctime Время создания узла данных
mtime Время последней модификации узла данных
dataVersion Текущий номер версии узла (увеличивается на +1 при каждом изменении значения)
cversion Номер версии дочернего узла (количество изменений дочернего узла, значение +1 увеличивается при каждом изменении)
aclVersion Текущий номер версии ACL-узла (узел модифицируется с разрешениями ACL, значение +1 увеличивается при каждом изменении)
ephemeralOwner Временный идентификатор узла. Если текущий узел является временным узлом, сохраняется идентификатор сеанса (sessionId) создателя. Если нет, значение = 0
dataLength Длина данных, хранящихся в текущем узле
numChildren Количество дочерних узлов под текущим узлом

мы видимznodeАтрибутов узлов много, но основные атрибуты по-прежнемуzxid,version,aclЭти трое.


Zxid:

znodeИзменение состояния узла приведет к тому, что узел получитzxidВременная метка в формате, эта временная метка глобально упорядочена, и создание или обновление узла znode будет генерировать новый. еслиzxid1значение zxid2значение, тоzxid2изменения вzxid1после. Каждый узел имеет 3zxidАтрибуты,cZxid(время создания узла),mZxid(Время модификации этого узла не имеет ничего общего с дочерними узлами),pZxid(Время последнего создания или модификации этого узла или его дочерних узлов, внучатых узлов не имеет значения).

zxidАтрибуты в основном используются вzookeeperКластер, который будет подробно описан позже, когда будет представлен кластер.

Версия:

znodeВ свойствах есть три номера версииdataversion(номер версии данных),cversion(номер версии подузла),aclversion(номер версии разрешения ACL, принадлежащего узлу).

znodeДанные могут иметь несколько версий.Если в определенном узле есть несколько версий данных, то при запросе данных этого узла необходимо получить номер версии. всякий раз, когда мыznodeПосле изменения данных узлаdataversionНомер версии увеличивается. когда клиент запрашиваетznodeNode, будут возвращены как данные узла, так и номер версии. Кроме того, когдаdataversionза-1Когда вы можете игнорировать версию для работы. При установке разрешений на узлеaclVersionНомер версии будет увеличен, а контроль разрешений ACL будет подробно описан ниже.

Убедитесь, что мы изменили/testДанные узлаdataVersionЧто изменилось, нашелdataVersionСвойство становится равным 3, а номер версии увеличивается.

[zk: localhost:2181(CONNECTED) 10] set /test 8888
cZxid = 0x59ac
ctime = Mon Mar 30 15:20:08 CST 2020
mZxid = 0x59b6
mtime = Mon Mar 30 16:58:08 CST 2020
pZxid = 0x59ac
cversion = 0
dataVersion = 3
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0


3. Тип узла

zookeeperЕсть четыре типаznode, с помощью клиентаclientПри создании узла необходимо указать тип.

zookeeper.create("/公众号/程序员内点事", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
  • PERSISTENT-Постоянный узел каталога: после того, как клиент создаст узел, узел будет постоянным после отключения от zookeeper, и узел все еще будет существовать, когда клиент снова подключится.

  • PERSISTENT_SEQUENTIAL- Постоянный последовательный узел: после того, как клиент создаст узел, узел будет постоянным после отключения от zookeeper.Если узел будет подключен снова, узел все еще будет существовать.Zookeeper будет последовательно нумеровать имя узла, например: /lock/0000000001 , /замок/0000000002, /замок/0000000003.

  • EPHEMERAL-Временный узел каталога: после того, как клиент отключится от zookeeper, узел будет удален.

  • EPHEMERAL_SEQUENTIAL- Временный последовательный узел: после отключения клиента от zookeeper узел удаляется, а имя узла будет последовательно нумероваться, например: /lock/0000000001, /lock/0000000002, /lock/0000000003.

2. Контроль разрешений ACL для узлов

ACL:которыйAccess Control List(Контроль разрешений узлов), черезACLмеханизм решенияznodeПрава доступа узлов, следует отметить, чтоzookeeperКонтроль разрешений основан наznodeУровень, то есть разрешения между узлами не наследуются, то есть дочерние узлы не наследуют разрешения родительского узла.

zookeeperФормат установки разрешений ACL в<schema>:<id>:<acl>Состоит из трех разделов.

schema: Указывает способ авторизации

  • world: Указывает, что любой может получить доступ
  • auth: Только авторизованные пользователи могут получить доступ
  • digest: использовать имя пользователя :пароль пароль пользователя для создания хэша MD5 в качестве идентификатора аутентификации
  • host/ip: использовать IP-адрес хоста клиента для аутентификации

id: Объем разрешения, используемого для идентификации личности, зависит от того, какой метод выберет схема.

acl: Какие разрешения даются узлу, разрешения узла создавать, удалять, писать, читать, администрировать коллективно.cdwra.

1,world: Указывает, что любой может получить доступ

мы используемgetAclВзгляните на команду, разрешения не установленыznodeNode, разрешения по умолчанию.

[zk: localhost:2181(CONNECTED) 12] getAcl /test
'world,'anyone
: cdrwa

См. узел без установленного атрибута ACL, используется схема по умолчаниюworld, область примененияanyone, разрешения узлаcdwra, что означает, что любой может получить к нему доступ.

Тогда, если мы хотим дать схему как неworldнастройки узла дляworldЧто насчет разрешений?

setAcl /test world:anyone:crdwa
2,auth: Только авторизованные пользователи могут получить доступ

схема дляauthАвторизация означает, что доступ могут получить только аутентифицированные пользователи.Сначала необходимо добавить аутентифицированных пользователей.После добавления необходимо установить разрешения ACL для аутентифицированных пользователей.

addauth digest test:password(明文)

Следует отметить, что пароль при установке аутентифицированного пользователя указывается открытым текстом.

[zk: localhost:2181(CONNECTED) 2] addauth digest user:user //用户名:密码
[zk: localhost:2181(CONNECTED) 5] setAcl /test auth:user:crdwa
[zk: localhost:2181(CONNECTED) 6] getAcl /test
'digest,'user:ben+k/3JomjGj4mfd4fYsfM6p0A=
: cdrwa

Фактически, после того, как мы это настроим, мы откроем этот узел для всех аутентифицированных пользователей.setAcl /test auth:user:crdwaэквивалентноsetAcl /test auth::crdwa.

3.digest: Имя пользователя: Метод аутентификации по паролю

Имя пользователя: авторизация по паролю предназначена для одного конкретного пользователя.Этот метод не требует предварительного добавления пользователя для аутентификации.

Если вы используете клиент zookeeper для установки ACL в коде, пароль указывается открытым текстом, но если клиентская операция, такая как zk.cli, требует изменения пароляsha1иbase64иметь дело с.

setAcl <path> digest:<user>:<password(密文)>:<acl>

setAcl /test digest:user:jalRr+knv/6L2uXdenC93dEDNuE=:crdwa

Так как же шифруется пароль? Есть несколько способов:

пройти черезshellшифрование команд

echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64

использоватьzookeeperВстроенная библиотека классовorg.apache.zookeeper.server.auth.DigestAuthenticationProviderгенерировать

java -cp /zookeeper-3.4.13/zookeeper-3.4.13.jar:/zookeeper-3.4.13/lib/slf4j-api-1.7.25.jar \
  org.apache.zookeeper.server.auth.DigestAuthenticationProvider \
  root:root
root:root->root:qiTlqPLK7XM2ht3HMn02qRpkKIE=
4.host/ip: использовать IP-адрес хоста клиента для аутентификации

Этот метод легче понять, так как авторизует определенный IP-адрес или IP-сегмент.

[zk: localhost:2181(CONNECTED) 3] setAcl /test0000000014 ip:127.0.0.1:crdwa
cZxid = 0x59ac
ctime = Mon Mar 30 15:20:08 CST 2020
mZxid = 0x59b6
mtime = Mon Mar 30 16:58:08 CST 2020
pZxid = 0x59ac
cversion = 0
dataVersion = 3
aclVersion = 3 // 这个版本一直在增加
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0

3. Душа смотрителя зоопарка

Мы сказали в начале:zookeeperвозможноdubboОбеспечьте регистрацию и обнаружение сервисов, как реестр, но вы подумали об этомzookeeperПочему регистрация и обнаружение услуг могут быть достигнуты? Это должно быть сказаноzookeeperдушаWatcher(слушатель).

1. Что такое наблюдатель?

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

Краткое введениеwatcher, тогда давайте проанализируем,zookeeperКак реализовать регистрацию и обнаружение службы.zookeeperрегистрация и обнаружение службы, основное приложениеzookeeperизznodeмодель данных узла иwatcherОбщий процесс выглядит следующим образом:

在这里插入图片描述

  • Регистрация службы:поставщики услуг(Provider) когда он запускается,zookeeper服务端Регистрация служебной информации, то есть создание узла, например: служба регистрации пользователейcom.xxx.user.registerи хранить на узле данные, относящиеся к службе (например, IP-адрес поставщика услуг, порт и т. д.).

  • Обнаружение службы:потребители услуг (Consumer) при запуске, в соответствии с собственной конфигурацией зависимой служебной информации, дляzookeeper服务端Получите информацию о зарегистрированных услугах и установитеwatch监听, после получения информации о зарегистрированной службе, кэшируйте информацию поставщика услуг локально и вызовите службу.

  • Уведомление об обслуживании:Как только поставщик услуг по какой-либо причине выходит из строя и больше не предоставляет услуги, клиент связывается сzookeeperСервер отключен,zookeeperУзел службы, соответствующий поставщику услуг на сервере, будет удален (например: служба регистрации пользователейcom.xxx.user.register), тогдаzookeeperСервер асинхронно зарегистрирует службу для всех потребляющих пользователей.com.xxx.user.register, и установитеwatch监听Потребитель услуг узла отправляет уведомление об удалении узла, а потребитель извлекает последний список услуг в соответствии с полученным уведомлением и обновляет локально кэшированный список услуг.

Вышеупомянутый процессzookeeperОбщий принцип регистрации и обнаружения услуг может быть реализован.

2. Тип наблюдателя

znodeЕсть два типа узлов, которые могут быть установленыwatch, одинDataWatches, который срабатывает на основе изменения данных узла znodewatchсобытие, триггерgetData(),exists(),setData(),create().

ДругойChild Watches, на основе события наблюдения, вызванного изменением дочернего узла znode, условие срабатыванияgetChildren(),create().

во время звонкаdelete()Когда метод удаляет znode, он будет запущен в то же времяData WatchesиChild Watches, если удаленный узел имеет родительский узел, родительский узел инициируетChild Watches.

3. Функции наблюдателя

watchСобытие прослушивания на узле является одноразовым! Клиент устанавливает прослушиватель на указанном узлеwatch, как только данные узла будут изменены и клиент будет уведомлен один раз, событие наблюдения клиента за узлом будет недействительным.

Если мы хотим продолжать отслеживать этот узел, нам нужно снова отслеживать узел в обратном вызове мониторинга клиента.watchсобытие настроено наTrue. В противном случае клиент может получить уведомление об изменении узла только один раз.

В-четвертых, какие функции может выполнять зоозащитник

Функции регистрации и обнаружения сервисов — это лишь верхушка айсберга zookeeper. Он также может реализовывать ряд функций, таких как распределенные блокировки, очереди и центры конфигурации. Далее мы проанализируем только принципы. Для конкретной реализации это относительно полно, чтобы проверить информацию в Интернете.

1. Распределенная блокировка

zookeeperна основеwatcherмеханизм иznodeУпорядоченный узел , рождается заготовкой распределенного замка. Сначала создайте/test/lockВ качестве блокировки родительский узел является постоянным узлом (тип PERSISTENT), насколько это возможно./test/lockСоздайте временные последовательные дочерние узлы под родительским узлом.

Из-за увеличивающегося характера порядкового номера мы оговариваем, что узел с наименьшим порядковым номером получает блокировку. Например: клиент, чтобы получить блокировку, в/test/lockСоздайте узел под узлом как/test/lock/seq-00000001, который является наименьшим, поэтому он получает блокировку первым, а другие узлы ждут уведомления, чтобы снова получить блокировку./test/lock/seq-00000001После выполнения собственной логики удалите узел, чтобы снять блокировку.

затем узел/test/lock/seq-00000002Кого вы хотите, чтобы замок ждал?

Здесь мы позволяем/test/lock/seq-00000002Узел прослушивания/test/lock/seq-00000001узел, один раз/test/lock/seq-00000001Если узел удален, сообщите/test/lock/seq-00000002Node, пусть он еще раз решит, является ли он самым маленьким узлом, если это так, он получит блокировку, вместо того, чтобы продолжать ждать уведомления.

и так далее/test/lock/seq-00000003Узел прослушивания/test/lock/seq-00000002Для узлов всегда позволяйте следующему узлу слушать предыдущий узел, не позволяйте всем узлам слушать самый маленький узел, избегайте установки ненужного мониторинга, чтобы не вызывать большое количество недействительных уведомлений и не формировать «эффект стада».

zookeeperРаспределенная блокировка иredisПо сравнению с распределенными блокировками не рекомендуется из-за низкой производительности большого количества создаваемых и удаляемых узлов.

在这里插入图片描述

2. Распределенная очередь

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

3. Управление конфигурацией

Многие проекты с открытым исходным кодом теперь используют Zookeeper для поддержания конфигурации.Например, в очереди сообщений Kafka Zookeeper используется для хранения информации о брокере, dubbo управляет информацией о конфигурации сервисов. Принцип также основан наwatcherмеханизм, например, для создания/configУзел хранит некоторую конфигурацию, клиент слушает этот узел, и небольшая модификация/configИнформация о конфигурации узла, уведомляющая каждого клиента о повторном получении информации о конфигурации при изменении данных.

4. Служба именования

zookeeperСлужба имен: то есть мы часто говорим о регистрации и обнаружении службы, в основном для получения адреса ресурса или службы, поставщика услуг и другой информации в соответствии с указанным именем и использования егоznodeОсобенности узла иwatcherМеханизм используется в качестве центра конфигурации для динамической регистрации и получения служебной информации, унифицированного управления именами служб и соответствующей информацией списка серверов, и мы можем отслеживать состояние внутренних серверов (в сети, в автономном режиме, время простоя) почти в реальном времени. .


Суммировать

Цель этой статьи — познакомить вас с базовыми знаниями по zookeeper, такими как концепция выбора мастера кластера zookeeper, которая часто задается на собеседовании, и в этом выпуске она не написана, потому что содержание кластер также относительно большой, я боюсь, что пространство слишком длинное Долго у всех нет терпения читать его (на самом деле, это немного лениво, хахаха!) Заинтересованные друзья могут обратить внимание на волну, мы увидимся в следующий раз в кластере зоопарка.


Сегодня так много нужно сказать, если эта статья была вам полезна, я надеюсь получить от вас лайк 👍

Ваше одобрение является движущей силой для моего письма!

Небольшие преимущества:

Сотни различных технических электронных книг пересылаются друг другу, тсс~,бесплатноОтправить его друзьям. Обратите внимание на ответ на общедоступный номер【666] Самовывоз