이 예에서는 Java 3.4.6 버전을 사용합니다. 이 예는 모든 사람이 학습 한 후 이해하지 못하는 경우에 대해 논의하기에 편리합니다.
응용 프로그램 개발을위한 사육사 Java 바인딩은 주로 2 개의 Java 패키지로 구성됩니다.
org.apache.zookeeper
org.apache.zookeeper.data
org.apache.zookeeper 패키지는 Zookeeper가 모니터링하는 인터페이스 정의와 Zookeeper의 다양한 콜백 처리기로 구성됩니다. Zookeeper 클라이언트 클래스 라이브러리의 주요 클래스와 많은 Zookeeper 이벤트 유형 및 상태의 정의 정의를 정의합니다. org.apache.zookeeper.data 패키지는 액세스 제어 목록 (ACL), ID, 통계 등과 같은 데이터 레지스터 (Znodes라고도 함)와 관련된 기능을 정의합니다.
org.apache.zookeeper.server, org.apache.zookeeper.server.quorum.quorum 및 org.apache.zookeeper.server.server.sergrade java api는 서버 구현의 일부입니다. org.apache.zookeeper.client 패키지는 Zookeeper 서버의 상태를 쿼리하는 데 사용됩니다.
개발 환경을 준비하십시오
Apache Zookeeper는 복잡한 소프트웨어이므로 다른 많은 클래스 라이브러리를 실행해야합니다. 종속성 라이브러리는 LIB 디렉토리에 Zookeeper 배포의 JAR 파일로 포함됩니다. Core Zookeeper JAR 파일 이름은 Zookeeper-3.4.6.jar이며 홈 디렉토리에 있습니다.
Java Zookeeper 응용 프로그램을 개발하려면 Classpath를 Zookeeper Jar와 Zookeeper에 의존하는 모든 타사 라이브러리로 설정해야합니다. 빈 디렉토리에는 zkenv.sh 파일이 있으며 클래스 경로를 설정하는 데 사용할 수 있습니다.
스크립트를 다음과 같이 설정하고 명령 행에서 다음 문을 실행해야합니다.
$ ZOBINDIR = $ {ZK_HOME}/bin $ source $ {zoobindir} /zkenv.sh쉘 변수 zk_home은 Zookeeper를 설치하는 경로로 설정되어 있으며 내 설정에서/usr/share/kookeeper입니다. 그런 다음 ClassPath 변수가 내 시스템에서 다음과 같이 올바르게 설정됩니다.
$ classpath /usr/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 : /usr/share/zookeeper-3.4.6/bin /../ lib/netty-3.7.0.final.jar : /usr/share/zookeeper-3.4.6/bin/.. : /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 : /usr/share/zookeeper-3.4.6/bin /../ src/java/lib/* : /usr/share/zookeeper-3.4.6/bin /../ conf :
Windows 운영 체제에서는 zkenv.cmd 스크립트를 실행해야합니다. 이제 ClassPath 변수를 사용하여 Zookeeper API를 사용하여 작성된 Java 프로그램을 컴파일하고 실행할 수 있습니다. Zkenv.sh 스크립트는 쉘 세션이 시작될 때마다 사용하지 않도록 Uni/Linux의 홈 디렉토리의 .bashrc 파일에서 찾을 수 있습니다.
두 번째 첫 번째 동물원 프로그램
Zookeeper Java API를 소개하려면 LocalHost의 Zookeeper 인스턴스에 연결할 수있는 매우 간단한 프로그램으로 시작하겠습니다. 연결이 성공하면 Zookeeper 네임 스페이스의 루트 경로 아래에서 Znodes 목록을 인쇄합니다.
이 프로그램의 코드는 다음과 같습니다.
/*우리의 첫 번째 Zookeeper 프로그램*/import java.io.ioexception; import java.util.arraylist; import java.util.list; import org.apache.zookeeper.keeperexception; import org.apache.zookeeper.zookeeper; public static void Main (Strows) {argss) ioecemence "LocalHost : 2181"; String zpath = "/"; list <string> zoochildren = new arraylist <string> (); Zookeeper ZK = New Zk = new Zookeper (hostport, 2000, null); if (zk! = null) {zoochildren = zk.getChildren (zpath, false); "Znod. of 'of'of 'orfintln (Znode of'); (String Child : Zoochildren) {// childrensystem.out.println (child);}} catch (recoperexception e) {e.printstacktrace ();} catch (InterpruptedException e) {e.printstacktrace ();}}}}.이전 코드 스 니펫을 구축하고 실행하기 전에 특정 코드를 구체적으로 살펴 보겠습니다. 코드는 가져 오기 명령문으로 시작합니다. 이 진술을 사용하여 프로그램의 각 구성 요소에 필요한 패키지를 가져옵니다. 앞서 언급했듯이 org.apache.zookeeper 패키지에는 클라이언트가 Zookeeper 서버와 상호 작용하는 데 필요한 모든 클래스와 인터페이스가 포함되어 있습니다. 패키지를 가져 오면 HelloZookeeper라는 클래스가 정의됩니다. 우리는 동일한 시스템에서 실행되는 Zookeeper 인스턴스에 연결하기 때문에 호스트와 포트 문자열을 주요 방법에서 LocalHost : 2181로 정의하십시오. 코드 라인 ZK = New Zookeeper (Hostport, 2000, NULL)는 Zookeeper 생성자를 호출하여 Zookeeper 서버에 연결하려고 시도하고 참조를 반환합니다. Zookeeper 서버 인스턴스에 연결하고 해당 연결을 유지하는 클라이언트 프로그램의 경우 실시간 세션이 필요합니다. 이 예에서, 생성자가 인스턴스화 한 ZK 객체에 의해 반환 된 참조는 세션을 나타냅니다. Zookeeper API는이 참조를 중심으로 구축되었으며 각 방법 호출에는 실행을위한 참조가 필요합니다.
Zookeeper 클래스의 생성자는 다음 코드를 사용하여 Zookeeper 인스턴스에 대한 참조를 만듭니다.
ZooKeeper (String ConnectString, Int SessionTimeout, Watcher Watcher)
사용 된 매개 변수는 다음과 같습니다.
ConnectString : 쉼표로 구분 된 호스트 : 각각의 Zookeeper 서버에 해당하는 포트 번호 목록. 예를 들어, 10.0.0.1:2001, 10.0.0.2:2002 및 10.0.0.3:2003은 유효한 호스트를 나타냅니다. 3 개의 노드의 동물원 키퍼 앙상블에 대한 포트 매칭 쌍. 세션 타임 아웃 : 이것은 밀리 초의 세션 타임 아웃입니다. Zookeeper가 세션 종료를 발표하기 전에 고객으로부터 심장 박동을 얻지 못한시기입니다. 감시자 : 상태가 변경되고 노드 이벤트가 발생할 때 생성 된 경우 알림을받는 감시 대상. 이 Watcher 객체는 사용자 정의 클래스를 통해 별도로 생성되어야하며,이 클래스는 Watcher 인터페이스를 구현하고 인스턴스화 된 객체를 Zookeeper 생성자에게 전달합니다. 클라이언트 응용 프로그램은 연결 누락, 세션 만료 등과 같은 다양한 유형의 이벤트에 대한 알림을받을 수 있습니다.
Zookeeper Java API는 고급 작업을 지정하기 위해 3 개의 매개 변수가있는 추가 생성자를 정의합니다. 코드는 다음과 같습니다.
Zookeeper (String ConnectString, Int SessionTimeout, Watcher Watcher, Boolean CanberEadonly)
Zookeeper 클래스의 위의 생성자에서 True로 설정된 경우 Boolean CanberEadonly 매개 변수를 사용하면 생성 된 클라이언트가 네트워크 파티션의 경우 읽기 전용 모드를 입력 할 수 있습니다. 읽기 전용 모드는 클라이언트가 대부분의 서버를 찾을 수없는 시나리오이지만 읽기 전용 모드로 연결하는 액세스 가능한 파티션 서버가있어 서버에 대한 읽기 요청이 허용되지만 쓰기 요청은 허용되지 않습니다. 클라이언트는 계속해서 읽기 전용으로 남아있는 동안 백그라운드에서 대부분의 서버에 계속 연결하려고합니다. 파티션 서버는 Zookeeper Group의 서브 세트 일 뿐이며 클러스터의 네트워크 할당으로 인해 형성됩니다. 대부분의 서버는 앙상블에서 대부분의 정원을 구성합니다.
다음 생성자는 두 가지 추가 매개 변수의 정의를 보여줍니다.
ZooKeeper (String ConnectString, Int SessionTimeout, Watcher Watcher, Long SessionId, Byte [] SessionPasswd)
이 생성자는 Zookeeper 클라이언트 객체가 두 개의 추가 매개 변수를 만들 수 있도록합니다.
SessionID : 클라이언트가 Zookeeper 서버에 다시 연결하는 경우 특정 세션 ID를 사용하여 이전에 연결된 세션 SessionPasswd를 참조 할 수 있습니다. 지정된 세션에 암호가 필요한 경우 여기에서 지정할 수 있습니다.
다음 생성자는 처음 두 통화의 조합입니다.
Zookeeper (String ConnectString, Int SessionTimeout, Watcher Watcher, Long SessionID, BYTE [] SessionPasswd, Boolean CanberEadonly)
이 생성자는 처음 두 통화의 조합으로, 읽기 전용 모드가 활성화 된 지정된 세션에 다시 연결할 수 있습니다.
메모
Zookeeper 클래스에 대한 자세한 Java API 문서는 http://zookeeper.apache.org/doc/r3.4.6/api/index.html에서 쿼리 할 수 있습니다.
이제 우리의 Zookeeper 프로그램으로 돌아갑니다. 생성자를 호출 한 후 연결이 성공하면 Zookeeper 서버에 대한 참조를 얻게됩니다. 다음 코드를 통해 GetChildren 방법에 대한 참조를 전달합니다.
zoochildren = zk.getchildren (zpath, false)
Zookeeper 클래스의 GetChildren (String Path, Boolean Watch) 방법은 주어진 경로에서 Znode의 어린이 목록을 반환합니다. 우리는이 방법으로 반환 된 목록을 반복하고 문자열을 콘솔에 인쇄합니다.
프로그램의 이름을 hellozookeeper.java로 지정하고 다음과 같이 프로그램을 컴파일하십시오.
$ javac -cp $ classpath hellozookeeper.java
프로그램을 실행하기 전에 다음 명령을 사용하여 Zookeeper 서버 인스턴스를 시작해야합니다.
$ $ {zk_home} /bin/zkserver.sh 시작다음과 같이 프로그램을 실행하십시오.
$ java -cp $ classpath hellozookeeper
집행자는 콘솔에 로그 메시지를 인쇄하여 Zookeeper 버전, Java 버전, Java ClassPath, 서버 아키텍처 등을 표시합니다. 다음은 다음과 같은 로그 메시지입니다.
Zookeeper Java API가 생성 한 로그 메시지는 디버깅에 매우 유용합니다. Zookeeper 서버에 연결하고 세션 및 기타 배경을 설정하는 클라이언트에 대한 정보를 제공합니다. 위에 표시된 마지막 세 개의 로그 메시지는 프로그램에 지정된 매개 변수를 사용하여 클라이언트가 연결을 시작하는 방법과 성공적인 연결 후 서버가 클라이언트에 세션 ID를 할당하는 방법을 알려줍니다.
마지막으로, 프로그램 실행은 마지막으로 콘솔에서 다음을 출력합니다.
Zookeeper Shell을 사용하여 프로그램의 정확성을 확인할 수 있습니다.
$ $ zk_home/bin/zkcli.sh -server localhost
축하해요! 우리는 첫 번째 Zookeeper 고객 프로그램을 성공적으로 작성했습니다.
둘째, Watcher 인터페이스를 구현하십시오
Zookeeper Watcher 모니터링을 통해 고객은 Zookeeper 서버로부터 알림을 받고 이러한 이벤트가 발생할 때 이러한 이벤트를 처리 할 수 있습니다. Zookeeper Java API는 Client Event Handler 클래스가 Zookeeper 서버에서 이벤트에 대한 이벤트 알림을 받기 위해 구현 해야하는 Watcher라는 공개 인터페이스를 제공합니다. 프로그래밍 방식으로, 이러한 클라이언트를 사용하는 응용 프로그램은 클라이언트에 콜백 개체를 등록하여 이러한 이벤트를 처리합니다.
Znode와 관련된 데이터가 변경 될 때 Zookeeper가 생성 한 이벤트를 처리하기 위해 Watcher 인터페이스를 구현합니다.
Watcher 인터페이스는 org.apache.zookeeper 패키지의 다음과 같이 선언됩니다.
Public Interface Watcher {void Process (WatchedEvent 이벤트);}Znode Data Monitor (Watcher)를 보여주기 위해 Datawatcher와 DataUpdater의 두 가지 Java 클래스가 있습니다. Datawatcher는 항상 실행하고 /MyConfig 지정된 Znode 경로의 Zookeeper 서버에서 NodeDatachange 이벤트를 듣습니다. DataUpdater 클래스는이 Znode 경로에서 주기적으로 데이터 필드를 업데이트하여 이벤트를 생성하며 이러한 이벤트를 수신하면 DataWatcher 클래스가 변경된 데이터를 콘솔에 인쇄합니다.
다음은 datawatcher.java 클래스의 코드입니다.
import java.io.ioexception; import org.apache.zookeeper.createMode; import org.apache.zookeeper.keeperexception; import org.apache.zookeeper.watchedevent; import org.apache.zookeeper.watcher; import org.apache.zookeeper .zoodefs; import org.apache Datawatcher는 감시자, runnable {private static string hostport = "localhost : 2181"; private static string zoodatapath = "/myconfig"; byte zoo_data [] = null; Zookeeper ZK; public datawatcher () {zk = new Zookeeper (hostport, 2000, this); if (zk! = null) {null). if (zk.exists (zoodatapath, this) == null) {zk.create (zoodatapath, "".getBytes (), zoodefs.ids.open_acl_unsafe, createMode.Persistent)} catch (receperException | InterruptedEction e) {e.printstacktrace ();}}} catch (ioexception e) {e.printstacktrace ();}} public void printdata ()는 InterpruptedException, requeRexception {zoo_data = zk.getData (zoodatapath, this, null); 새로운 문자열 (zoo_data); Znode to the Console : System.out.printf ( "/ncurrent data @ zk path %s : %s", zoodatapath, zstring);} @ atriadepublic void process (watchedevent event) {system.out.printf ( "/nevent : %s", event.tostring (); == event.eventType.nodedAtachanged) {try {printData ();} catch (InterpruptedException e) {e.printstacktrace ();} catch (e.printstacktrace ();}} public static void main (strows), remportecather, newception} datawatcher (); datawatcher.printdata (); datawatcher.run ();} public void run () {try {try {this) {while (true) {wait ();}}} catch (InterpruptedExcept e) {e.printstacktrace (); thread.currentthread ().Zookeeper 모니터의 구현을 이해하려면 Datawatcher.java 클래스의 코드를 살펴 보겠습니다. Datawatcher Public Class는 Watcher 인터페이스 및 실행 가능한 인터페이스를 구현하고 모니터를 스레드로 실행하려고합니다. 기본 메소드는 DataWatcher 클래스의 인스턴스를 만듭니다. 이전 코드에서 Datawatcher 생성자는 LocalHost에서 실행되는 Zookeeper 인스턴스에 연결하려고합니다. 연결이 성공하면 다음 코드를 사용하여 Znode Path/MyConfig가 존재하는지 확인합니다.
if (zk.exists (Zoodatapath, this) == null) {Zookeeper 네임 스페이스에 Znode가 존재하지 않으면 Ensiss Method Call은 NULL을 반환하고 다음과 같이 코드를 사용하여 지속적인 Znode로 만들려고합니다.
zk.create (Zoodatapath (Zoodatapath), "".getBytes (), zoodefs.ids.open_acl_unsafe, createmode.persistent);
다음은 org.apache.zookeeper의 Watcher 인터페이스에서 선언 된 프로세스 방법입니다. 다음 코드를 사용하여 Datawatcher 클래스에서 구현합니다.
공개 무효 프로세스 (WatchedEvent 이벤트) {단순화를 위해, 프로세스 방법에서, Zookeeper 인스턴스로부터받은 이벤트는 인쇄되며 유형 NodeDatachanged의 이벤트 만 추가로 처리된다.
if (event.getType () == event.eventType.NodedAtachanged)
Znode Path/MyConfig의 데이터 필드에서 업데이트 또는 변경이 발생하고 NodedAtachanged 유형 이벤트가 수신되면 PrintData 메소드가 호출되어 Znode의 현재 내용을 인쇄합니다. znode에서 getData 호출을 실행할 때 다음 코드와 같이 모니터를 다시 설정합니다.이 방법의 두 번째 매개 변수입니다.
zoo_data = zk.getData (Zoodatapath, this, null);
모니터링 이벤트는 모니터링을 설정하는 클라이언트에게 전송 된 일회성 트리거입니다. 추가 이벤트 알림을 지속적으로 받으려면 클라이언트가 모니터를 재설정해야합니다.
DataUpdater.java는 LocalHost를 실행하는 Zookeeper 인스턴스에 연결하고 Znode Path/MyConfig의 데이터 필드를 임의의 문자열로 업데이트하는 간단한 클래스입니다. 여기에서 우리는 UUID (UID) 문자열로 Znode를 업데이트하도록 선택합니다. 이후의 UUID 생성기 호출은 고유 한 문자열의 생성을 보장 할 것이기 때문입니다.
DataUpdater.java 클래스 코드는 다음과 같습니다.
import java.io.ioexception; import java.util.uuid; import org.apache.zookeeper.keeperexception; import org.apache.zookeeper.watchedevent; import org.apache.zookeeper.watcher; import org.apache.zookeper.zookeeper; private 멸종 streatporper; "LocalHost : 2181"; 개인 정적 문자열 Zoodatapath = "/myConfig"; Zookeeper ZK; public dataUpdater ()는 ioException을 던졌습니다. {zk = new Zookeeper (Hostport, 2000, this);} catch (ioexception e) {e.printstacktrace (}); uuid string.public void run ()는 InterruptedException, recrupedException {while (true) {string uuid = uuid.randomuuid (). tostring (); byte zoo_data [] = uuid.getBytes (); zk.setData (Zoodatapath, Zoo_Data, -1); // 5 secs} catch (InterruptedException e) {thread.currentThread (). interprupt ();}}} public static void main (Strows [] args) ThrowsioException, InterruptedException, KeepERexception {dataUpdater dataUpdater = new DataUpdater ();}@OverridePodevoid everit (); {System.out.printf ( "/nevent reade : %s", event.toString ());}}위의 코드는 Zookeeper 서버가 NodeDatachanged 이벤트를 트리거하게합니다. Datawatcher는이 Znode 경로에 대한 모니터링을 설정하므로 데이터 변경 이벤트에 대한 알림을받습니다. 그런 다음 업데이트 된 데이터를 검색하고 모니터링을 재설정하고 콘솔에서 데이터를 인쇄합니다.
다음 명령을 사용하여 DataWatcher 및 DataUpdater 클래스를 컴파일하십시오.
$ javac cp $ classpath datawatcher.java $ javac cp $ classpath dataUpdater.java
모니터 및 업데이트 프로그램을 실행하려면 두 개의 터미널 창을 열어야합니다. /myconfig의 znode (Zookeeper 네임 스페이스에서 생성되지 않은 경우)을 생성하기 때문에 모니터를 먼저 실행하고 싶습니다. 모니터를 실행하기 전에 Zookeeper 서버가 로컬 호스트에서 실행되고 있는지 확인하십시오.
터미널 창 중 하나에서 다음 명령을 실행하여 Watcher 클래스를 실행하십시오.
$ java cp $ classpath datawatcher
다음 스크린 샷에 표시된 메시지와 유사한 메시지를 출력하십시오.
이전 스크린 샷에서 볼 수 있듯이 Znode Path/MyConfig는 DataWatcher 클래스에서 생성됩니다. 또한 Znode의 내용을 인쇄하지만 콘솔에는 그렇지 않습니다. Znode를 만들 때 데이터를 설정하지 않기 때문입니다. Znode가 생성되면 클래스의 모니터는 콘솔에 인쇄 된 Type NodeCreated에 대한 이벤트 알림을받습니다. Datawatcher 클래스는 Zookeeper 서버에서 /MyConfig 노드의 이벤트를 계속 실행하고 리터텐합니다.
다른 터미널 창에서 DataUpdater 클래스를 실행합시다.
$ java -cp $ classpath dataUpdater
초기 Zookeeper 별 로그 메시지를 콘솔에 로그인 한 후 DataUpdater 클래스는 프롬프트없이 실행됩니다. 새로운 UUID 문자열을 Zookeeper Path/MyConfig의 데이터 필드로 설정합니다. 따라서 5 초마다 아래 스크린 샷에 표시된 출력은 Datawatch를 실행하는 터미널 창에 인쇄됩니다.
Datawatcher는 Zookeeper Shell을 사용하여 테스트 할 수도 있습니다. 이전과 같이 터미널에서 Datawatcher 클래스를 계속 실행하고 다른 터미널에서 Zookeeper Shell을 호출하고 다음 스크린 샷에 표시된 명령을 실행하십시오.
DataWatcher가 실행중인 터미널에서 다음 메시지가 인쇄됩니다.
세 가지 예 - 클러스터 모니터
이메일, 파일 서비스 플랫폼, 온라인 게임 등과 같은 인터넷을 통해 제공되는 인기있는 서비스는 종종 지리적으로 분리되는 여러 데이터 센터에서 사용할 수있는 수백 또는 수천 개의 서버가 제공합니다. 이러한 클러스터에서 일부 전용 서버 노드는 제작 네트워크에서 서비스 또는 응용 프로그램을 호스팅하는 서버의 활동을 모니터링하기 위해 설정됩니다. 클라우드 컴퓨팅 환경에서 클라우드 환경을 관리하는 데 사용되는 모니터링 노드를 클라우드 컨트롤러라고합니다. 이러한 컨트롤러 노드의 중요한 작업은 프로덕션 서버의 실패를 실시간으로 감지하고 그에 따라 관리자에게 알리고 실패한 서버의 응용 프로그램에 대한 다른 서버로의 응용 프로그램 실패와 같은 필요한 조치를 취하여 결함 공차 및 고 가용성을 보장하는 것입니다.
이 섹션에서는 Zookeeper Java Client API를 사용하여 미니멀리스트 분산 클러스터 모니터 모델을 개발할 것입니다. Zookeeper의 임시 Znode 개념을 사용 하여이 모니터링 모델을 구축하는 것은 다음 단계에서 설명한 것처럼 매우 간단하고 우아합니다.
각 프로덕션 서버는 Zookeeper 클라이언트를 데몬으로 실행합니다. 이 프로세스는 Zookeeper 서버에 연결되며 /Zookeeper 네임 스페이스 (예 : /멤버)의 사전 정의 된 경로에 이름 (바람직하게는 네트워크 이름 또는 호스트 이름)이있는 임시 Znode를 만듭니다. 클라우드 컨트롤러 노드는 Zookeeper 모니터 프로세스를 실행하여 경로/멤버를 모니터링하고 NodeChildrenChanged 유형의 이벤트에 대해서는 청취합니다. 이 모니터 프로세스는 서비스 또는 데몬으로 실행되며 경로에서 모니터링을 설정하거나 재설정하고 논리를 구현하여 적절한 모듈을 호출하여 이벤트 모니터링에 필요한 조치를 취합니다. 이제 하드웨어 고장 또는 소프트웨어 충돌로 인해 제작 서버가 종료되면 Zookeeper 클라이언트 프로세스가 종료되어 서버와 Zookeeper 서비스 간의 세션이 종료됩니다. 임시 Znode의 속성은 고유하므로 Zookeeper 서비스는 클라이언트 연결이 닫힐 때마다 경로/멤버의 Znode를 자동으로 삭제합니다. 경로에서 Znode를 삭제하면 NodeChildrenChanged 이벤트가 발생하므로 클라우드 컨트롤러의 관찰자 프로세스에 알립니다. 경로/멤버에서 getchildren 메소드를 호출하면 어떤 서버 노드가 닫혔는지 결정할 수 있습니다. 그런 다음 컨트롤러 노드는 다른 서버에서 실패한 서비스를 다시 시작하기 위해 복구 로직을 수행하는 것과 같은 적절한 조치를 취할 수 있습니다. 이 논리는 실시간으로 작동하도록 구축하여 가동 중지 시간이 거의없고 가용 한 서비스를 제공 할 수 있습니다.
이 클러스터 모니터링 모델을 구현하기 위해 두 개의 Java 클래스를 개발할 것입니다. ClusterMonitor 클래스는 Zookeeper 트리의 경로/멤버를 모니터링하기 위해 모니터를 지속적으로 실행합니다. 상승 이벤트를 처리 한 후 콘솔에서 Znode 목록을 인쇄하고 모니터링을 재설정합니다. 다른 클래스 클러스터 클라이언트는 Zookeeper 서버와의 연결을 시작하고 /멤버의 임시 Znode를 생성합니다.
여러 노드로 클러스터를 시뮬레이션하기 위해 동일한 컴퓨터에서 여러 클라이언트를 시작하고 클라이언트 프로세스의 프로세스 ID를 사용하여 임시 Znode를 만듭니다. 프로세스 아이덴티티를 보면 ClusterMonitor 클래스는 어떤 클라이언트 프로세스가 닫혀 있고 어떤 프로세스가 있는지 결정할 수 있습니다. 실제적인 경우, 클라이언트 프로세스는 일반적으로 현재 실행중인 서버의 호스트 이름을 사용하여 임시 Znode를 만듭니다. 이 두 클래스의 소스 코드는 다음과 같습니다.
ClusterMonitor.java 클래스는 다음과 같이 정의됩니다.
import 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; import org.apache.zookeper org.apache.zookeeper.zookeeper; 공개 클래스 클러스터 모니터는 실행 가능 {private static string 멤버십 root = "/멤버"; 개인 최종 지수 연결 및 개인 최종 감시자 어린이 전위; 개인 동물원 ZK; 부울 alive = true; public clustermonitor (String wortport), InterruptedException, Connectionexception {ConnectionCection <). {@overridepublic void process (watchedevent event) {if (event.getType () == watcher.event.eventType.none && event.getState () == watcher.event.keeperstate.syncconnected) {system.out.printf ( "/nevent : recever s")}}}; New Watcher () {@overridepublic void process (watchedevent event) {system.out.printf ( "/nevent reade : %s", event.tostring ()); if (event.getType () == event.eventType.NodeChildrenChanged) {child Znode get <// child znode, get thelist <// zk.getChildren (멤버십 root, this); 벽 ( "!! 클러스터 멤버십 변경 !!!"); WALL ( "멤버 :" + children);} catch (KeeperException e) {throw new runtimeexception (e);} catch (interruptedException e) {strook.currentthread (). interrupt (); aLIVE = in)}}}}}}}}}}}}}}}; New Zookeeper (Hostport, 2000, ConnectionWatcher); // 부모 znode가 존재하는지 확인하십시오 (zk.exists (membershiproot, false) == null) {zk.create, "clusterMonitorRoot".getBytes (), ids.open_acl_unsafe, createmode.persistent); children = zk.getchildren (멤버십 root, childrenwatcher); System.err.println ( "멤버 :" + children);} public synchronized void close () {try {zk.close ();} catch (InterruptedException e) {e.printstacktrace ();}} public void Wall (strest) {System. %s ", message);} public void run () {try {the synchronized (this) {while (while) {wait (wait ();}}} catch (e.printStackTrace (); thread.currentthread (). interrupt (). InterpruptedException, rectureException {if (args.length! = 1) {System.err.println ( "usage : clustermonitor <host : port>"); system.exit (0);} 문자열 hostport [0]; new ClusterMonitor (hostport) .run ();}}ClusterClient.java 클래스는 다음과 같이 정의됩니다.
import java.io.ioexception; import java.lang.management.managementfactory; import org.apache.zookeeper.createmode; import org.apache.zookeeper.keeperexception; import org.apache.zookeeper.watchedevent; import org.apache.zookeeper.watcher; import.pache.zookeper.zookeper.zookepeper org.apache.zookeeper.zookeeper; public class clusterclient는 감시자, 실행 가능 {private static string 멤버십 root = "/멤버"; Zookeeper ZK; public clusterclient (String Hostport, Long Pid) {String ProcessID = pid.toString (); ZK = New Xeokeeper (hostport, 2000); {e.printstacktrace ();} if (zk! = null) {try {zk.create (membershiproot + '/' + processId, processId.getBytes (), ids.open_acl_unsafe, createMode.ephemeral);} catch (receperexception | interruptedexcept e)}}}}}}} void close () {try {zk.close ();} catch (InterpruptedExcept e) {e.printstacktrace ();}}@atriadepublic void process (watchedevent event) {system.out.printf ( "/nevent reade : %s", event.tostring (); {wait ();}}} catch (InterpruptedException e) {e.printstacktrace (); thread.currentThread (). interprupt ();} 최종 {this.close ();}} public static void main (strings [] args [] args []] {system.err.prrintln (cluster : usage : usage : usage : usage). <host : port> "); system.exit (0);} 문자열 hostport = args [0]; // 프로세스 idstring name = managementfactory.getRuntimemeMxbean (). getName (); int index = name.indexof ( '@'); long processId = long.parselong (name.substring (0, index)); new Clusterclient (hostport,));다음 명령을 사용 하여이 두 클래스를 컴파일하십시오.
$ javac -cp $ classpath clustermonitor.java $ javac -cp $ classpath clusterclient.java
클러스터 모니터링 모델을 실행하려면 두 개의 터미널을 엽니 다. 터미널 중 하나에서 ClusterMonitor 클래스를 실행하십시오. 다른 터미널에서는 백그라운드에서 ClusterClient 클래스를 실행하여 여러 인스턴스가 실행됩니다.
첫 번째 터미널에서 ClusterMonitor 클래스를 실행합니다.
$ java -cp $ ClassPath ClusterMonitorLocalHost : 2181
이전 예제에서 볼 수 있듯이 클라이언트 API의 디버그 로그 메시지가 표시됩니다. 마지막으로 ClusterMonitor 클래스는 이벤트 모니터링을 시작하고 다음 내용을 입력합니다.
이제 클러스터 클래스 클래스의 5 가지 노드를 시뮬레이션하기 위해 ClusterClient 클래스의 5 가지 인스턴스를 실행하십시오. ClusterClient는 Zookeeper 트리의 /멤버 경로에서 자체 프로세스 ID를 사용하여 임시 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 clusterclient localhost : 2181 2>/dev/null & null/null/null/null/null/null/null. -CP $ ClassPath ClusterClient LocalHost : 2181 2> & 1>/dev/null & [4] 4072 $ java -cp $ ClassPath ClusterClient LocalHost : 2181 2> & 1>/dev/null & [5] 4084
이에 해당하면 ClusterMonitor 클래스는 Zookeeper 트리의 /멤버 경로에서 이벤트를 모니터링하기 때문에 이러한 새로운 ClusterClient 클래스 인스턴스를 감지하는 것으로 관찰됩니다. 이것은 실제 클러스터에서 노드 결합 이벤트를 시뮬레이션합니다. 출력은 ClusterMonitor 클래스의 터미널에서 볼 수 있으며 아래의 스크린 샷에 표시된 것과 유사합니다.
이제 ClusterClient.java 프로세스가 사망하면 Zookeeper 서버로 유지 관리하는 세션이 종료됩니다. 따라서 클라이언트가 만든 임시 Znode가 삭제됩니다. Deletion은 ClusterMonitor 클래스에 의해 캡처되는 NoDeChildrenChanged 이벤트를 트리거합니다. 이것은 노드가 클러스터에 나오는 시나리오를 시뮬레이션합니다.
ID 4084로 클러스터 클라이언트 프로세스를 종료합시다.
$ 킬 -9 4084
다음 스크린 샷은 ClusterMonitor 클래스의 터미널의 출력을 보여줍니다. 실시간 서버를 모방하는 현재 사용 가능한 프로세스 및 프로세스 ID를 나열합니다.
위의 단순하고 우아한 클러스터 모니터링 모델의 예제 구현은 Zookeeper의 진정한 힘을 보여줍니다. 사육사가 없으면 노드 활동을 실시간으로 모니터링 할 수있는 모델을 개발하는 것이 정말 어려운 작업이 될 것입니다.