ダボは、分散環境の登録と発見サービスの登録センターによって達成され、レジストリは、通常のZooKeeperは、研究のレジストリ関連のソースコードは、とても基本的な概念および関連のZooKeeper APIの操作を学習し、ZooKeeperのを周りに開いていません。
ZooKeeperの関連する概念
セッション
TCP長い接続を使用して、クライアントとサーバは、セッションを作成するためのクライアントのためのサーバーは、固有のセッションIDが割り当てられます。時間のセッションタイムアウトは、クライアントがサーバーにリクエストを送信することができますし、ウォッチャーのイベント通知を受信します。
データの構造
メモリに格納されたすべてのデータを飼育係、データモデルはツリー(木のznode)であり、スラッシュ(/)のパスが分割され、それはのznode、例えば/ FOO /パス1です。
znode
znodeはデータ内容と関連した属性情報が保存されます。関連するデータ構造内のスタットのznodeは、属性情報を保存します。現在のノードのバージョン情報、cversion:現在のノードのバージョンの子ノード、現在のノードのACLバージョン嫌悪STATは三つのバージョン、すなわちバージョン属性情報。各変更が発生した場合、バージョン番号は単調に増加します。
アップデート、バージョン番号が間違っている場合のznodeは、バージョン番号を渡すことができ、削除、/更新が失敗し、この機能はCASの動作と同様である削除になります。
znodeは、次のタイプがあります。
- パーマネント・ノード
作成した後は、手動で削除しない限り、それは常に存在します。パーマネント・ノードのためのダボディレクトリノード。
- 一時的なノード
セッションの一時的なノードベースのクライアント、そしてそれは常に、有効期間セッション内のセッションの失敗を存在しますが、ノードは自動的に削除されます。
このメカニズムを使用して、ダボのサービスノードは、ノードが一時的なもので作成されます。サービスプロバイダプログラムダボ計画外のダウンタイム場合は、セッションタイムアウト後、自動的にサービスノード、自動ログオフ当該サービスを削除することができます。
ノード3の順序
ノードの順序を作成すると、自動的に名前の後に塑性番号、10ビットのデフォルトの長さを追加します。ノードの順序も恒久的かつ一時的に分かれています。
ノードの一時的な順序の使用は、我々は分散ロックを実装するために使用することができ、完全に分散ロックヒューペルジンアーキテクチャ[ノート]の原則の明確な実現を7 ZooKeeperのマップを。
ウォッチャーメカニズム
クライアントは、ZooKeeperのサービスがクライアントにイベント通知を終了します、トリガー・イベントの後、特に、ノードリスナーが登録(ウォッチャー)を指定することができます。ダボに基づくウォッチャー機構では消費者は動的に参加する新しいサービスを知覚することができます。
三つ、すなわち、要求で提供されてもよいZooKeeperの監視
- getData()、取得したノードデータ
- GetChildrenメソッド()子ノードを取得します。
- )(存在するノードがあるか否かを判断します
通知のイベントタイプは、イベント中に、子ノードを追加および削除イベントに、同様の変更を分けています。
あなたは、通知のために再登録する必要性を聞くために継続したい場合はウォッチャーは、障害発生後に一度気づくだろう、ということに注意してください。
ZooKeeper 原生 API 操作
ZooKeeperの公式のJava APIの実装、運用方法を提供します。
接続を作成します。
ZooKeeper zk=new ZooKeeper("127.0.0.1:2181", 150000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("已经触发了" + watchedEvent.getType() + "事件"+watchedEvent);
}
});
ZooKeeperの接続、着信サーバアドレスを作成する必要があり、その後、セッションタイムアウトを設定し、またウォッチャーを作成する必要があり、接続イベントをリッスンします。接続が確立されたら、クライアントの操作を使用することができます。
CURD操作
// 创建永久节点,需要传入 ACL 权限列表,以及指定节点类型
zk.create("/test","test".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL,CreateMode.PERSISTENT);
// 修改节点值。更新节点值需要传入节点的版本,如果版本与服务端版本不一致,更新失败,类似 CAS 机制。-1 代表不比较节点版本
zk.setData("/test","test1".getBytes(),-1);
// 删除节点.删除节点也需要传入节点版本
zk.delete("/test",-1);
// 创建临时节点
zk.create("/ephemeral","ephemeral".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL,CreateMode.EPHEMERAL);
ZooKeeperのクライアント関連のCRUD操作は、前述しました。あなたは多くのパラメータを渡す必要があり、関連する作業が比較的面倒で見ることができます。
ウォッチャー
// 在 exists 注册 watcher,创建节点,删除节点,改变节点将会触发回调
zk.exists("/test", new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("回调实例,类型为:"+event.getType());
}
});
// 获取节点数据,可以注册 watcher,删除节点以及改变节点数据可以触发回调
zk.getData("/test", new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("回调实例,类型为:"+event.getType());
}
},new Stat());
// 获取子节点,注册 watcher,一级子节点变动后将会触发回调
zk.getChildren("/test", new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("回调实例,类型为:"+event.getType());
}
});
関連するノードの変更は、イベント通知をトリガーする一度のZooKeeper APIは、3つの操作のためのウォッチャーを申し込むことができます。
キュレーター
上記のコード例からのZooKeeper APIを使用して、複雑で困難提供して見ることができます。学芸員やサードパーティのフレームワークの代わりに使用することができるが、このネイティブAPIをzkclient。このようなネイティブフレームパッケージのZooKeeper API、抽象インタフェースは、操作がより困難に簡素化します。
抽象ダボZooKeeperの操作に関連する、とキュレーターを使用するか、または実装zkclienました。キュレーターはダボ2.6.1バージョン、以前のバージョンのデフォルトのzkclient後にデフォルトで使用されます。
ここでは、学芸員の操作のZooKeeperを使用しています。
接続を確立します
// 设置重试策略
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
// 默认 session 超时时间 60 s
CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", retryPolicy);
キュレーターは、一般的にネイティブAPIに関連した接続を作成していますが、再試行戦略を設定する必要があり、最初の接続が失敗し、キュレーターは、それが最大接続数を超えるまで、再度接続を試みることができます。
CURDノード操作
// 创建目录节点
client.create().forPath("/test", "123456789".getBytes());
// 创建普通节点
client.create().forPath("/test/normal", "123121".getBytes());
// 修改普通节点内容
client.setData().forPath("/test/normal", "1121231231".getBytes());
// 删除节点
client.delete().forPath("/test/normal");
// 创建临时节点
client.create().withMode(CreateMode.EPHEMERAL).forPath("/ephemeral");
// 创建永久顺序节点
client.create().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath("/sequential");
// 获取所有子节点
List<String> nodes = client.getChildren().forPath("/parent");
キュレーターのCRUD操作は、属性に関連するパラメータを設定する必要比較的簡単ではありません。
リスナーを設定します
モニターが再利用できるようにキュレーター関連リスナーAPIパッケージ飼育係のネイティブAPIは、内部繰り返しに登録し、他の機能を向上させます。
3種類のキュレーターのAPIがあります。
NodeCache
:操作のノードの追加および削除のため。PathChildrenCache
:次のレベルディレクトリのノードの追加および削除を監視しますTreeCache
:組み合わせNodeCache
でPathChildrenCache
の動作は、現在のノードを監視することができるだけでなく、あなたはまた、すべての子を聞くことができたノード(マルチレベル)の変化をノード。
// `NodeCache`使用方式
NodeCache nodeCache=new NodeCache(client,"/test1",false);
nodeCache.getListenable().addListener(new NodeCacheListener() {
@Override
public void nodeChanged() throws Exception {
System.out.println("当前节点:"+nodeCache.getCurrentData());
}
});
nodeCache.start();
// PathChildrenCache 使用方式
PathChildrenCache pathChildrenCache=new PathChildrenCache(client,"/test2",false);
pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
System.out.println(event);
}
});
pathChildrenCache.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE);
System.out.println("注册watcher成功...");
// TreeCache 使用方式
TreeCache treeCache=new TreeCache(client,"/tree");
treeCache.getListenable().addListener(new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
System.out.println(event);
}
});
treeCache.start();
System.out.println("注册watcher成功...");