Двенадцать последовательных вопросов ZooKeeper, сможете ли вы это выдержать?

интервью Java
Двенадцать последовательных вопросов ZooKeeper, сможете ли вы это выдержать?

предисловие

12-ти линейный большой завод Zookeeper вопрос 12-летней давности, что ты собираешься?

Эта статья была включена в github

GitHub.com/Я бы хотел 123/Java…

1. Интервьюер: Вы использовали Zookeeper в своей работе? Знаете ли вы, что это такое и для чего оно используется?

Я как курица:

  • Использовали, используйте ZooKeeper какРеестр Дуббо, реализовано с помощью ZooKeeperРаспределенная блокировка.
  • ZooKeeper с открытым исходным кодомСлужба распределенной координации, который является менеджером кластера, который предоставляет пользователям простой в использовании интерфейс.
  • Вы можете реализовать, такие как Data Release / подписка, балансировка нагрузки, с именем служба, распределенная координация / уведомление, управление кластером, мастер-выборы, распределенный замок и распределенная очередь на основе зоофильотераРавенство.
  • Работник зоопаркаиспользовать: службы именования, управление конфигурацией, управление кластером, распределенные блокировки, управление очередями

Разве цель и функция не одно и то же? Дай мне взглянуть, дай мне почувствовать это

2. Интервьюер: Расскажите, что такое служба имен, что такое управление конфигурацией и что такое управление кластером?

Я маленький цыпленок (к счастью, я отмахнулся от вопросов интервью), я не боюсь

  • Служба имен — это:

Служба именования относится куказанное имядля получения адреса ресурса или службы. Zookeeper может создатьГлобальный уникальный путь, путь можно использовать как имя. Именованный объект может бытьМашина в кластере, адрес службы или удаленный объектЖдать. Список адресов служб в некоторых платформах распределенных служб (RPC, RMI). С помощью служб именования клиентские приложения могут получать объекты ресурсов, адреса служб и информацию о поставщиках на основе конкретных имен.

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

В реальной разработке проекта мы часто используем .properties или xml для настройки большого количества информации, такой как информация о соединении с базой данных, порт адреса fps и так далее. Поскольку ваша программа обычно распространяется и развертывается на разных машинах (если вы являетесь автономным приложением, когда я этого не говорил), если вы поместите эту информацию о конфигурации программыСохранить узел Znode в ZKДалее, когда вы хотите изменить конфигурацию, то есть, когда Znode изменится, вы можете изменить содержимое узла каталога в zk для использованиянаблюдатель уведомляет каждого клиента, тем самым изменив конфигурацию.

  • Управление кластером

Управление кластером включает в себя мониторинг кластера и управление кластером, по сути, это мониторинг состояния машин кластера, удаление машин и присоединение машин. zookeeper может облегчить управление машинами кластера.Он может отслеживать изменения узлов znode в режиме реального времени.Как только машина окажется неработоспособной, она будет отключена от zk, используемый узел временного каталога будет удален, а все остальные машины получат уведомление. Добавление новых машин также похоже на Jiangzi, и все машины уведомляются: добавлен новый каталог Brother.

3. Интервьюер: Вы упомянули узлы znode. Вы знаете, сколько существует типов узлов znode? Что такое модель данных zookeeper?

Я маленький цыпленок (сначала об этом думаю):

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

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

4 типа узлов

Жизненный цикл узла, Znode может быть классифицирован на четырех типов, а именно, постоянный узел (постоянный), постоянный порядок узлов (PersiStental_ware), временный узел (эфемерный), временный порядок узлов (EPHEMERTAL_WASTION)

  • Постоянный узел (PERSISTENT)

После того, как такие узлы будут созданы, они всегда будут существовать на сервере Zk. до тех пор, пока не будет удалено вручную.

  • Постоянный узел последовательности (PERSISTENT_SEQUENTIAL)

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

  • Эфемерный узел (EPHEMERAL)

Жизненный цикл временной ноды привязан к сеансу клиента, если сеанс клиента недействителен (отключено не-TCP соединение), узел будет автоматически очищен. zk предусматривает, что временные узлы могут использоваться только как конечные узлы.

  • Узел временной последовательности (ephemeral_sequential)

Основные функции такие же, как у временных узлов, с добавлением последовательных функций.

4. Интервьюер: Вы знаете, что хранится в узле znode? Каков максимальный размер данных каждого узла?

Я как курица:

Что хранится в узле znode?

Код узла данных Znode выглядит следующим образом

