20200209のZooKeeper 4.飼育係の戦闘(開発フォーカス)

ZooKeeperの4.飼育係の戦闘(開発フォーカス)

4.1分散インストールと展開

  1. 新規フォルダ/opt/zk_cluster

  2. 飼育係は、アーカイブフォルダ、および名前の変更クラスタ1に加圧しました。

    tar -zxvf apache-zookeeper-3.5.6-bin.tar.gz -C ./zk_cluster/
  3. 新しいフォルダにクラスタ1にzkData

  4. zkDataフォルダに新しいファイルMYID、1の内容

    echo 1 >> cluster1/zkData/myid
  5. あなたはconfディレクトリzoo_sample.cfgファイルzoo.cfgをコピーします

    cp zoo_sample.cfg zoo.cfg
  6. zoo.cfgの内容を変更します。

    dataDir=/opt/zk_cluster/cluster1/zkData
    clientPort=2187
    ###########Cluster##################
    server.1=192.168.181.128:12887:13887
    server.2=192.168.181.128:12888:13888
    server.3=192.168.181.128:12889:13889
  7. クラスター2、cluster3としてコピーのcluster1

    cp -r cluster1/ cluster2
    cp -r cluster1/ cluster3
  8. クラスタ2の内容とcluster3 zkData / MYIDは変更2,3

  9. zoo.cfgクラスター2とcluster3の内容を変更します

  10. 検証

    スタート3 ZooKeeperの、ビューのステータス

      ./cluster1/bin/zkServer.sh start
      ./cluster1/bin/zkServer.sh status
    [root@hwjsLinux zk_cluster]# ./cluster1/bin/zkServer.sh status
    /usr/bin/java
    ZooKeeper JMX enabled by default
    Using config: /opt/zk_cluster/cluster1/bin/../conf/zoo.cfg
    Client port found: 2187. Client address: localhost.
    Mode: follower

4.2クライアントのコマンドライン操作

