需要
分散システムは、マスタノードは、プライマリノードサーバをオフラインに知覚することができる動的な、リアルタイムRenyiyitaiクライアントに組立ラインオフにすることができ、1以上を有することができます。
要件分析
実現
クラスタノード上で/サーバーを作成します。
作成/サーバ「サーバ」
一部には依存しています
pom.xml:
<プロジェクトのxmlns = "http://maven.apache.org/POM/4.0.0"のxmlns:XSI = "http://www.w3.org/2001/XMLSchema-instance"のxsi:schemaLocationの= "のhttp:/ /maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd "> <modelVersion> 4.0.0 </ modelVersion> <groupIdを> com.mcq < /のgroupId> <たartifactId> zookeeper1026 </たartifactId> <バージョン> 0.0.1-SNAPSHOT </バージョン> <依存性> <依存性> <のgroupId> JUnitの</のgroupId> <たartifactId> JUnitの</たartifactId> <バージョン> RELEASE < /バージョン> </依存関係> <依存> <groupIdを> org.apache.logging.log4j </ groupIdを> <たartifactId> log4jのコア</たartifactId> <バージョン> 2.8.2 </バージョン> </依存> <! - https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper - > <依存> <groupIdを> org.apache.zookeeper </ groupIdを> <たartifactId>飼育係</たartifactId> <バージョン> 3.4.10 </バージョン> </依存関係> </依存関係> </プロジェクト>
SRC /メイン/リソースのファイルlog4j.propertiesを追加します。
log4j.rootLogger = INFO、STDOUT log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern =%D%Pは[ %のC] - %M%N log4j.appender.logfile = org.apache.log4j.FileAppender log4j.appender.logfile.File =目標/ spring.log log4j.appender.logfile.layout = org.apache.log4j.PatternLayout のlog4j .appender.logfile.layout.ConversionPattern =%d個の%のP [%のC] - %のm個の%nを
飼育係を登録するには、サーバー側のコード
パッケージcom.mcq.zookeeper1026。 インポートにjava.io.IOException; 輸入org.apache.zookeeper.CreateMode。 輸入org.apache.zookeeper.KeeperException。 輸入org.apache.zookeeper.WatchedEvent。 輸入org.apache.zookeeper.Watcher; 輸入org.apache.zookeeper.ZooDefs.Ids。 輸入org.apache.zookeeper.ZooKeeper; パブリッククラスDistributeServer { プライベート文字列のconnectString = "hadoop103:2181、hadoop104:2181、hadoop105:2181"; プライベートint型SESSIONTIMEOUT = 2000; 民間のZooKeeper ZK = NULL; プライベート文字列のparentNode = "/サーバ"; 公共ボイドgetConnect()のIOException {スロー ZK =新規のZooKeeper(のconnectString、SESSIONTIMEOUT、新しいウォッチャーを(){ @Overrideを 公共ボイドプロセス(WatchedEventイベント){ // TODO自動生成方法スタブ } })。 } //注册服务器 公共ボイドregistServer(文字列のホスト名)が例外{スロー するSystem.out.println(ZK)を、 文字列パス= zk.create(のparentNode + "/サーバ"、hostname.getBytes()、Ids.OPEN_ACL_UNSAFE、 CreateMode.EPHEMERAL_SEQUENTIAL)。 System.out.println(ホスト名+ "がオンラインになっている" +パス); } //业务功能 ます。public voidビジネス(文字列のホスト名)InterruptedExceptionある{スロー するSystem.out.println(+ホスト名"働いているの......"); Thread.sleep(はLong.MAX_VALUE)。 } 公共の静的な無効メイン(文字列[] argsが){例外をスロー // 1.获取ZK连接 =新しい新しいDistributeServerサーバーDistributeServer(); server.getConnect(); // 2.登録サーバー接続情報ZKの使用 server.registServerを(引数[0]); //サービス機能を起動3. server.business(引数[0]) ; } }
クライアントコード
com.mcq.zookeeper1026パッケージ; インポートにjava.io.IOException; java.util.ArrayListののインポート、 インポートはjava.util.List; インポートorg.apache.zookeeper.KeeperException; インポートorg.apache.zookeeper.WatchedEvent; インポートorg.apache .zookeeper.Watcher; インポートorg.apache.zookeeper.ZooKeeper; パブリッククラスDistributeClient { 公共の静的な無効メイン(文字列[]引数)はIOExceptionが、KeeperException、{InterruptedExceptionあるスロー 。ZK //接続を取得1。 DistributeClientクライアント=新しいDistributeClient()。 client.getConnect(); // 2のリスト取得し、そこから情報サーバ、サーバ情報の子ノードの取得 client.getServerListを(); // 3つのビジネスプロセスが開始さ client.businessを(); } 空ビジネスプライベート()InterruptedExceptionあるスロー{ // TODO自動生成されたスタブメソッド のSystem.out.println( "クライアントワーキング...... ISを"); (はLong.MAX_VALUEの)のThread.sleep; } プライベートのparentNode文字列= "/サーバー"。 空getServerListプライベートは()KeeperException、InterruptedExceptionある{スロー // TODO自動生成されたメソッドスタブ //子ノードを1が親ノードとリスニングのサーバ情報を取得する。。 リスト(trueにはparentNode、)<文字列> = zk.getChildren子供; / 。/ 2ストレージサーバ情報リスト のArrayList <ストリング> =新しい新しいサーバのArrayList <>(); //すべてのノードをトラバース3、ノードを取得したホスト名情報。。 (文字列子供:子供)のために{ バイト[] =データZK。 getData(ヌル、falseにはparentNode + "/" +子供、); servers.add(新しい新しい文字列(データ)); } 。// 4打印服务器列表信息 のSystem.out.println(サーバ)。 } プライベートZooKeeperのZK = NULL; プライベート文字列のconnectString = "hadoop103:2181、hadoop104:2181、hadoop105:2181"; プライベートint型SESSIONTIMEOUT = 2000; 民間のボイドgetConnectは()スローにIOException { // TODO自動生成されたメソッドスタブ //创建到ZK的客户端连接 ZK =新しいのZooKeeper(のconnectString、SESSIONTIMEOUT、新しいウォッチャー(){ @Override ます。public voidプロセス(WatchedEventイベント){ / / TODO自動生成方法スタブ 試み{ getServerList(); }キャッチ(例外e){ e.printStackTrace(); } } })。 } }
プログラムを実行します。
クライアントを実行するには
xshellクライアント(ビン/ zkCli.sh)にログインし、いくつかの操作は、あなたは、ノードリアルタイムで日食のコンソール出力を見ることができます。
そして、例えば、hadoop103に設定し、その後、クライアントコンソールを実行した後、現在のノードが表示されます実行コンフィギュレーションに次のパラメータを設定するために覚えて、サーバーを実行します。
赤いボックスの上の点は、コンソールを切り替えます。