JavaとZookeeperの使用開始

1。概要

Apache ZooKeeperは、分散アプリケーションの開発を容易にする分散調整サービスです。これは、Apache Hadoop、HBaseなどのプロジェクトで、リーダーの選出、構成管理、ノード調整、サーバーリース管理などのさまざまなユースケースで使用されます。

ZooKeeperクラスター内のノードは、標準のファイルシステムまたはツリーデータ構造に類似した共有階層名前空間にデータを格納します

この記事では、ApacheZookeeperのJavaAPIを使用して、ZooKeeper内に格納されている情報を格納、更新、および削除する方法について説明します。

2.セットアップ

Apache ZooKeeper Javaライブラリの最新バージョンは、次の場所にあります。

 org.apache.zookeeper zookeeper 3.4.11 

3. ZooKeeperデータモデル– ZNode

ZooKeeperには、ステータス情報、調整情報、場所情報などの調整データを格納する分散ファイルシステムによく似た、階層的な名前空間があります。この情報は、さまざまなノードに格納されます。

ZooKeeperツリー内のすべてのノードはZNodeと呼ばれます。

各ZNodeは、データまたはACLの変更のバージョン番号とタイムスタンプを維持します。また、これにより、ZooKeeperはキャッシュを検証し、更新を調整できます。

4.インストール

4.1。インストール

最新のZooKeeperリリースはここからダウンロードできます。その前に、ここで説明するシステム要件を満たしていることを確認する必要があります。

4.2。スタンドアロンモード

この記事では、最小限の構成で済むため、ZooKeeperをスタンドアロンモードで実行します。こちらのドキュメントに記載されている手順に従ってください。

注:スタンドアロンモードではレプリケーションがないため、ZooKeeperプロセスが失敗すると、サービスがダウンします。

5. ZooKeeperCLIの例

次に、ZooKeeperコマンドラインインターフェイス(CLI)を使用してZooKeeperと対話します。

bin/zkCli.sh -server 127.0.0.1:2181

上記のコマンドは、スタンドアロンインスタンスをローカルで起動します。ZNodeを作成し、ZooKeeper内に情報を保存する方法を見てみましょう。

[zk: localhost:2181(CONNECTED) 0] create /MyFirstZNode ZNodeVal Created /FirstZnode

ZooKeeper階層名前空間のルートにZNode'MyFirstZNode 'を作成し、それに' ZNodeVal '書き込みました。

フラグを渡していないため、作成されたZNodeは永続的です。

次に、「get」コマンドを発行して、ZNodeに関連付けられたデータとメタデータをフェッチします。

[zk: localhost:2181(CONNECTED) 1] get /FirstZnode “Myfirstzookeeper-app” cZxid = 0x7f ctime = Sun Feb 18 16:15:47 IST 2018 mZxid = 0x7f mtime = Sun Feb 18 16:15:47 IST 2018 pZxid = 0x7f cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 22 numChildren = 0

set操作を使用して、既存のZNodeのデータを更新できます。

例えば:

set /MyFirstZNode ZNodeValUpdated

これにより、MyFirstZNodeのデータがZNodeValからZNodeValUpdated更新されます。

6. ZooKeeper JavaAPIの例

次に、Zookeeper Java APIを見て、ノードを作成し、ノードを更新して、いくつかのデータを取得しましょう。

6.1。Javaパッケージ

ZooKeeper Javaバインディングは、主に2つのJavaパッケージで構成されています。

  1. org.apache.zookeeper ZooKeeperクライアントライブラリのメインクラスと、ZooKeeperイベントタイプおよび状態の多くの静的定義を定義します。
  2. org.apache.zookeeper.data:アクセス制御リスト(ACL)、ID、統計など、ZNodeに関連付けられた特性を定義します。

ZooKeeperのJavaのAPIには、次のようなサーバーの実装に使用されているにもありますorg.apache.zookeeper.serverorg.apache.zookeeper.server.quorum、およびorg.apache.zookeeper.server.upgrade

