動物園飼育係(4人)の実際の戦闘

動物園飼育係(4人)の実際の戦闘

分散インストールと展開

クラスターのアイデア:最初に1つのサーバーを取得し、次に2つのサーバーを複製してクラスターを形成します。

サーバー番号を構成する

/ opt / zookeeper / zkDataにmyidファイルを作成します

vim myid

ここに画像の説明を挿入

  • サーバーに対応する番号をファイルに追加します:1
  • 残りの2つのサーバーは、それぞれ2と3に対応します

zoo.cfgファイルを構成します

zoo.cfgファイルを開き、次の構成を追加します

#######################cluster##########################
server.1=106.75.245.83:2888:3888
server.2=106.75.245.84:2888:3888
server.3=106.75.245.85:2888:3888
  • 構成パラメーターserver.A = B:C:Dの解釈
    • A:サーバー番号を示す番号
      。クラスターモードで構成された/ opt / zookeeper / zkData / myidファイルのデータはAの値です。
    • B:サーバーのIPアドレス
    • C:クラスター内のリーダーサーバーと情報を交換するためのポート
    • D:選出中の専用ポート。クラスター内のリーダーサーバーがハングアップした場合、再選出して新しいリーダーを選択するためのポートが必要です。このポートは、選出中に相互に通信するために使用されます。

残りの2つのサーバーを構成します

  1. 仮想マシンのデータディレクトリvmsにzk02を作成します
  2. サーバーデータディレクトリ内の.vmxファイルとすべての.vmdkファイルをそれぞれzk02にコピーします
  3. 仮想マシン->ファイル->開く(zk02の下の.vmxファイルを選択します)
  4. この仮想マシンを開くと、ダイアログボックスが表示され、[この仮想マシンをコピーしました]を選択します。
  5. システムに入った後、LinuxでIPを変更し、/ opt / zookeeper / zkData / myidの値を2に変更します

3番目のサーバーzk03、上記の手順を繰り返します

クラスター操作

各サーバーのファイアウォールを閉じる必要があります

systemctl stop firewalld.service

最初のステーションを開始します

./zkServer.sh start

ステータスを確認する

./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Error contacting service. It is probably not running.

注:サーバーの数が半分以下であるため、クラスターに障害が発生します(ファイアウォールの障害も障害につながります)

2番目のサーバーを起動するとき

  • 最初のステーションのステータスを表示します。モード:フォロワー
  • 2番目のステーションのステータスを表示します。モード:リーダー

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

クライアントを起動します

./zkCli.sh

すべての操作コマンドを表示

help

ここに画像の説明を挿入

現在のznodeに含まれているコンテンツを表示する

ls /

ここに画像の説明を挿入

現在のノードの詳細データを表示する

古いバージョンのzookeeperはls2 /を使用しますが、現在は新しいコマンドに置き換えられています

ls -s /

ここに画像の説明を挿入

  • cZxid:ノードを作成したトランザクション

    • ZooKeeperの状態が変更されるたびに、zxid形式のタイムスタンプが受信されます。これはZooKeeperトランザクションIDです。
    • トランザクションIDは、ZooKeeperでのすべての変更の合計シーケンスです。
    • 各変更には一意のzxidがあり、zxid1がzxid2より小さい場合、zxid1はzxid2の前に発生します。
  • ctime:作成されたミリ秒数(1970年以降)

  • mZxid:最後に更新されたトランザクションzxid

  • mtime:最後に変更されたミリ秒数(1970年以降)

  • pZxid:最後に更新された子ノードzxid

  • cversion:作成バージョン番号、子ノードの変更数

  • dataVersion:データ変更バージョン番号

  • aclVersion:権限のバージョン番号

  • ephemeralOwner:一時ノードの場合、これはznode所有者のセッションIDです。一時ノードでない場合は0です。

  • dataLength:データ長

  • numChildren:子ノードの数

2つの通常のノードを別々に作成します

  • ルートディレクトリに、中国と米国の2つのノードを作成します

    create /china
    create /usa
    

ここに画像の説明を挿入

  • ルートディレクトリで、ロシア語のノードを作成し、「プーチン」データをノードに保存します

    create /ru "pujing"
    
  • ノードのマルチレベル作成

    • 日本の下で、東京の「ホット」を作成する

    • 事前に日本を作成する必要があります。そうしないと、「ノードが存在しません」というエラーが報告されます。

      create /japan
      create /japan/Tokyo "hot"
      
  • ノードの値を取得します

    get /japan/Tokyo
    

ここに画像の説明を挿入

  • 短いノードを作成する:作成が成功した後、quitはクライアントを終了し、再接続すると、短いノードが消えます。

    create -e /uk
    ls /
    quit
    ls /
    
  • 番号付きノードを作成する

    • ロシアのruの下に3つの都市を作成する

      create -s /ru/city  # 执行三次
      ls /ru
      [city0000000000, city0000000001, city0000000002]
      

      シリアル番号ノードがない場合、シリアル番号は0から始まり、増加します。

      元のノードの下に2つのノードがある場合は、並べ替え時に2から開始します。

  • ノードデータ値の変更

    set /japan/Tokyo "too hot"
    
  • ノード値の変更または子ノードの変更(パスの変更)を監視する

    1. / usaノードのデータ変更を監視するためにserver3ホストに登録します

      addWatch /usa
      
    2. Server1ホスト上の/ usaのデータを変更します

      set /usa "telangpu"
      
    3. Server3はすぐに応答します

      WatchedEvent状態:SyncConnectedタイプ:NodeDataChangedパス:/ usa

    4. Server1の/ usaの下に子ノードNewYorkを作成する場合

      create /usa/NewYork
      
    5. Server3はすぐに応答します

      WatchedEvent状態:SyncConnectedタイプ:NodeCreatedpath:/ usa / NewYork

  • ノードを削除

    delete /usa/NewYork
    
  • ノードを再帰的に削除します(空のノードではなく、ノードの下に子ノードがあります)

    deleteall /ru
    

    / ruを削除するだけでなく、/ ruの下にあるすべての子ノードも削除します

APIアプリケーション

<dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.6.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/zk.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

ZooKeeperクライアントを作成する

/**
 * zookeeperAPI
 */
public class TestZK {
    
    

    //zookeeper集群的IP和端口
    private String connectString = "106.75.245.83:2181,06.75.245.83:2182,06.75.245.83:2183";

    //session超时时间,毫秒单位,此处为60秒
    //时间不宜设置太小,因为zookeeper和加载集群环境会因为性能等原因而延迟略高
    //如果时间太少,还没有创建好客户端,就开始创建节点,会报错
    private int sesionTimeout = 60 * 1000;

    //zookeeper客户端对象
    private ZooKeeper zooKeeperClient;

    /**
     * 创建客户端
     */
    @Test
    public void init() throws IOException {
    
    

        /**
         * new Watcher():监听器
         */
        zooKeeperClient = new ZooKeeper(connectString, sesionTimeout, new Watcher() {
    
    
            public void process(WatchedEvent watchedEvent) {
    
    
                System.out.println("得到监听反馈,在进行业务处理代码。");
            }
        });

    }

}

ノードを作成する

  • ACLオブジェクトはIDと権限のペアです
    • 認証(How)に合格した後、どの範囲/スコープがそれらの操作の実行を許可されるかを示すID(Who)(What):Who How What;
    • パーミッション(What)は、intで表されるビットコードであり、各ビットは、対応する操作のパーミッション状態を表します。
    • Linuxのファイル権限と同様に、違いは5つの操作があることです:CREATE、READ、WRITE、DELETE、ADMIN(ACLを変更する権限に対応)
      • OPEN_ACL_UNSAFE:オープンノードを作成し、任意の操作を許可します(最も使用されていない、残りのアクセス許可はほとんど使用されません)
      • READ_ACL_UNSAFE:読み取り専用ノードを作成します
      • CREATOR_ALL_ACL:作成者のみがすべての権限を持っています
/**
 * zookeeperAPI
 */
public class TestZK {
    
    

    //zookeeper集群的IP和端口
    private String connectString = "106.75.245.83:2181,106.75.245.83:2181,106.75.245.83:2181";

    //session超时时间,毫秒单位,此处为60秒
    //时间不宜设置太小,因为zookeeper和加载集群环境会因为性能等原因而延迟略高
    //如果时间太少,还没有创建好客户端,就开始创建节点,会报错
    private int sesionTimeout = 60 * 1000;

    //zookeeper客户端对象
    private ZooKeeper zooKeeperClient;

    /**
     * 创建客户端
     */
    @Before
    public void init() throws IOException {
    
    

        /**
         * new Watcher():监听器
         */
        zooKeeperClient = new ZooKeeper(connectString, sesionTimeout, new Watcher() {
    
    
            public void process(WatchedEvent watchedEvent) {
    
    
                System.out.println("得到监听反馈,在进行业务处理代码。");
                System.out.println(watchedEvent.getType());
            }
        });

    }

    /**
     * 创建节点
     */
    @Test
    public void creaeNode() throws KeeperException, InterruptedException {
    
    
        /**
         * 参数1:要创建的节点的路径
         * 参数2:节点数据
         * 参数3:节点权限
         * 参数4:节点类型
         */
        String string = zooKeeperClient.create("/szx", "xiaoxing".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println(string);
    }

    /**
     * 获取节点上的值
     */
    @Test
    public void getNodeData() throws KeeperException, InterruptedException {
    
    
        byte[] data = zooKeeperClient.getData("/szx", false, new Stat());
        String string = new String(data);
        System.out.println(string);
    }

    /**
     * 修改节点的值
     */
    @Test
    public void updateData() throws KeeperException, InterruptedException {
    
    
        Stat stat = zooKeeperClient.setData("/szx", "xiaoxing111".getBytes(), 0);
        System.out.println(stat);
    }

    /**
     * 删除节点
     */
    @Test
    public void delete() throws KeeperException, InterruptedException {
    
    
        zooKeeperClient.delete("/szx",1);
    }

    /**
     * 获取子节点
     */
    @Test
    public void getChildren() throws KeeperException, InterruptedException {
    
    
        List<String> children = zooKeeperClient.getChildren("/china", false);
        children.forEach(item -> System.out.println(item));
    }

    /**
     * 监听根节点下面的变化
     * 程序在运行的过程中,我们在linux下创建一个节点
	 * IDEA的控制台就会做出响应:NodeChildrenChanged--/
     */
    @Test
    public void watchNode() throws KeeperException, InterruptedException, IOException {
    
    
        List<String> children = zooKeeperClient.getChildren("/", true);
        children.forEach(item -> System.out.println(item));
        //让线程无限等待
        System.in.read();
    }

    /**
     * 判断节点是否存在
     */
    @Test
    public void exists() throws KeeperException, InterruptedException {
    
    
        Stat szx = zooKeeperClient.exists("/szx", false);
        if (szx == null){
    
    
            System.out.println("节点不存在");
        } else {
    
    
            System.out.println("节点存在");
        }
    }

}

おすすめ

転載: blog.csdn.net/weixin_49741990/article/details/112596607