public class DataNode implements Record {
    byte data[];                    
    Long acl;                       
    public StatPersisted stat;       
    private Set<String> children = null; 
}

Ха-ха, Znode включаетХранить данные, права доступа, ссылки на дочерние узлы, информацию о состоянии узлов, как показано на рисунке:

  • data:Информация о бизнес-данных, хранящаяся в znode
  • ACL:Запишите права доступа клиента к узлу znode, такие как IP и т. д.
  • child:ссылка на дочерний узел текущего узла
  • stat:Содержит информацию о состоянии узла Znode, такую ​​какИдентификатор транзакции, номер версии, Timestampи Т. Д.

Каков максимальный объем данных на узел?

Чтобы обеспечить высокую пропускную способность и низкую задержку, а также согласованность данных, znode подходит только для хранения очень небольших данных, которые не могут превышать 1M, предпочтительно менее 1K.

5. Интервьюер: Вы знаете механизм мониторинга на узле znode? Поговорим о механизме часов Zookeeper.

Я как курица:

  • Наблюдательный механизм
  • Как работает механизм прослушивания
  • Сводка функций Наблюдателя

Наблюдатель механизм мониторинга

Zookeeper позволяет клиенту зарегистрировать прослушиватель Watcher с Znode на сервере.Когда некоторые указанные события на сервере запускают Watcher, сервер отправит уведомление о событии указанному клиенту для реализации функции распределенного уведомления, а затем клиент Следите за Наблюдателем. Уведомляйте о состояниях и типах событий, чтобы вносить изменения в бизнес.

Watcher можно понимать как триггер для регистрации клиента на Znode.При изменении узла Znode (добавление, удаление, изменение и проверка) будет инициировано соответствующее событие регистрации Znode, и зарегистрированный клиент будет получать асинхронные уведомления. , Затем внесите изменения в бизнес.

Как работает механизм мониторинга Watcher

  • Механизм Watcher ZooKeeper в основном состоит из трех частей: клиентский поток, клиент WatcherManager и сервер Zookeeper.
  • Когда клиент регистрирует Watcher на сервере ZooKeeper, он сохраняет объект Watcher в WatchManager клиента.
  • Когда сервер zookeeper запускает событие наблюдателя, он отправляет уведомление клиенту, а клиентский поток извлекает соответствующий объект наблюдателя из WatcherManager для выполнения логики обратного вызова.

Сводка функций Наблюдателя

  • **Однократно.** Событие просмотра — это одноразовый триггер. После срабатывания клиент получит такое сообщение только один раз.
  • ** Асинхронный: ** Сервер Zookeeper асинхронно отправляет события уведомления наблюдателя клиенту, и нельзя ожидать, что он будет отслеживать каждое изменение узла. Zookeeper может гарантировать только окончательную согласованность, но не может гарантировать строгую согласованность.
  • Легкий:Уведомление наблюдателя очень простое, оно только что произошло уведомление о событии и не передает содержимое объекта события.
  • Серийный номер клиента:Процесс выполнения клиентского обратного вызова Watcher представляет собой процесс последовательной синхронизации.
  • Зарегистрируйте наблюдателя с помощью методов getData, exists, getChildren
  • Запустите наблюдатель с помощью методов create, delete, setData

6. Интервьюер: У вас есть определенное представление о структуре данных Zookeeper, тогда вы можете рассказать о характеристиках Zookeeper.

Я маленький цыпленок: (Я выучил книги, ахаха) Zookeeper гарантирует следующие характеристики распределенной согласованности:

  • последовательная согласованность: запросы транзакций от одного и того же клиента в конечном итоге будут применяться к ZooKeeper в строгом порядке.
  • атомарность: Применение результатов обработки всех запросов транзакций на всех машинах всего кластера является консистентным, то есть либо все машины всего кластера успешно применили определенную транзакцию, либо ни одна из них не была применена.
  • один вид: независимо от того, к какому серверу ZooKeeper подключается клиент, модель данных на стороне сервера, которую он видит, одинакова.
  • надежность:После того, как сервер успешно применил транзакцию и завершил ответ клиенту, статус сервера фирмы, вызванный изменениями, будет сохранен.
  • В режиме реального времени (возможная согласованность):Zookeeper может только гарантировать, что в течение определенного периода времени клиент в конечном итоге сможет прочитать последний статус данных с сервера.

7. Интервьюер: Вы только что упомянули о последовательной согласованности.Как Zookeeper обеспечивает последовательную согласованность транзакций?

Я новичок: (Я не смогу этого сделать, когда все закончится)