ただし、これらはこの記事の範囲を超えています。

6.2。ZooKeeperインスタンスへの接続

すでに実行中のZooKeeperへの接続と切断に使用されるZKConnectionクラスを作成しましょう。

public class ZKConnection { private ZooKeeper zoo; CountDownLatch connectionLatch = new CountDownLatch(1); // ... public ZooKeeper connect(String host) throws IOException, InterruptedException { zoo = new ZooKeeper(host, 2000, new Watcher() { public void process(WatchedEvent we) { if (we.getState() == KeeperState.SyncConnected) { connectionLatch.countDown(); } } }); connectionLatch.await(); return zoo; } public void close() throws InterruptedException { zoo.close(); } }

ZooKeeperサービスを使用するには、アプリケーションは最初に、ZooKeeperクライアントライブラリのメインクラスであるZooKeeperクラスのオブジェクトをインスタンス化する必要があります

、接続方法は、我々はのインスタンスインスタンス化しているのZooKeeperクラスを。また、ZooKeeperからのWatchedEventを処理して接続を受け入れ、それに応じてCountDownLatchのcountdownメソッドを使用して接続メソッドを終了するコールバックメソッドを登録しました。

サーバーへの接続が確立されると、セッションIDがクライアントに割り当てられます。セッションを有効に保つために、クライアントは定期的にハートビートをサーバーに送信する必要があります。

クライアントアプリケーションは、セッションIDが有効である限り、ZooKeeperAPIを呼び出すことができます。

6.3。クライアントオペレーション

We'll now create a ZKManager interface which exposes different operations like creating a ZNode and saving some data, fetching and updating the ZNode Data:

public interface ZKManager { public void create(String path, byte[] data) throws KeeperException, InterruptedException; public Object getZNodeData(String path, boolean watchFlag); public void update(String path, byte[] data) throws KeeperException, InterruptedException; }

Let's now look at the implementation of the above interface:

public class ZKManagerImpl implements ZKManager { private static ZooKeeper zkeeper; private static ZKConnection zkConnection; public ZKManagerImpl() { initialize(); } private void initialize() { zkConnection = new ZKConnection(); zkeeper = zkConnection.connect("localhost"); } public void closeConnection() { zkConnection.close(); } public void create(String path, byte[] data) throws KeeperException, InterruptedException { zkeeper.create( path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } public Object getZNodeData(String path, boolean watchFlag) throws KeeperException, InterruptedException { byte[] b = null; b = zkeeper.getData(path, null, null); return new String(b, "UTF-8"); } public void update(String path, byte[] data) throws KeeperException, InterruptedException { int version = zkeeper.exists(path, true).getVersion(); zkeeper.setData(path, data, version); } }

In the above code, connect and disconnect calls are delegated to the earlier created ZKConnection class. Our create method is used to create a ZNode at given path from the byte array data. For demonstration purpose only, we've kept ACL completely open.

Once created, the ZNode is persistent and doesn't get deleted when the client disconnects.

The logic to fetch ZNode data from ZooKeeper in our getZNodeData method is quite straightforward. Finally, with the update method, we're checking the presence of ZNode on given path and fetching it if it exists.

Beyond that, for updating the data, we first check for ZNode existence and get the current version. Then, we invoke the setData method with the path of ZNode, data and current version as parameters. ZooKeeper will update the data only if the passed version matches with the latest version.

7. Conclusion

When developing distributed applications, Apache ZooKeeper plays a critical role as a distributed coordination service. Specifically for use cases like storing shared configuration, electing the master node, and so on.

ZooKeeperは、ZooKeeper ZNodeとのシームレスな通信のために、クライアント側のアプリケーションコードで使用されるエレガントなJavaベースのAPIも提供します。

そしていつものように、このチュートリアルのすべてのソースはGithubにあります。