ZooKeeper Watcherコードインスタンス

8311 ワード

ZooKeeper Watcherコードインスタンス
主な関連クラスとインタフェースExecutorは、Wathcerインターフェース、Runnableインターフェース、DataMonitorListenerインターフェースを実現する.
接続StringでZooKeeperのZNodeを監視します.
ZNodeにイベント変化が発生した場合、DataMonitorのプロセスメソッドがprocess(WatchedEvent event)メソッドによって呼び出されます.DataMonitorは、WathcerインターフェースおよびStatCallbackインターフェースを実現する.
DataMonitorはZNodeが変化した場合のprocessを処理し,StatCallbackのコールバックを処理する.
Watcherインタフェース
Watcherインタフェースはプロセスメソッドを定義し、インタフェースEventを定義します.
インタフェースEventには、KeeperStateとEventTypeが定義されています.
WatchedEvent
WatchedEventはKeeperState、EventType、pathからなる.
現在のZooKepperの接続状態を表し、イベントが発生するznodeパスと時間タイプを提供します.
ここでKeeperStateはZooKeeperの接続状態を表し、それぞれ:
  • Disconnected
  • NoSyncConnected
  • SyncConnected
  • AuthFailed
  • ConnectedReadOnly
  • SaslAuthenticated
  • Expired

  • EventTypeはnodeの状態変更を表し、それぞれ:
  • None
  • NodeCreated
  • NodeDeleted
  • NodeDataChangedは、重複するデータを設定してもそのイベント
  • がある.
  • NodeChildrenChanged

  • AsyncCallbackインタフェース
    StatCallbackインタフェースはAsyncCallbackの一種です.
    AsyncCallbackは、次のように定義されています.
  • DataCallback
  • ACLCallback
  • ChildrenCallback
  • StatCallback
  • StringCallback
  • VoidCallback
  • Children2Callback

  • ZooKeeperセッションの作成
    に合格
    ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
    

    Zookeeperのセッションを作成できます.
    A Simple Watch Clientコードインスタンス
    プロセスと原理
  • ZooKeeperへの接続を初期化し、モニタW
  • を登録する.
  • Wは、イベントを受信した後に、イベントのstate()に従って追加のタスクプロセスをオフまたは再起動するプロセスに従ってprocess()メソッドを実行する.
  • イベントが発生したznodeが登録されたznodeパスと一致する場合、ZooKeeperのexist()メソッドが呼び出され、StatCallbackというコールバックメソッドが実行される.
  • StatCallbackのコールバック方式においてznode対応データ
  • が得られる.
  • データが存在する場合、印刷応答を実行する結果
  • .
    クライアントへの接続
    sh zkCli.sh -server 127.0.0.1:2181 
    

    運転後Executor.main以降、
    WatchEventが得られます.stateはSyncConnected、typeはnullです.
    セットznodeノードのデータが次のように表示される場合.
    set /yangqi_test new-data
    

    WatchEventが得られます.stateはSyncConnected、typeはNodeDataChangedです.
    したがって,ノードを削除すると,NodeDeletedタイプのEventが得られる.ノードを作成するときはNodeCreatedです.
    ZooKeeper.exists()
    public void exists(final String path, Watcher watcher,
            StatCallback cb, Object ctx)
    

    次のようになります.
    interface StatCallback extends AsyncCallback {
        public void processResult(int rc, String path, Object ctx, Stat stat);
    }
    

    StatCallbackには、exits()メソッドを処理した後のコールバックに使用されるメソッドprocessResult()が1つしかありません.
    ZooKeeper.getData()
    public byte[] getData(String path, boolean watch, Stat stat)
    

    指定したパスのデータを取得します.
    1. create
    Class:org.apache.zookeeper.ZooKeeper public String create(String path, byte[] data, List acl, CreateMode createMode) throws KeeperException, InterruptedException public void create(String path, byte[] data, List acl, CreateMode createMode, AsyncCallback.StringCallback cb, Object ctx)は、所与のパス(path)のノードを作成し、データ(data)とアクセス制御リスト(acl)を設定する.ZooKeeperのノードは、ファイルシステムのディレクトリ構造、すなわち「directory」であり、「regular file」である.2番目のcreateメソッドはcreateの非同期バージョンであり、作成が完了すると非同期callbackが呼び出されます.
    (1). org.apache.zookeeper.data.ACL
    このセクションでは、ZookeeperのACL ZooKeeperがACLを介してZNodeへのアクセス制御を行うことについて説明します.ZooKeeperクライアントはznodeにACLリストを指定し、ZooKeeperサーバはACLリストに基づいてZNodeを要求するクライアントに対応する操作の権限があるかどうかを判定する.ACLオブジェクトはschema:IDとPermissionsで構成されます.a). scheme:schemeはどのシナリオを採用して権限管理を行うかに対応し、zookeeperはpluggableのACLシナリオを実現し、schemeを拡張することでACLのメカニズムを拡張することができる.zookeeper-3.4.4デフォルトでは以下のscheme:world:その下にはanyoneというidが1つしかありません.world:anyoneは誰を表しています.zookeeperのすべての人に権限を持つノードはworld:anyoneに属するauthです.idは必要ありません.authenticationによるuserであればすべて権限(zookeeeperはkerberosによるauthencationをサポートし、username/password形式のauthenticationもサポート)digest:対応するidはusername:BASE 64(SHA 1(password))であり、先にusername:password形式のauthentication ip:対応するidはクライアントのIPアドレスである必要がある.設定時にip:192.168.1.0/16などのipセグメントを設定ことができ、前の16 bitに一致するIPセグメントsuperを表す:このschemeの場合、対応するidはスーパー権限を持っており、何でもできる(cdrwa)b).perm. ZooKeeperには5つの権限があり、低位から高位まではREAD、WRITE、CREATE、DELETE、ADMINであり、ACLのPermissionsは5つの権限のうちの1つまたは複数であり得る.これらの意味は、*READ:ノードの値を取得し、サブノードをリストすることを許可することである.*WRITE:ノードの値を設定できます.*CREATE:サブノードの作成を許可します.*DELETE:サブノードを削除できます.*ADMIN:ノードに権限を設定できます.
    (2). org.apache.zookeeper.CreateMode
    org.apache.zookeeper.CreateModeでは、znodeがEPHEMERALまたはSEQUENTIALであるかどうかを設定できます.PERSISTENT永続化ディレクトリznode PERSISTENT_の4つの値を使用できます.SEQUENTIALシーケンス自動番号のディレクトリznode.このディレクトリノードは、現在存在するノード数に応じて増加します.EPHEMERAL一時ディレクトリznodeは、このznodeを作成したクライアントとサーバが切断されると、このノードは自動的に削除されます.一時ノード(EPHEMERAL)は、子ノードデータEPHEMERAL_を持つことができません.SEQUENTIAL仮自動番号znode.
    (3). zkCliコマンド
    zkCliではcreateのコマンドパッケージが実装、ユーザによるテストとデータ管理が可能である:create[-s][-e]path data aclのうち"-s"は順序自動番号のノードを作成することを表し、"-e"は一時ノードを作成することを表す.デフォルトでは永続性ノードです.たとえば、永続ノードと一時ノードを作成します.
    create  /test null
    Created /test
    create -e /test0 null
    Created /test0

    順序自動番号付けノードを作成します.ACLはdigest(ユーザー名:testパスワード:debugo)を使用し、権限はすべて(rwcda)です.digestの生成についてはzookeeperのDigestAuthenticationProvider.を参照してください.GenerateDigest(String ipName)メソッド;この方法で元のユーザ名とパスワードを指定することで「digest」の後の文字列、例えば「test:test」を入力と、「test:V 28 q/NinI 4 JI 3 Rk 54 h 0 r 8 O 5 kMug=」が得られ、その内部原理は「パスワード」部分をMD 5+sha 1操作することである.
    create -s /test0/test null digest:test:V28q/NynI4JI3Rk54h0r8O5kMug=:rwcda
    Ephemerals cannot have children: /test0/test
    create -s /test/test null digest:test:V28q/NynI4JI3Rk54h0r8O5kMug=:rwcda
    Created /test/test0000000000

    ACLがip(172.19.17.0/24)を使用して読み取り権限のみを持つノードを作成します.
    create /test/test1 "hello world" ip:172.19.17.0/24:r
    Created /test/test1

    2. exist
    class:org.apache.zookeeper.ZooKeeper public Stat exists(String path, Watcher watcher) throws KeeperException, InterruptedExceptionは、あるpathのznodeが存在するかどうかを返す.このノード(2番目のパラメータboolean watcher)を監視するかどうかを設定します.2番目のパラメータがtrueであり、この文が正常に実行されると、リスナー(watcher)は、ノードの確立/ノードの削除/ノードの変更が正常に実行されるとトリガーされます.exists(String, Watcher)リロードメソッド.ここでは、特定のリスナーオブジェクトを指定できます.exists(String, Watcher, AsyncCallback.StatCallback, Object) exists(String, boolean, AsyncCallback.StatCallback, Object) existの非同期実装
    3. delete public void delete(String path, int version) throws InterruptedException, KeeperExceptionはpathに対応するznodeを削除し、versionは-1で任意のバージョン、すなわちこのノードのすべてのデータを削除することができる.また、deleteにも非同期バージョンがあります.delete(String path, int version, AsyncCallback.VoidCallback cb, Object ctx) deleteの非同期バージョン.たとえば、zkCliでノードを削除します.
    delete /test/test1

    4. getChildren public List getChildren(String path, boolean watch) throws KeeperException, InterruptedExceptionは、指定されたpathの下にあるすべてのサブznodeを取得し、この方法はexistと同様にwatcher/指定された特定のWatcherオブジェクトを設定することができる.
    5. setData & getData Stat setData(String path, byte[] data, int version)与えられたpathのノードが存在する場合にpathにデータを設定し、このデータのバージョン番号を指定することができる.バージョンが-1の場合、任意のバージョンに一致します.void setData(String path, byte[] data, int version, AsyncCallback.StatCallback cb, Object ctx) setDataの非同期バージョン.byte[] getData(String path, Watcher watcher, Stat stat)はこのpathに対応するznodeノードのデータを取得し、データのバージョンなどの情報はstatで指定することができる.void getData(String path, Watcher watcher, AsyncCallback.DataCallback cb, Object ctx) getDataの非同期バージョン.
    6.setACLとgetACLStat setACL(String path, List acl, int version)は、znodeノードにアクセス権を再設定します.ZooKeeperのディレクトリノード権限は伝達されず、親znodeノードの権限はサブディレクトリノードに伝達されません.ACLの設定方法については、一連のACLルール(すなわち一連のACLオブジェクトを指定する)を設定できます.void setACL(String path, List acl, int version, AsyncCallback.StatCallback cb, Object ctx) setACLの非同期バージョンList getACL(String path, Stat stat)は、znodeノードのACLオブジェクトのリストを返します.void getACL(String path, Stat stat, AsyncCallback.ACLCallback cb, Object ctx) getACLの非同期バージョン、例えばzkCliでACLルールを設定します.
    [zk: localhost:2181(CONNECTED) 43] setAcl /test world:anyone:r
    cZxid = 0xf000500ed
    ctime = Wed Sep 24 15:13:29 CST 2014
    ......
    [zk: localhost:2181(CONNECTED) 44] getAcl /test
    'world,'anyone
    : r