В этом примере мы используем Java 3.4.6. Пример удобен для всех, чтобы обсудить, если вы не понимаете после изучения его.
Привязка Java Zookeeper Java для разработки приложений в основном состоит из двух пакетов Java:
org.apache.zookeeper
org.apache.zookeeper.data
Пакет org.apache.zookeeper состоит из определения интерфейса, контролируемого Zookeeper, и различных обработчиков обратного вызова для Zookeeper. Он определяет основные классы библиотеки классов клиентов Zookeeper, а также статические определения многих типов событий и состояний Zookeeper. Пакет org.apache.zookeeper.data определяет функции, связанные с регистрами данных (также известными как Znodes), такие как списки управления доступом (ACL), идентификаторы, статистика и т. Д.
Org.apache.zookeeper.server, org.apache.zookeeper.server.quorum и org.apache.zookeeper.server.upgrade Packages в Zookeeper Java API являются частью реализации сервера. Пакет org.apache.zookeeper.client используется для запроса состояния сервера Zookeeper.
Подготовьтесь к среде развития
Apache Zookeeper - это сложное программное обеспечение, поэтому он требует много других классовых библиотек. Библиотека зависимостей включена в каталог LIB в качестве файла JAR в распределении ZooKeeper. Основное имя файла Zookeeper JAR-Zookeeper-3.4.6.jar, расположенный в домашнем каталоге.
Чтобы разработать приложение Java Zookeeper, мы должны установить путь Classpath в Zookeeper Jar и все сторонние библиотеки, от которых зависит Zookeeper. В каталоге Bin есть файл Zkenv.sh, который можно использовать для установки ClassPath.
Нам нужно установить сценарий следующим образом и выполнить следующее оператор в командной строке:
$ Zoobindir = $ {zk_home}/bin $ source $ {zoobindir} /zkenv.shПеременная оболочка zk_home установлена на путь для установки Zookeeper, в моих настройках это/usr/share/Zookeeper. После этого переменнаячавой группы устанавливается правильно, в моей системе, как это:
$ echo $ classpath/susr/share/zookeeper-3.4.6/bin/../build/classes:/usr/share/zookeeper-3.4.6/bin /../ build/lib/*. : /usr/share/zookeeper-3.4.6/bin /../ lib/slf4j-api-1.6.1.jar:/ushr/share/zookeeper-3.4.6/bin /../ lib/netty-3.7.0.final.jar: /usr/share/zookeeper-3.4.6/bin /../1.1.1. : /usr/share/zookeeper-3.4.6/bin /../ lib/jline-0.9.94.jar: /usr/share/zookeeper-3.4.6/bin /../ zookeeper-3.4.6.jar:/ushare/zookeeper-3.4.6/bin /../ src/java/* : /usr/share/zookeeper-3.4.6/bin /../ conf:
В операционной системе Windows вам необходимо запустить сценарий Zkenv.cmd. Теперь вы можете использовать переменную ClassPath для компиляции и запуска программ Java, написанных с использованием API Zookeeper. Сценарий Zkenv.sh можно найти в файле .bashrc домашнего каталога в Uni/Linux, чтобы избежать его использования каждый раз, когда начинается сеанс оболочки.
Вторая первая программа зоопереда
Чтобы представить Zookeeper Java API, давайте начнем с очень простой программы, которая может подключаться к экземпляру Zookeeper в Localhost, и если соединение будет успешным, оно будет распечатать список Znodes под корневым путем пространства имен Zookeeper.
Код для этой программы заключается в следующем:
/*Наша первая программа Zookeeper*/import java.io.ioexception; import java.util.arraylist; import java.util.list; import org.apache.zookeeper.keeperexception; import org.apache.zookeeper.zookeeper; public classokeeper {public void void main (string] arws rows rows rows rows rows rows rows rows rows rows rows rows rows prowex string) "Localhost: 2181"; string zpath = "/"; list <string> Zoochildren = new ArrayList <string> (); Zookeeper zk = new Zookeeper (hostport, 2000, null); if (zk! = null) {try {zoochildren = zk.getchildren (zpath, false); "); for (String Child: Zoochildren) {// printion the Childrensystem.out.println (kild);}} catch (geatherexception e) {e.printstacktrace ();} catch (urruptedException e) {e.printstacktrace ();}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}Прежде чем создавать и выполнять предыдущий фрагмент кода, давайте посмотрим, что он делает конкретно. Код начинается с оператора импорта. Используя эти утверждения, мы импортируем пакеты, требуемые каждым компонентом программы. Как упоминалось ранее, пакет org.apache.zookeeper содержит все классы и интерфейсы, необходимые клиенту для взаимодействия с сервером Zookeeper. После импорта пакета определяется класс с именем hellozookeeper. Поскольку мы подключаемся к экземпляру Zookeeper, работающему в одной и той же системе, определите цепочки хоста и порта, как Localhost: 2181 в основном методе. Строка кода ZK = New Zookeeper (Hostport, 2000, NULL) вызывает конструктор Zookeeper, который пытается подключиться к серверу Zookeeper и возвращает ссылку. Для клиентских программ, которые подключаются к экземпляру сервера Zookeeper и поддерживают это соединение, требуется сеанс в реальном времени. В этом примере ссылка, возвращаемая объектом ZK, созданным конструктором, представляет сеанс. API Zookeeper построен вокруг этой ссылки, и каждый вызов метода требует ссылки для выполнения.
Конструктор класса Zookeeper использует следующий код для создания ссылки на экземпляр Zookeeper:
Zookeeper (String ConnectString, Int SessionTimeout, Watcher Watcher)
Используемые параметры следующие:
ConnectString: Hoard Spearted Host: список номеров портов, каждый из которых соответствует серверу Zookeeper. Например, 10.0.0.1:2001, 10.0.0.2:2002 и 10.0.0.3:2003 Представляют действительный хост: пары сопоставления порта для ансамблей Zookeeper трех узлов. SessionTimeout: Это тайм -аут сеанса в миллисекундах. Это время, когда Zookeeper не получил сердцебиение от клиента, прежде чем объявить об окончании сеанса. Наблюдатель: объект наблюдателя, который уведомляется, если создается при изменении состояния и события узлов. Этот объект наблюдателя должен быть создан отдельно через пользовательский класс, который реализует интерфейс наблюдателя и передает созданный объект конструктору Zookeeper. Клиентские приложения могут получать уведомления о различных типах событий, таких как отсутствующие соединения, истечение сессий и т. Д.
Zookeeper Java API определяет дополнительный конструктор с тремя параметрами для указания более продвинутых операций. Код заключается в следующем:
Zookeeper (String ConnectString, Int SessionTimeout, Watcher Watcher, Boolean Canbereadonly)
В приведенном выше конструкторе класса Zookeeper, если установить True, логический параметр Canbereadonly позволяет созданному клиенту вводить режим только для чтения в случае сетевого разделения. Режим только для чтения-это сценарий, в котором клиент не может найти большинство серверов, но есть доступный сервер разделов для подключения к нему в режиме только для чтения, который разрешает запросы чтения на сервер, в то время как запросы на запись не допускаются. Клиент продолжает пытаться подключиться к большинству серверов на заднем плане, оставаясь только чтением. Сервер раздела - это всего лишь подмножество группы Zookeeper, которая сформирована из -за распределения сети в кластере. Большинство серверов составляют большинство кворумов в ансамбле.
Следующий конструктор показывает определение двух дополнительных параметров:
Zookeeper (String ConnectString, Int SessionTimeout, Watcher Watcher, Long SessionId, Byte [] SessionPasswd)
Этот конструктор позволяет объекту клиента Zookeeper создавать два дополнительных параметра:
SessionId: в случае, когда клиент воссоединяется с сервером ZooKeeper, конкретный идентификатор сеанса может использоваться для обозначения ранее подключенного SessionPasswd: если указанный сеанс требует пароля, вы можете указать его здесь
Следующий конструктор представляет собой комбинацию первых двух вызовов:
Zookeeper (String ConnectString, Int SessionTimeout, Watcher Watcher, Long SessionId, Byte [] SessionPasswd, Boolean Canbereadonly)
Этот конструктор представляет собой комбинацию первых двух вызовов, позволяющих переподключение с указанным сеансом с включенным режимом только для чтения.
Примечание
Подробную документацию Java API для класса Zookeeper может быть запрошена по адресу http://zookeeper.apache.org/doc/r3.4.6/api/index.html.
Теперь вернемся к нашей программе Zookeeper. После вызова конструктора, если соединение будет успешным, мы получим ссылку на сервер Zookeeper. Мы передаем ссылку на метод GetChildren через следующий код:
Zoochildren = zk.getChildren (Zpath, false)
Метод GetChildren (String Path, Boolean Watch) класса Zookeeper возвращает список детей Znode на данном пути. Мы просто перечитываем список, возвращенный этим методом, и печатаем строку на консоли.
Назовите программу hellozookeeper.java и составьте нашу программу следующим образом:
$ javac -cp $ classpath hellozookeeper.java
Прежде чем запустить программу, нам нужно запустить экземпляр сервера Zookeeper, используя следующую команду:
$ $ {Zk_home} /bin/zkserver.sh StartЗапустите программу следующим образом:
$ java -cp $ classpath hellozookeeper
Исполнитель будет распечатать сообщение журнала на консоли, отображая версию Zookeeper, версию Java, Java ClassPath, Architecture Server и т. Д. Используется. Вот некоторые из этих сообщений журнала:
Сообщения журнала, сгенерированные Zookeeper Java API, очень полезны для отладки. Он предоставляет нам информацию о клиенте, подключенном к серверу Zookeeper, создавая сеанс и другой фон. Последние три сообщения журнала, показанные выше, рассказывают нам, как клиент запускает соединение, используя параметры, указанные в программе, и как сервер назначает идентификатор сеанса клиенту после успешного соединения.
Наконец, выполнение программы, наконец, выводит следующее в консоли:
Мы можем использовать оболочку Zookeeper, чтобы проверить правильность программы:
$ $ Zk_home/bin/zkcli.sh -server localhost
Поздравляю! Мы просто успешно написали нашу первую клиентскую программу Zookeeper.
Во -вторых, реализовать интерфейс наблюдателя
Мониторинг наблюдателя Zookeeper позволяет клиентам получать уведомления от серверов Zookeeper и обрабатывать эти события, когда они возникают. Zookeeper Java API предоставляет открытый интерфейс под названием Watcher, который класс обработчиков событий клиента должен реализовать для получения уведомлений о событиях о событиях с сервера Zookeeper. Программно, приложения, использующие такие клиенты, обрабатывают эти события путем регистрации объектов обратного вызова клиента.
Мы будем реализовать интерфейс Watcher для обработки событий, сгенерированных Zookeeper при изменении данных, связанных с Znode.
Интерфейс Watcher объявлен следующим образом в пакете org.apache.zookeeper:
Public Interface Watcher {void Process (WatchedEvent Event);}Чтобы продемонстрировать монитор данных Znode (наблюдатель), есть два класса Java: DataWatcher и DataUpdater. DataWatcher будет работать все время и прослушивать события nodedatachange с сервера Zookeeper в указанном пути /myConfig. Класс DataUpdater будет периодически обновлять поля данных в этом пути Znode, который будет генерировать события, и после получения этих событий класс DataWatcher будет печатать измененные данные в консоли.
Ниже приведен код класса datawatcher.java:
Импорт java.io.ioexception; import org.apache.zookeeper.createmode; import org.apache.zookeeper.sokeerexception; import org.apache.zookeeper.watchedevent; import org.apache.zookeeper.watcher; импорт org.apache.zookeeper.zoodefs; org.apache.zookeeper.zookeeper; открытый класс Datawatcher реализует наблюдатель, Runnable {private Static String hostport = "Localhost: 2181"; частная статическая строка zodatapath = "/myconfig"; byte Zoo_data [] = null; zookeeper zk; public Datawatcher () {try {zk = Zokeeper, zookeeper; 2000, это); if (zk! = Null) {try {// Создать Znode, если его не существует, со следующим кодом: if (zk.exists (zodatapath, это) == null) {zk.create (zoodatapath, ".getbytes (), zoodefs. (KeeperException | прерывание Exception e) {e.printstacktrace ();}}} catch (ioexception e) {e.printstacktrace ();}} public void printdata () throws urrowstexception, keeperexception {zoo_data = zk.getdata (zodapath, это, null); String (ZOO_DATA); // Следующий код печатает текущее содержание Znode to the Console: System.out.printf ("/ncurrent Data @ zk Path %s: %s", Zodatapath, Zstring);} @ overridepublic process (watchedevent vente) {System.out.printf ("/nevIdepublic void (watchedevent vent) {system.out.printf ("/nevint: %s ") обрабатывать только события типа nodedatachangedif (event.gettype () == event.eventtype.nodedatachanged) {try {printData ();} catch (прерывание E.printStackTrace (). Прерывание Extexception, KeeperException {dataWatcher dataWatcher = new DataWatcher (); DataWatcher.printData (); dataWatcher.run ();} public void run () {try {synchronized (this) {while (true) {wait ();}} catch (trevruptedexcept {e.printstacktrace (); thread.currentthread (). Enterrupt ();}}}Давайте посмотрим на код класса DataWatcher.java, чтобы понять реализацию монитора Zookeeper. Общедоступный класс DataWatcher реализует интерфейс Watcher и выполняемый интерфейс и намеревается запустить монитор в качестве потока. Основной метод создает экземпляр класса DataWatcher. В предыдущем коде конструктор DataWatcher пытается подключиться к экземпляру Zookeeper, работающему на Localhost. Если соединение успешно, мы используем следующий код, чтобы проверить, существует ли Znode Path/MyConfig:
if (zk.exists (zodatapath, это) == null) {Если Znode не существует в пространстве имен Zookeeper, вызов метода Exists возвращает NULL и попытайтесь создать его в качестве постоянного Znode, используя код следующим образом:
zk.create (zodatapath, "" .getbytes (), zoodefs.ids.open_acl_unsafe, createmode.persistent);
Следующим является метод процесса, который объявлен в интерфейсе Watcher org.apache.zookeeper и реализован классом DataWatcher с использованием следующего кода:
public void Process (Смотрите событие) {Для простоты, в методе процесса, события, полученные от экземпляра Zookeeper, напечатаны, и только события типа NodedAtachanged далее обрабатываются следующим образом:
if (event.getType () == event.eventtype.nodedatachanged)
Когда какое -либо обновление или изменение происходит в поле данных пути Znode Path/MyConfig, и получено событие типа NodedAtachaged, метод PrintData вызывается для печати текущего содержимого Znode. При выполнении вызова getData на Znode мы снова установили монитор, который является вторым параметром метода, как показано в следующем коде:
zoo_data = zk.getData (Zodatapath, this, null);
Мониторинг событий-это одноразовые триггеры, отправляемые клиентам, которые устанавливают мониторинг. Чтобы постоянно получать дополнительные уведомления о событиях, клиенты должны сбросить монитор.
DataUpdater.java - это простой класс, который подключается к экземпляру Zookeeper, использующему LocalHost и обновляет поле данных пути Znode Path/MyConfig со случайной строкой. Здесь мы решили обновить Znode по универсальной уникальной строке идентификатора (UUID), потому что последующие вызовы генератора UUID гарантируют генерацию уникальных строк.
Код класса DataUpdater.java выглядит следующим образом:
Импорт java.io.ioexception; import java.util.uuid; import org.apache.zookeeper.shiperexception; import org.apache.zookeeper.watchedevent; import org.apache.zookeeper.watcher; импорт org.apache.zookeeper.zookeeper; "Localhost: 2181"; частная статическая строка zodatapath = "/myconfig"; Zookeeper zk; public DataUpdater () Throws ioException {try {zk = new Zookeeper (hostport, 2000, this);} catch (ioException e) {e.printStackTrace ();} // uppectAts ZnIge u) ZnIGE -nameS -nameSforce/upecte -name uly -name uly -name uly -names/upecte -vig elights/upecte znig e) {e.printstacktrace (); новая uuid string.public void run () бросает прерывания, прерывания, heaperException {while (true) {string uuid = uuid.randomuuid (). tostring (); byte zoo_data [] = uuid.getbytes (); zk.setdata (zodatapath, zoot_data); {Thread.sleep (5000); // Сон в течение 5 секунд} catch (прерывание Exception e) {thread.currentThread (). Enterrupt ();}}} public static void main (string [] args) throwsioException, rewruptedException, keeperexception {dataupdater dataupdater = new DataUpdater (); {System.out.printf ("/nevent получил: %s", event.tostring ());}}Приведенный выше код приводит к тому, что сервер Zookeeper запускает событие NodedatAChanged. Поскольку DataWatcher устанавливает мониторинг для этого пути Znode, он получает уведомления о событиях изменения данных. Затем он получает обновленные данные, сбрасывает мониторинг и печатает данные на консоли.
Используйте следующую команду для составления классов DataWatcher и DataUpdater:
$ javac cp $ classpath datawatcher.java $ javac cp $ classpath dataupdater.java
Чтобы выполнить программу монитора и обновления, необходимо открыть два терминала. Сначала я хочу запустить монитор, потому что он создает Znode of /myConfig (если он не был создан в пространстве имен Zookeeper). Перед запуском монитора убедитесь, что сервер Zookeeper работает на локальном хосте.
В одном из окон к терминалу выполните класс наблюдателя, выполнив следующую команду:
$ java cp $ classpath datawatcher
Вывод сообщения, аналогично тому, что показано на следующем скриншоте:
Как показано на предыдущем скриншоте, Znode Path/MyConfig создается классом DataWatcher. Он также печатает содержимое Znode, но не в консоли, потому что мы не устанавливаем никаких данных при создании Znode. Когда Znode создается, монитор в классе получает уведомление о событии типа Nodecreated, которое напечатано в консоли. Класс DataWatcher продолжает работать и слушать события на узле /myConfig с сервера Zookeeper.
Давайте запустим класс DataUpdater в другом окне терминала:
$ java -cp $ classpath dataupdater
После регистрации начального сообщения журнала, специфичного для зоо, в консоли класс DataUpdater работает без подсказки. Он устанавливает новую строку UUID в поле данных пути Zookeeper/myConfig. Итак, смотрите, что каждые 5 секунд, вывод, отображаемый на рисунке с экраном ниже, напечатан в окне терминала, работающая с DataWatch:
DataWatcher также может быть протестирован с использованием оболочки Zookeeper. Продолжайте запускать класс DataWatcher в терминале, как и раньше, и вызовите оболочку Zookeeper в другом терминале и запустите команду, показанную на следующем скриншоте:
В терминале, где работает DataWatcher, напечатано следующее сообщение:
Три примера - монитор кластера
Популярные услуги, предоставляемые через Интернет, такие как электронная почта, платформы для обслуживания файлов, онлайн -игры и т. Д., Служаются сотнями или тысячами серверов, которые широко доступны в нескольких центрах обработки данных, которые часто географически разделены. В таком кластере некоторые выделенные узлы сервера настроены для мониторинга деятельности серверов, которые обслуживают службы или приложения в производственной сети. В среде облачных вычислений такие узлы мониторинга, которые также используются для управления облачной средой, называются облачными контроллерами. Важной задачей этих узлов контроллера является обнаружение сбоев на производственных серверах в режиме реального времени и соответствующим образом уведомлять администраторов, а также принятие необходимых мер, таких как сбой по поводу приложений на неудачном сервере на другой сервер, обеспечение достойки неисправности и высокой доступности.
В этом разделе мы будем использовать API Zookeeper Java Client для разработки минималистской модели монитора распределенного кластера. Использование эфемерной концепции Znode от Zookeeper для создания этой модели мониторинга довольно проста и элегантно, как описано на следующих шагах:
Каждый производственный сервер запускает клиента Zookeeper в качестве демона. Этот процесс подключается к серверу Zookeeper и создает эфемерный Znode с именем (предпочтительно его сетевое имя или имя хоста) под предварительно определенным путем пространства имен /Zookeeper (например /членов). Узел Cloud Controller запускает процесс монитора Zookeeper, который отслеживает пути/участники и прослушивает события типа NodechildrenChanged. Этот процесс монитора работает как служба или демон, устанавливает или сбрасывает мониторинг по пути и реализует его логику для вызова соответствующих модулей, чтобы предпринять необходимые действия для мониторинга событий. Теперь, если производственный сервер выключен из -за сбоя аппаратного обеспечения или сбоя программного обеспечения, клиент -процесс Zookeeper прекращается, что приводит к прекращению сеанса между сервером и службой Zookeeper. Поскольку свойства эфемерных Znode уникальны, служба Zookeeper автоматически удаляет Znode в пути/членах всякий раз, когда клиентское соединение будет закрыто. Удаление Znode на пути повышает событие NodechildrenChanged, поэтому процесс наблюдателя в облачном контроллере уведомляется. Вызывая метод GetChildren в пути/членах, вы можете определить, какой узел сервера был закрыт. Узел контроллера может затем принять соответствующие меры, такие как выполнение логики восстановления, чтобы перезапустить неудачную службу на другом сервере. Эта логика может быть построена для работы в режиме реального времени, обеспечивая почти не простоя и очень доступные услуги.
Чтобы реализовать эту модель мониторинга кластера, мы разработаем два класса Java. Класс Clustermonitor будет непрерывно запускать монитор для мониторинга пути/членов в дереве Zookeeper. После обработки поднятого события мы распечатаем список Znode в консоли и сбросим мониторинг. Другой класс ClusterClient запустит соединение с сервером Zookeeper и создаст эфемерный Znode Under /Memport.
Чтобы моделировать кластер с несколькими узлами, мы запускаем несколько клиентов на одном компьютере и создаем эфемерный Znode, используя идентификатор процесса клиентского процесса. Просмотрев идентификацию процесса, класс Clustermonitor может определить, какой клиент -процесс был закрыт, а какие все еще существуют. В практических случаях клиентские процессы обычно создают эфемерный Znode, используя имя хоста в настоящее время работающего сервера. Исходные коды для этих двух классов показаны ниже.
Класс ClusterMonitor.java определяется следующим образом:
Импорт java.io.ioexception; import java.util.list; import org.apache.zookeeper.createmode; import org.apache.zookeeper.keeperexception; import org.apache.zookeeper.watchedevent; import org.apache.zookeeper.watcher; org.apache.zookeeper.zookeeper; public class clustermonitor реализует runnable {private static String kensiproot = "/members"; private final Final Shower ConnectionWatcher; private final Watcher Kidswatcher; private Zookeeper zk; Bolean Alive = true; public clustermonit {@OverridePublic void Process (WatchEdevent Event) {if (event.getType () == watcher.event.eventtype.none && event.getState () == watcher.event.shiperstate.syncconnected) {system.out.printf ("/nevent.tepstate., event.tostring (); Watcher () {@OverridePublic void Process (WatchedEvent Event) {System.out.printf ("/nevent получил: %s", event.tostring ()); if (event.getType () == Event.eventtype.nodechildrenchagd) {try {// get current Znode, // resset the WatchList) {try {// get Znode Znode, // resset the watchliled Zncheld Znchelld Znchelld Znchelld <Stryld ZNCHELD. Членство, это); Wall ("!! изменение членства в кластере !!!); Wall (" members: " + дети);} catch (geatherexception e) {throw new runtimeexception (e);} catch (прерывание Extexception e) {Thread.currentThread (). Enterrupt (); живой = false; throw runtimexcept Zookeeper (Hostport, 2000, ConnectionWatcher); // Убедитесь, что родительский Znode существует (zk.exists (kensiproot, false) == null) {zk.create (членство в классе, "clustermonitorroot" .getbytes (), ids.open_acl_unsafe, createmode.persistent); Znodelist <string> childres = zk.getchildren (членство, дети kidswatcher); system.err.println ("members:" + дети);} public synchronized void close () {try {zk.close ();} catch (urterruptexception e) {e.printStc {System.out.printf ("/nmessage: %s", message);} public void run () {try {synchronized (this) {while (wival) {wait ();}}} catch (urruptedException e) {e.printstacktrace (); tread.currentThread (). void main (string [] args) бросает ioException, прерывания, useerException {if (args.length! = 1) {system.err.println ("Использование: clustermonitor <host: port>"); System.exit (0);} String hostport = args [0]; new Clustermonitor (hostport) .run ();Класс ClusterClient.java определяется следующим образом:
Импорт java.io.ioexception; импорт java.lang.management.managemagefactory; import org.apache.zookeeper.createmode; import org.apache.zookeeper.keeperexception; import org.apache.zookeeper.watchedevent; import org.apache.zookeeper.wather; org.apache.zookeeper.zoodefs.ids; import org.apache.zookeeper.zookeeper; public class clusterclient watcher, runnable {private static String kensiprot = "/emporting"; Zookeeper zk; public clusterClient (String Hostport, Long pid) {String ProcessiD = PID. Zookeeper (Hostport, 2000, This);} Catch (ioException e) {e.printStackTrace ();} if (zk! = Null) {try {zk.create (членство root + '/' + processId, processId.getbytes (), ids.open_Unsfe, createmode.epection); e) {e.printstacktrace ();}}} public synchronized void close () {try {zk.close ();} catch (прерывание Exception e) {e.printstacktrace ();}}@переопределитель event.tostring ());} public void run () {try {synchronized (this) {while (true) {wait ();}}} catch (прерывание Entexception e) {e.printstacktrace (); thread.currentThread (). enterrupt ();} наконец {this.close ();} vidte void void void void void void void void videss (); (args.length! = 1) {System.err.println ("Использование: clusterClient <host: port>"); System.Exit (0);} String hostport = args [0]; // Получить процесс идентификатор идентификатор = ManagementFactory.getRuntiMemxBean (). getName (); int index = index.index.Index. Long.parselong (name.substring (0, index)); new clusterclient (hostport, processid) .run ();}}Используйте следующую команду для составления этих двух классов:
$ javac -cp $ classpath clustermonitor.java $ javac -cp $ classpath clusterclient.java
Чтобы выполнить модель мониторинга кластера, откройте два терминала. В одном из терминалов запустите классмонмонтор. В другом терминале несколько экземпляров выполняются путем запуска класса ClusterClient в фоновом режиме.
В первом терминале выполните классмонмонтор:
$ java -cp $ classpath clustermonitorlocalhost: 2181
Как показано в предыдущем примере, вы видите сообщение журнала отладки из API клиента. Наконец, класс Clustermonitor начинает контролировать событие и вводить следующее контент:
Теперь выполните пять экземпляров класса ClusterClient, чтобы имитировать пять узлов кластера. ClusterClient создает эфемерный Znode, используя свой собственный идентификатор процесса в пути /членов дерева зооукира:
$ java -cp $ classpath clusterclient localhost: 2181 2> & 1>/dev/null & [1] 4028 $ java -cp $ classpath clusterclient localhost: 2181 2> & 1>/dev/null & [2] 4045 $ java -cp $ classpath cluster -cluster- java -cp $ classpath clusterclient localhost: 2181 2> & 1>/dev/null & [4] 4072 $ java -cp $ classpath clusterclient localhost: 2181 2> & 1>/dev/null & [5] 4084
Соответственно, будет отмечено, что классный класс Clustermonitor обнаруживает эти новые экземпляры классовых классов, так как он контролирует события на пути /членов дерева зооукепера. Это имитирует событие соединения узла в реальном кластере. Вывод можно увидеть в терминале класса кластеромонора, что похоже на то, что показано на скриншоте ниже:
Теперь, если процесс ClusterClient.java убит, сеанс, который он поддерживает с помощью сервера Zookeeper, будет прекращен. Следовательно, эфемерный Znode, созданный клиентом, будет удален. Удаление запустит событие NodechildrenChanged, которое будет захвачено классом Clustermonitor. Это имитирует сценарий, в котором узел оставляет в кластере.
Давайте прекратим процесс ClusterClient с ID 4084:
$ kill -9 4084
На следующем скриншоте показан выход в терминале классового класса. В нем перечислены доступные в настоящее время процессы и их идентификаторы процессов, которые эмулируют сервер в реальном времени:
Пример реализации простой и элегантной модели мониторинга кластера выше демонстрирует истинную силу зоокета. Без Zookeeper разработка такой модели, которая может контролировать активность узла в режиме реального времени, было бы реальной сложной задачей.