コマンド 説明
LSパス[ウォッチ] LSは、現在のznodeに含まれる内容を表示するコマンドを使用します
LS2パス[ウォッチ] 現在のノードのデータを表示し、更新やその他のデータの数を見ることができます
作ります -E -sは、一時的(消えるまたは再起動タイムアウト)を作成するのが一般的な配列を含みます
パス[時計]を取​​得 ノードの値を取得
セットする ノードの具体的な値
STAT ビューノードステータス
削除 [ノードの削除
RMR 再帰的な削除ノード
  1. クライアントを起動します

    ./zkCli.sh -server localhost:2187
  2. すべての操作コマンド

    help
  3. 現在のznodeに含まれるコンテンツを見ます

    [zk: localhost:2181(CONNECTED) 0] ls /
    [zookeeper]
  4. 現在のノード詳細データを見ます

    [zk: localhost:2181(CONNECTED) 1] ls2 /
    [zookeeper]
    cZxid = 0x0
    ctime = Thu Jan 01 08:00:00 CST 1970
    mZxid = 0x0
    mtime = Thu Jan 01 08:00:00 CST 1970
    pZxid = 0x0
    cversion = -1
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 0
    numChildren = 1
  5. これは、二つの通常のノードを作成しました

    [zk: localhost:2181(CONNECTED) 3] create /sanguo "jinlian"
    Created /sanguo
    [zk: localhost:2181(CONNECTED) 4] create /sanguo/shuguo "liubei"
    Created /sanguo/shuguo
  6. ノードの値を取得

    [zk: localhost:2181(CONNECTED) 5] get /sanguo
    jinlian
    cZxid = 0x100000003
    ctime = Wed Aug 29 00:03:23 CST 2018
    mZxid = 0x100000003
    mtime = Wed Aug 29 00:03:23 CST 2018
    pZxid = 0x100000004
    cversion = 1
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 7
    numChildren = 1
    [zk: localhost:2181(CONNECTED) 6] get /sanguo/shuguo
    liubei
    cZxid = 0x100000004
    ctime = Wed Aug 29 00:04:35 CST 2018
    mZxid = 0x100000004
    mtime = Wed Aug 29 00:04:35 CST 2018
    pZxid = 0x100000004
    cversion = 0
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 6
    numChildren = 0
  7. 短いノードを作成します。

    [zk: localhost:2181(CONNECTED) 7] create -e /sanguo/wuguo "zhouyu"
    Created /sanguo/wuguo

    (1)現在のクライアントで閲覧することができます

    [zk: localhost:2181(CONNECTED) 3] ls /sanguo 
    [wuguo, shuguo]

    (2)現在のクライアントを終了し、クライアントを再起動します

    [zk: localhost:2181(CONNECTED) 12] quit
    [atguigu@hadoop104 zookeeper-3.4.10]$ bin/zkCli.sh

    (3)再度ディレクトリのルートノードを表示するには、削除されたショートを有します

    [zk: localhost:2181(CONNECTED) 0] ls /sanguo
    [shuguo]
  8. シリアル番号を持つノードを作成します。

(1)共通のルートを作成/三国/ weiguo

[zk: localhost:2181(CONNECTED) 1] create /sanguo/weiguo "caocao"
Created /sanguo/weiguo

(2)ノードの数と作成します

[zk: localhost:2181(CONNECTED) 2] create -s /sanguo/weiguo/xiaoqiao "jinlian"
Created /sanguo/weiguo/xiaoqiao0000000000
[zk: localhost:2181(CONNECTED) 3] create -s /sanguo/weiguo/daqiao "jinlian"
Created /sanguo/weiguo/daqiao0000000001
[zk: localhost:2181(CONNECTED) 4] create -s /sanguo/weiguo/diaocan "jinlian"
Created /sanguo/weiguo/diaocan0000000002

彼らはノード番号がなかった場合は、ゼロから順次インクリメント。2から、元のノードの下の既存の2つのノードが、並べ替えもしそうなら。

  1. ノードのデータ値を変更

    [zk: localhost:2181(CONNECTED) 6] set /sanguo/weiguo "simayi"
  2. モニタは、ノードの値に変更します

hadoop104上の(1)変更リスナー登録データ/三国ホストノード

[zk: localhost:2181(CONNECTED) 26] [zk: localhost:2181(CONNECTED) 8] get /sanguo watch

(2)hadoop103上のデータ/三国ホストノードを変更します

[zk: localhost:2181(CONNECTED) 1] set /sanguo "xisi"

(3)観測hadoop104ホストは、監視データの変更を受信します

WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/sanguo
  1. ノード変更リスナーの子供(経路変更)

(1)登録された子ノードモニタ/三国ノードホストhadoop104に変化します

[zk: localhost:2181(CONNECTED) 1] ls /sanguo watch
[aa0000000001, server101]

(2)hadoop103ホスト上の子ノードを作成/三国ノード

[zk: localhost:2181(CONNECTED) 2] create /sanguo/jin "simayi"
Created /sanguo/jin

(3)観測hadoop104ホストは、子ノードモニタの変更を受信します

WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/sanguo
  1. [ノードの削除
[zk: localhost:2181(CONNECTED) 4] delete /sanguo/jin
  1. 再帰的な削除ノード
[zk: localhost:2181(CONNECTED) 15] rmr /sanguo/shuguo
  1. ビューノードステータス
[zk: localhost:2181(CONNECTED) 17] stat /sanguo
cZxid = 0x100000003
ctime = Wed Aug 29 00:03:23 CST 2018
mZxid = 0x100000011
mtime = Wed Aug 29 00:21:23 CST 2018
pZxid = 0x100000014
cversion = 9
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 1

4.3 APIアプリケーション

  1. pom.xml

         <dependency>
             <groupId>org.apache.zookeeper</groupId>
             <artifactId>zookeeper</artifactId>
             <version>3.4.10</version>
         </dependency>
  2. テストコード

    public class TestZookeeper {
    
     // private String connectString="hadoop102:2181,hadoop103:2181,hadoop104:2181";
     private String connectString="192.168.181.128:2187,192.168.181.128:2188,192.168.181.128:2189";
     private int sessionTimeout = 2000;
     private ZooKeeper zkClient;
    
     @Before
     public void init() throws IOException{
    
         zkClient = new ZooKeeper(connectString, sessionTimeout , new Watcher() {
    
             @Override
             public void process(WatchedEvent event) {
    
                 System.out.println("---------start----------");
                 List<String> children;
                 try {
                     children = zkClient.getChildren("/", true);
    
                     for (String child : children) {
                         System.out.println(child);
                     }
                     System.out.println("---------end----------");
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
             }
         });
     }
    
     // 1 创建节点
     @Test
     public void createNode() throws KeeperException, InterruptedException{
    
         String path = zkClient.create("/atguigu", "dahaigezuishuai".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    
         System.out.println(path);
    
     }
    
     // 2 获取子节点 并监控节点的变化
     @Test
     public void getDataAndWatch() throws KeeperException, InterruptedException{
    
         List<String> children = zkClient.getChildren("/", true);
    
         for (String child : children) {
             System.out.println(child);
         }
    
         Thread.sleep(Long.MAX_VALUE);
     }
    
     // 3 判断节点是否存在
     @Test
     public void exist() throws KeeperException, InterruptedException{
         Stat stat = zkClient.exists("/atguigu", false);
         System.out.println(stat==null? "not exist":"exist");
     }
    }

4.4モニタ・サーバ・ノードを動的大文字と小文字

  1. 需要

    分散システムは、マスタノードが複数を有することができ、リアルタイムRenyiyitaiクライアントは、プライマリノードサーバをオフラインを知覚することができ、動的に組立ラインオフにすることができます。

  2. 実現

    サーバ・コード

    public class DistributeServer {
    
     public static void main(String[] args) throws Exception {
         String hostname = "test4";
    
         DistributeServer server = new DistributeServer();
    
         // 1 连接zookeeper集群
         server.getConnect();
    
         // 2 注册节点
         server.regist(hostname);
    
         // 3 业务逻辑处理
         server.business();
     }
    
     private void business() throws InterruptedException {
    
         Thread.sleep(Long.MAX_VALUE);
     }
    
     private void regist(String hostname) throws KeeperException, InterruptedException {
    
         String path = zkClient.create("/servers/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
    
         System.out.println(hostname +" is online ");
    
     }
    
     // private String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181";
     private String connectString="192.168.181.128:2187,192.168.181.128:2188,192.168.181.128:2189";
     private int sessionTimeout = 2000;
     private ZooKeeper zkClient;
    
     private void getConnect() throws IOException {
    
         zkClient = new ZooKeeper(connectString , sessionTimeout , new Watcher() {
    
             @Override
             public void process(WatchedEvent event) {
                 // TODO Auto-generated method stub
    
             }
         });
     }
    }

    クライアントコード

    public class DistributeClient {
    
     public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
    
         DistributeClient client = new DistributeClient();
    
         // 1 获取zookeeper集群连接
         client.getConnect();
    
         // 2 注册监听
         client.getChlidren();
    
         // 3 业务逻辑处理
         client.business();
    
     }
    
     private void business() throws InterruptedException {
         Thread.sleep(Long.MAX_VALUE);
     }
    
     private void getChlidren() throws KeeperException, InterruptedException {
    
         List<String> children = zkClient.getChildren("/servers", true);
    
         // 存储服务器节点主机名称集合
         ArrayList<String> hosts = new ArrayList<>();
    
         for (String child : children) {
    
             byte[] data = zkClient.getData("/servers/"+child, false, null);
    
             hosts.add(new String(data));
         }
    
         // 将所有在线主机名称打印到控制台
         System.out.println(hosts);
    
     }
    
     // private String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181";
     private String connectString="192.168.181.128:2187,192.168.181.128:2188,192.168.181.128:2189";
     private int sessionTimeout = 2000;
     private ZooKeeper zkClient;
    
     private void getConnect() throws IOException {
    
         zkClient = new ZooKeeper(connectString , sessionTimeout , new Watcher() {
    
             @Override
             public void process(WatchedEvent event) {
    
                 try {
                     getChlidren();
                 } catch (KeeperException e) {
                     e.printStackTrace();
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
             }
         });
    
     }
    }
  3. テスト

    クライアントサービス側の発表により、動的にサーバーを停止情報を入手。

おすすめ

転載: www.cnblogs.com/huangwenjie/p/12287578.html