ホームページ > Java > &#&チュートリアル > JavaでのZookeeperの使用方法の詳細な説明

JavaでのZookeeperの使用方法の詳細な説明

黄舟
リリース: 2017-09-28 09:37:56
オリジナル
5673 人が閲覧しました

ZooKeeper は、分散型のオープンソース分散アプリケーション調整サービスであり、Google の Chubby のオープンソース実装であり、Hadoop および Hbase の重要なコンポーネントです。この記事を通じて、Java での Zookeeper の簡単な使用方法を共有しましょう。必要な友人はそれを参照してください

1. Zookeeper の基本原則

データ モデルは次のとおりです。

ZooKeeper データモデルの構造と構造 Unix ファイルシステムは全体としてツリーとみなすことができ、各ノードは ZNode と呼ばれます。各 ZNode はそのパスによって一意に識別できます。たとえば、上の図の 3 番目の層の最初の ZNode のパスは /app1/c1 です。各 ZNode には少量のデータを保存できます (デフォルトは 1M ですが、構成によって変更できます。通常、ZNode に大量のデータを保存することは推奨されません)。さらに、各 ZNode はその Acl 情報も保存します。ZNode のツリー構造は Unix ファイル システムに非常に似ていますが、その Acl は Unix ファイル システムとは完全に異なります。各 ZNode の Acl は独立しています。 . の場合、子ノードは親ノードを継承しません。

ZooKeeper の機能:

1. 読み取り、書き込み (更新) モード

ZooKeeper クラスターでは、ZooKeeper の読み取りパフォーマンスが向上します。書き込みリクエストは最初にリーダーに転送され、リーダーは ZooKeeper のアトミック ブロードキャスト プロトコルを通じてリクエストをすべてのフォロワーにブロードキャストします。リーダーが書き込み成功の ACK の半分以上を受信した後、書き込みが完了したと見なされます。成功した場合、書き込みは永続化され、書き込みが成功したことがクライアントに通知されます。
2. WAL とスナップショット

ほとんどの分散システムと同様に、ZooKeeper には、更新操作ごとに最初に WAL (Write-Ahead-Log) が書き込まれ、次にメモリ内のデータが更新されます。そして更新結果をクライアントに通知します。さらに、ZooKeeper はメモリ内のディレクトリ ツリーのスナップショットを定期的に取得し、ディスクに保存します。これは HDFS の FSImage に似ています。もちろん、これを行う主な目的はデータを永続化することであり、2 番目は再起動後の回復を高速化することです。ReplayWAL を介してすべてを復元すると、速度は遅くなります。
3. FIFO

各 ZooKeeper クライアントのすべての操作は、次の 2 つの基本機能によって保証されます。 まず、ZooKeeper クライアントとサーバー間のネットワーク通信は、TCP に基づいています。クライアント/サーバー間の送信パケットの順序。次に、ZooKeeperServer は FIFO 順序に厳密に従ってクライアント要求を実行します。
4. 線形化可能性

ZooKeeper では、すべての更新操作には厳密な半順序関係があり、これが ZooKeeper 関数の正確性を保証する鍵となります。

2. Zookeeper の一般的なコマンド

Zookeeper-client を実行するか、/opt/cloudera/parcels/CDH-5.0.0-1.cdh5.0.0.p0.47/lib/zookeeper/bin を実行できます。 /zkCli.sh-server localhost で、次のように Zookeeper コマンド ラインを入力します:

次に、ls / を実行すると、次のことがわかります:


次に、create /qyktest を実行できます。 'qyktest' 次のようにノードを作成します:

次に、次のように get /qyktest を実行してノード値を取得します:


その後、set /qyktest' を実行できます。 111' を使用してノード値を変更します。次のようになります。


最後に、delete /qyktest を実行してこのノードを削除できます。

さらに、qyktest のこのノードの下にサブノードを引き続き作成することもできます。


それでは、いくつかの基本的なコマンドでこの人物について説明します。他にも多くのコマンドがあります。


3. Zookeeper の Javaapi 操作

Zookeeper の Javaapi 操作については、次のように作者が直接コードを投稿しました。


