2015-06-16 2 views
7

Я пытаюсь понять ровно какие проблемы Apache ZooKeeper («ZK») решает, и, возможно, их Recipes page - лучшее место для начала.Рецепты ZooKeeper и куратор Apache

Во-первых, я делаю следующие предположения:

  • The Zookeeper API (доступный как в Java и C) выставляет these 7 simple methods, которые затем позволяют создавать свои собственные модели использования, известные как " ZK Рецепты»
  • это потом до вас, чтобы использовать эти ZK рецепты для решения проблем в распределенном программировании себя
  • Или, вместо того, чтобы строить вверх свой собственный ZK Рецепты, вы можете использовать только те, которые поставляются с Apache Curator
  • Так или иначе, вы используете ZK Рецепты (опять же, доморощенные или предоставляемый Хранитель) для решения распределенных вычислительных задач

Я считаю, что Apache Kafka является примером того, где Кафка использует ZK создать distributed Queue (который является одним из перечисленных рецептов ZK). Поэтому, если мои предположения верны, ZK предоставляет эти API-методы, и создатели Apache Kafka либо использовали ZK напрямую, либо использовали куратор для реализации «Queue» ZK Recipe.

Если какое-либо из приведенных выше допущений неверно, начните с исправления! Предполагая, что я более или менее на трассе:

Глядя на список ZK Рецепты, я вижу следующее (не исчерпывающий):

  • Барьеры
  • Замки
  • Лидер Избирательные

Для того, чтобы оценить эти рецепты и предлагаемые ими решения, мне сначала нужно оценить проблему, которую они решают! Я понимаю, что такое блокировка от базового параллелизма Java, но я просто не вижу случая использования, когда когда-либо понадобится «распределенная блокировка». Для ведущих выборов все, что я могу придумать, в качестве варианта использования для , в котором нужно, в первую очередь - было бы, если бы вы создавали приложение, которое вы хотели отправить с помощью встроенного master/slave или первичной/вторичной возможности , Возможно, в этом случае вы использовали бы ZK для реализации собственного рецепта «Лидерские выборы» или, возможно, просто используйте Leader Latch Куратора. Что касается барьеров, я не вижу, как они отличаются от Locks. Так что я спрашиваю:

  • Является ли мой главный/подчиненный или основной/вторичный вопрос точным прецедентом для рецепта выбора лидера ZK?
  • Что было бы примером распределенной блокировки? Какие проблемы решаются?
  • То же для барьеров: и в чем разница между замками и барьерами?

ответ

5
  1. Да. Пример вашего рецепта выбора лидера Zk - правильный. В общем, если рецепт уже существует, зачем его переписывать?

Цитирование Zookeeper документации:

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

  1. Что касается распределенных блокировок - Допустим, у вас есть распределенная система, где все настройки сохраняются на Zookeeper, и более чем одна организация отвечает за обновление определенной конфигурации - В таком случае вы хотите конфигурацию обновления должны быть синхронными.

  2. Что касается барьера, то я лично их никогда не использовал - но с замком вам нужно приобрести замок, чтобы на самом деле что-то сделать на узле, барьер, который вы ждете, пока он свободен, но необязательно нужно устанавливать барьер один раз это бесплатно.

+0

thankyou - когда вы говорите «* Предположим, у вас есть распределенная система, в которой все конфигурации сохранены на ZooKeeper ... *», я не понимаю, что вы подразумеваете под «* конфигурацией *». Вы имеете в виду «файлы конфигурации?» Например, если 'myapp.war' обычно принимает файл конфигурации' myapp.conf' во время выполнения, вы говорите, что ZK можно использовать для хранения 'myapp.conf' для всех узлов, работающих под управлением' myapp.war'? Или вы имеете в виду что-то еще? – DirtyMikeAndTheBoys

+1

Вместо использования myapp.conf вы можете использовать ZK, или, альтернативно, когда ваше приложение начнет сохранять все конфигурации myapp.conf в ZK, а затем они доступны для всей вашей системы. Таким образом, вы также можете обновить их во время выполнения. Если пользователь вашего приложения, например, может изменить конфигурацию системы, он может быть сохранен на ZK, а только в памяти, который является постоянным. –

+0

еще раз спасибо @Uri Shalit (+1 еще раз) - Извините, но я должен задать еще один вопрос: как именно я могу сохранить 'myapp.conf' в ZK? Имеет ли ZK базу данных, которую она использует (если да, то что такое БД)? Какие методы API я могу вызвать для сохранения/обновления конфигураций 'myapp.conf'? Например, скажем, что один config - это 'appPort', который в' myapp.conf' хранится как 'appPort = 9200'. Какой пример API-вызова я могу сделать, чтобы обновить 'appPort', чтобы быть, скажем, 9300? Еще раз спасибо! – DirtyMikeAndTheBoys