Этот вопрос можно прочитать в этой статье (ответ на этот вопрос взят из этой статьи):Поговорим о последовательной согласованности ZooKeeper.

Нужно знать идентификатор транзакции, который равен zxid. ZooKeeper выбирает новый главный узел, сравнивая zxid и идентификатор машины каждого узла во время выбора. Zxid генерируется узлом-лидером. Когда происходит новое событие записи, лидер генерирует новый zxid и передает его вместе с предложением. Каждый узел локально сохраняет zxid текущей последней транзакции. имеет больший zxid, это означает, чьи данные актуальны.

Правила генерации ZXID следующие:

ZXID состоит из двух частей:

  • Срок полномочий: после этих выборов и до следующих выборов тот же Лидер отвечает за координацию и написание;
  • Счетчик транзакций: монотонно увеличивается, каждый раз, когда запись вступает в силу, счетчик увеличивается на единицу.

Нижние 32 бита ZXID являются счетчиками, поэтому в течение одного и того же срока ZXID непрерывны, и каждый узел сохраняет свой собственный последний ZXID, что гарантируется путем сравнения ZXID нового предложения и его последнего ZXID на «1». эффект строго по порядку.

8. Интервьюер: Вы упомянули Лидера, знаете ли вы, что у сервера Zookeeper есть несколько ролей? Каковы рабочие состояния сервера под Zookeeper?

Я как курица:

Роль сервера ZooKeeper

В кластере Zookeeper есть три роли: лидер, последователь и наблюдатель.

Leader

Сервер Лидер является ядром всего механизма работы кластера ZooKeeper, его основными задачами являются:

  • Единственный планировщик и обработчик запросов транзакций, обеспечивающий упорядоченность обработки транзакций кластера
  • Планировщик каждой службы в кластере

Follower

Сервер Follower является повторителем состояния кластера ZooKeeper, и его основными задачами являются:

  • Нетранзакционная обработка клиентских запросов, сервер перенаправляет запрос на транзакцию Лидеру
  • Участвовать в запросе на транзакцию Голосование за предложение
  • Примите участие в голосовании на выборах лидера

Observer

Наблюдатель — это роль сервера, представленная в версии 3.3.0, которая действует как роль наблюдателя — наблюдает за последними изменениями состояния кластера ZooKeeper и синхронизирует эти изменения состояния. Это работает:

  • Обрабатывать нетранзакционные запросы от клиентов и перенаправлять транзакционные запросы на сервер Leader
  • не участвовать ни в какой форме голосования

Рабочий статус сервера под Zookeeper

У сервера есть четыре состояния: СМОТРЮ, СЛЕДУЮЩИЙ, ВЕДУЩИЙ, НАБЛЮДАЮЩИЙ.

  • 1.ПОИСК: Ищите статус Лидер. Когда сервер находится в этом состоянии, он будет думать, что в текущем кластере нет лидера, поэтому ему необходимо войти в состояние выбора лидера.
  • 2.FOLLOWING: Статус подписчика. Указывает, что текущая роль сервера — Follower.
  • 3. ВЕДУЩИЙ: Статус лидера. Указывает, что текущая роль сервера — Лидер.
  • 4.НАБЛЮДЕНИЕ: Состояние наблюдателя. Указывает, что текущая роль сервера — Наблюдатель.

9. Интервьюер: Вы сказали, что роль сервера основана на кластере ZooKeeper, так что можете ли вы нарисовать схему развертывания кластера ZooKeeper? Как ZooKeeper обеспечивает согласованность данных между ведущими и подчиненными узлами?

Я как курица:

Схема развертывания кластера ZooKeeper

Кластер ZooKeeper представляет собой основную структуру с несколькими подчиненными:

  • Если данные должны быть записаны, сначала запишите их на главный сервер (главный узел), а затем уведомите подчиненный сервер.
  • Если вы читаете данные, вы можете прочитать как главный сервер, так и подчиненный сервер.

Как ZooKeeper обеспечивает согласованность данных между ведущими и подчиненными узлами

Мы знаем, что кластер представляет собой структуру развертывания master-slave.Для обеспечения согласованности узлов master-slave есть не что иное, как две основные проблемы:

  • Главный сервер зависает или перезагружается
  • Синхронизация данных между главным и подчиненным серверами~

Zookeeper - это протокол Zab (Zookeeper Atomic Troadcast, Zookeeper Atomic Crovcate Protocol) для обеспечения того, чтобы последовательную консистенцию данных узел Master-Allave, поддержку протокола ZABВосстановление после сбоев и рассылка сообщенийЕсть два режима, которые очень хорошо решают эти две проблемы:

  • Восстановление после сбоя: лидер вешает трубку, входит в этот режим и выбирает нового лидера для выхода.
  • Широковещательная передача сообщений: синхронизируйте обновленные данные от лидера со всеми подписчиками.

Сервер-лидер зависает, и все серверы в кластере переходят в состояние LOOKING.Сначала они выбирают новый сервер-лидер, затем новый сервер-лидер синхронизирует данные с сервисом-последователем в кластере.Когда больше половины машин в кластере подключены к серверу-лидеру. После завершения синхронизации данных выйдите из режима восстановления и войдите в режим рассылки сообщений. Сервер Leader начинает получать запрос транзакции клиента, чтобы сгенерировать предложение транзакции для обработки запроса транзакции.

10. Интервьюер: Лидер висит и входит в рекуперацию по выбору аварий. Как вы избрали лидера? Можете ли вы поговорить о предвыборке зоопарка?

Я как курица:

Когда сервер запустится или сервер заработает (лидер зависнет), он войдет в выборы лидера. Давайте посмотрим. Предположим, что сейчас в кластере ZooKeeper пять серверов, и их myid сервер 1, 2, 3, 4, и 5, как показано на рисунке:

Инициированные сервером выборы лидера

Фаза инициализации кластера Zookeeper, сервер (myid=1-5)по очередиНачало, начало выборов Лидер зоопарка~

  • Сервер 1 (myid=1) запущен, в данный момент есть только один сервер и выборы лидера не могут быть завершены
  • Сервер 2 (myid=2) запущен, в это время два сервера могут общаться друг с другом и начинают входить в стадию выбора лидера
  1. Один голос на сервер

В качестве серверов-лидеров голосуют как сервер 1, так и сервер 2. Базовые элементы голосования включают в себя: myid сервера и ZXID, который мы представляем в виде (myid, ZXID). На начальном этапе и сервер 1, и сервер 2 будут голосовать за себя, то есть голос сервера 1 равен (1,0), а голос сервера 2 равен (2,0), а затем каждый будет отправлять это голосовать за все остальные машины в кластере.

  1. Принимать голоса с разных серверов

Каждый сервер принимает голоса с других серверов. При этом сервер проверит действительность голосования, является ли это текущим туром голосования, и не от сервера ли оно в состоянии ПРОСМОТР.

  1. Обработка голосов

После получения голосов других серверов, голоса получателей будут совмещены с их собственными голосами.Правила PK следующие:

  • Приоритетная проверка ZXID. ZXID больший приоритет сервера как лидера.
  • Если ZXID одинаковый, сравнивается myid, и в качестве лидера используется сервер с большим myid.

Голос сервера 1 равен (1,0), полученный им голос равен (2,0), а оба zxid равны 0, потому что полученный myid=2 больше, чем его собственный myid=1, поэтому он обновляет свой голос (2,0), а затем повторно отправить голосование. Что касается сервера 2, то есть уже не нужно обновлять собственное голосование, достаточно отправить последнюю информацию о голосовании.

  1. подсчет голосов

После каждого голосования сервер будет подсчитывать все голоса, чтобы определить, получили ли более половины машин одинаковую информацию о голосовании. Сервер 2 получил два голоса, меньше 3 (n/2+1, n — это общее количество серверов), поэтому продолжайте поддерживать состояние LOOKING.

  • Сервер 3 (myid=3) запускается и продолжает входить в стадию выбора лидера

В соответствии с предыдущим процессом серверы 1 и 2 голосуют первыми, потому что сервер 3 имеет самый большой myid, поэтому вместо этого все голосуют за него. В это время сервер имеет 3 голоса (больше или равно n/2+1), поэтому сервер 3 выбирается лидером. Сервер 1, 2 меняет состояние на СЛЕДУЮЩИЙ, сервер 3 меняет состояние на ВЕДУЩИЙ;

  • Запускается сервер 4 и инициируются выборы.

В это время сервер 1, 2, 3 больше не выглядит и просматривать информацию, и информация о бюллетене не изменится. Информация о голосовании Результат: Сервер 3 - 3 голоса, сервер 4 - 1 голос. Сервер 4 и изменение статуса, следующего;

  • Запускается сервер 5 и инициируются выборы.

Таким же образом сервер также голосует за сервер 3 и сервер 5 и меняет статус на СЛЕДУЮЩИЙ;

  • Голосование завершено, сервер 3 выбран лидером

Выборы лидера во время работы сервера

Работают пять серверов (myid=1-5) кластера zookeeper, и вдруг в какой-то момент зависает сервер-лидер 3, и в это время начинаются выборы лидера~

  • 1. Изменить статус

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

  • 2. Каждый сервер инициирует голосование

Каждый сервер голосует сам за себя, и, поскольку он работает, ZXID может быть разным для каждого сервера. Предполагая, что zxids сервисов 1, 2, 4 и 5 равны 333 666 999 888 соответственно, генерируются голоса (1 333), (2 666), (4 999) и (5 888), а затем голоса отправляются на все остальные машины в кластер. .

  • 3. Принимать голоса с разных серверов
  • 4. Обработать голосование

Правила голосования такие же, как и при запуске кластера Zookeeper, первым проверяется ZXID, а лидером является тот, который больше, поэтому очевидно, что сервер zxid=999 имеет приоритет.

  • 5. Статистическое голосование
  • 6. Измените статус сервера

11. Интервьюер: Ранее вы упомянули, что использовали распределенную блокировку Zookeeper в проекте, можете рассказать о принципе реализации распределенной блокировки zk?

Я как курица: Zookeeper использует функцию временного последовательного узла для реализации распределенных блокировок.

  • Процесс получения блокировки (создайте временный узел, проверьте минимальный порядковый номер)
  • Снять блокировку (удалить временный узел, прослушать уведомления)

Процесс приобретения замков

  • Когда первый клиент запрашивает, клиент ZooKeeper создает постоянный узел /LOCKS. Если он (Client1) хочет получить блокировку, вам необходимо создать последовательный узел LOCK1 в узле Locks.

  • Затем клиент Client1 будет искать все дочерние узлы временной последовательности, находящиеся под блокировками, и определять, является ли его собственный узел lock1 с наименьшим порядком.Если это так, он успешно получит блокировку.

  • В это время, если другой клиент client2 попытается получить блокировку, он создаст еще один временный узел lock2 под блокировками.

  • Клиент client2 также будет искать все подузлы временной последовательности под блокировками, чтобы определить, является ли его собственный узел lock 2 наименьшим.В это время он обнаруживает, что lock1 является наименьшим, поэтому получение блокировки не удается. Если ему не удастся получить блокировку, она не будет согласована.Клиент2 регистрирует событие Watcher со своим высшим узлом lock1, чтобы отслеживать, существует ли блокировка1, то есть клиент2 не может захватить блокировку и переходит в состояние ожидания.

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

  • Точно так же client3 также будет искать все дочерние узлы временной последовательности под блокировками и определять, является ли его собственный узел lock3 наименьшим.Если он обнаружит, что он не наименьший, он не сможет получить блокировку. Он не будет сверяться, он зарегистрирует событие Watcher с узлом lock2 перед ним, чтобы отслеживать, существует ли узел lock2.

разблокировать замок

Давайте посмотрим на процесс выпуска замков, зоокедраЗавершение или неудача бизнеса клиента, удалит временный узел и снимет блокировку. Если задача выполнена, Client1 явно вызовет инструкцию по удалению блокировки1.В случае сбоя клиента блокировка1 будет автоматически удалена в соответствии с характеристиками временного узла.После того, как узел lock1 удален, Client2 счастлив, потому что он прослушивал lock1. Если узел lock1 будет удален, Client2 получит уведомление немедленно, а также будет искать все подузлы временной последовательности под замками.Если lock2 наименьший, блокировка будет получена.

Точно так же Client2 после получения блокировки также присматривается к Client3, ах-ха ~

12. Интервьюер: ОК, последний вопрос, и вы говорите об отношениях даббо Zookeeper это, Почему Zookeeper в качестве реестра?

Я маленький цыпленок (я ответил на столько вопросов, не дашь ли ты мне его еще?):

Центр реестра dubbo может выбрать Zookeeper, memcached, redis и т. д. Почему стоит выбрать Zookeeper из-за его возможностей~

  • Назовите службу.Поставщик службы записывает URL-адрес в назначенный узел Zookeeper для завершения выпуска службы.
  • Балансировка нагрузки, несущая способность реестра ограничена, и кластер Zookeeper может легко достичь балансировки нагрузки с веб-приложениями.
  • zk поддерживает мониторинг событий, что особенно подходит для сценариев публикации/подписки.Производители и потребители Dubbo аналогичны этому сценарию.
  • Модель данных проста, и данные хранятся в памяти, что можно охарактеризовать как высокую производительность.
  • Другие функции Zookeeper можно убрать и обсудить~

Личный публичный аккаунт

Ссылка и спасибо