Я разобрал кое-какую архитектуру Java и материалы интервью (микросервисы, кластеры, распределенное, промежуточное ПО и т.д.), а друзья, кому нужно, могут обратить внимание на официальный аккаунт [Внутренние дела Программиста], и получить самостоятельно без всяких рутин
-
Интервьюер немного смутился, сказав 9 распределенных методов генерации ID на одном дыхании.
-
Назовите 6 сценариев сбоя аннотации @Transactional за один раз
-
9 видов распределенного ID поколения Meituan (Leaf) в реальном бою
Нытье
Эта статья в основном делится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
Номер версии увеличивается. когда клиент запрашиваетznode
Node, будут возвращены как данные узла, так и номер версии. Кроме того, когда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
Взгляните на команду, разрешения не установленыznode
Node, разрешения по умолчанию.
[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-00000002
Node, пусть он еще раз решит, является ли он самым маленьким узлом, если это так, он получит блокировку, вместо того, чтобы продолжать ждать уведомления.
и так далее/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] Самовывоз