packageorg.zookeeper.demo;
importjava.io.IOException;
importjava.util.concurrent.CountDownLatch;
importorg.apache.zookeeper.CreateMode;
importorg.apache.zookeeper.KeeperException;
importorg.apache.zookeeper.WatchedEvent;
importorg.apache.zookeeper.Watcher;
importorg.apache.zookeeper.Watcher.Event.KeeperState;
importorg.apache.zookeeper.ZooDefs.Ids;
importorg.apache.zookeeper.ZooKeeper;
publicclassZookeeperClientimplementsWatcher{
//连接超时时间,10s
privatestaticfinalintSESSION_TIMEOUT= 10000;
//连接的zookeeperserver
privatestaticfinalStringCONNECTION_STRING = "172.31.25.8:2181";
privatestaticfinalStringZK_PATH = "/qyktest";
privateZooKeeperzk = null;
privateCountDownLatchconnectedSemaphore = newCountDownLatch(1);
publicvoidcreateConnection(StringconnectString, intsessionTimeout){
this.releaseConnection();
try{
zk= newZooKeeper(connectString,sessionTimeout, this);
connectedSemaphore.await();
}catch(InterruptedExceptione) {
System.out.println("连接创建失败,发生InterruptedException");
e.printStackTrace();
}catch(IOExceptione) {
System.out.println("连接创建失败,发生IOException");
e.printStackTrace();
}
}
publicvoidreleaseConnection(){
if(this.zk!= null){
try{
this.zk.close();
}catch(InterruptedExceptione) {
e.printStackTrace();
}
}
}
publicbooleancreatePath(Stringpath, String data) {
try{
Stringresult = this.zk.create(path,data.getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
System.out.println("节点创建成功,Path: "+result + ", content: "+data);
}catch(KeeperExceptione) {
System.out.println("节点创建失败,发生KeeperException");
e.printStackTrace();
}catch(InterruptedExceptione) {
System.out.println("节点创建失败,发生InterruptedException");
e.printStackTrace();
}
returntrue;
}
publicStringreadData(Stringpath) {
try{
System.out.println("获取数据成功,path:"+path);
returnnewString(this.zk.getData(path,false,null));
}catch(KeeperExceptione) {
System.out.println("读取数据失败,发生KeeperException,path:"+path);
e.printStackTrace();
return"";
}catch(InterruptedExceptione) {
System.out.println("读取数据失败,发生InterruptedException,path: "+path);
e.printStackTrace();
return"";
}
}
publicbooleanwriteData(Stringpath, String data) {
try{
System.out.println("更新数据成功,path:"+path + ", stat: "+this.zk.setData(path,data.getBytes(), -1));
}catch(KeeperExceptione) {
System.out.println("更新数据失败,发生KeeperException,path:"+path);
e.printStackTrace();
}catch(InterruptedExceptione) {
System.out.println("更新数据失败,发生InterruptedException,path: "+path);
e.printStackTrace();
}
returnfalse;
}
publicvoiddeleteNode(Stringpath) {
try{
this.zk.delete(path,-1);
System.out.println("删除节点成功,path:"+path);
}catch(KeeperExceptione) {
System.out.println("删除节点失败,发生KeeperException,path:"+path);
e.printStackTrace();
}catch(InterruptedExceptione) {
System.out.println("删除节点失败,发生InterruptedException,path: "+path);
e.printStackTrace();
}
}
publicstaticvoidmain(String[]args) {
ZookeeperClientsample = newZookeeperClient();
//获取连接
sample.createConnection(CONNECTION_STRING,SESSION_TIMEOUT);
//读数据
Stringqyk = sample.readData("/qyktest");
System.out.println("qyk:"+qyk);
Stringurl = sample.readData("/qyk/db/url");
System.out.println("url"+url);
Stringdriver = sample.readData("/qyk/db/driver");
System.out.println("driver"+driver);
StringuserName = sample.readData("/qyk/db/userName");
System.out.println("userName"+userName);
Stringpassword = sample.readData("/qyk/db/password");
System.out.println("password"+password);
//创建节点
sample.createPath(ZK_PATH,"我是节点初始内容");
System.out.println("数据内容:"+sample.readData(ZK_PATH) + "\n");
//更新节点
sample.writeData(ZK_PATH,"更新后的数据");
System.out.println("数据内容:"+sample.readData(ZK_PATH) + "\n");
//删除节点
sample.deleteNode(ZK_PATH);
//释放连接
sample.releaseConnection();
}
@Override
publicvoidprocess(WatchedEventevent) {
System.out.println("收到事件通知:"+event.getState() + "\n");
if(KeeperState.SyncConnected== event.getState()) {
connectedSemaphore.countDown();
}
}
}
ログイン後にコピー

その後、実行すると、コンソール出力が次のようになることがわかります:



したがって、一部のパブリック設定と同様に、それらを Zookeeper に保存すると、他のサービスを使用できるようになります

概要

以上がJavaでのZookeeperの使用方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート