Day375&376.Zookeeper入门&单机安装&集群操作 -Zookeeper

科技 科技 1300 人阅读 | 0 人回复

<
Zookeeper 进门

1.1 概述

Zookeeper是一个开源的散布式的,为散布式框架供给和谐效劳的 Apache 项目。
155506w2ffjjmzbeabayea.jpg



  • 事情机造

    • Zookeeper从设想形式角度去了解:
      是一个基于察看者形式设想的散布式效劳办理框架,它卖力存储战办理各人皆体贴的数据,然后承受察看者的注册,一旦那些数据的形态发作变革,Zookeeper便将卖力告诉曾经正在Zookeeper上注册的那些察看者做出响应的反响。

155506aap0992109knjyyg.jpg


1.2特性

155507komim43arkoncmwz.jpg


1.3数据构造

ZooKeeper 数据模子的构造取 Unix 文件体系很相似,团体上能够看做是一棵树,每一个节面称做一个 ZNode。每个 ZNode 默许可以存储 1MB 的数据,每一个 ZNode 皆能够经由过程其途径独一标识。
155507tb49j39mf9mst9k9.jpg


1.4使用场景

供给的效劳包罗:同一定名效劳、同一设置办理、同一散群办理、效劳器节面静态高低线、硬背载平衡等。


  • 同一定名效劳
正在散布式状况下,经常需求对使用/效劳停止同一定名,便于辨认。比方:IP没有简单记着,而域名简单记着
155507dko6jyygnnrvnoo1.jpg




  • 同一设置办理

    • 散布式状况下,设置文件同步十分常睹。

      • (1)普通请求一个散群中,一切节面的设置疑息是分歧的,好比 Kafka 散群。
      • (2)对设置文件修正后,期望可以快速同步到各个节面上。

    • 设置办理可交由ZooKeeper完成。

      • (1)可将设置疑息写进ZooKeeper上的一个Znode。
      • (2)各个客户端效劳器监听那个Znode。
      • (3)一旦Znode中的数据被修正,ZooKeeper将告诉各个客户端效劳器。

    155508eggpzssq7o46y1s1.jpg





  • 同一散群办理

    • 散布式状况中,及时把握每一个节面的形态是需要的。

      • (1)可按照节面及时形态做出一些调解。

    • ZooKeeper能够完成及时监控节面形态变革

      • (1)可将节面疑息写进ZooKeeper上的一个ZNode。
      • (2)监听那个ZNode可获得它的及时形态变革。


155508ujud93ba7d5b7wj5.jpg




  • 效劳器静态高低线
155508mlhu2d1zjzphlpum.jpg




  • 硬背载平衡
正在Zookeeper中记载每台效劳器的会见数,让会见数起码的效劳器去向理最新的客户端恳求
155509jm9f98klzjl7plvl.jpg


1.5下载地点



  • 1) 民网尾页:
    https://zookeeper.apache.org/
  • 2)
    155509i6kp6dt6tx6ktztx.jpg

155509xci8gaioyjjj2i2p.jpg

155510uqg94ddhqm6d2h8d.png



  • 3 )下载 Linux 状况装置的 tar包
    155510ig90aqyr3ara326g.jpg


Zookeeper 本地装置

2.1 本地形式 装置



  • 装置前筹办
  • (1)装置 JDK
  • (2)拷贝 apache-zookeeper-3.5.7-bin.tar.gz 装置包到 Linux 体系下
  • (3)解压到指定目次
    1. tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz
    复造代码
  • (4)修正称号
    1. mv apache-zookeeper-3.5.7 -bin/zookeeper-3.5.7
    复造代码
  • 设置修正

    • (1)将/usr/local/zookeeper/zookeeper-3.5.7/conf 那个途径下的 zoo_sample.cfg 修正为 zoo.cfg;
      1. mv zoo_sample.cfg zoo.cfg
      复造代码
    • (2)翻开 zoo.cfg 文件,修正 dataDir 途径:
      1. vim zoo.cfg
      复造代码
      修正以下内乱容:
      1. dataDir=/usr/local/zookeeper/zkData
      复造代码
      155510rfqfwlqqg5843lrf.png

    • (3)正在/usr/local/zookeeper/zookeeper-3.5.7/那个目次上创立 zkData 文件夹
      1. mkdir zkData
      复造代码

  • 操纵 Zookeeper

    • 启动 Zookeeper
    1. bin/zkServer.sh start
    复造代码
    155511qqdxmmztjje7vm9e.png

       

    • 检察历程能否启动
    1. jps
    复造代码
    155511spd814h1rg433pc8.png

       

    • 检察形态
    1. bin/zkServer.sh status
    复造代码
    155511fhl0qzhm4en0h8q0.png

       

    • 启动客户端
    1. bin/zkCli.sh
    复造代码
    155511fo58vr0o6d05vqvd.jpg

       

    • 退出客户端
      155512s0tmewf4qe2mm0m5.png

    1. create -s /sanguo/weiguo/zhangliao "zhangliao"
    复造代码
      

    • 截至 Zookeeper
    1. bin/zkServer.sh stop
    复造代码
    155512xgggxyyhmwhmmhhx.png



2.2 设置参数

Zookeeper中的设置文件zoo.cfg中参数寄义解读以下:
155512j741716x29ezee6j.jpg



  • tickTime = 2000
    通讯心跳时,Zookeeper 效劳器取客户端心跳工夫,单元毫秒
    155512yrvqdkerzrnra0ze.png

  • initLimit = 10
    Leader战Follower的初初通讯时限
    155513saabw4zv0dovudxv.png

    Leader战Follower初初毗连时能容忍的最多心跳数(tickTime的数目)
  • syncLimit = 5
    LF 同步通讯时限
    155513naufl13v8iouhlhl.png

    Leader战Follower之间通讯工夫假如超越syncLimit * tickTime,Leader以为Follwer逝世失落,从效劳器列表中删除Follwer。
  • dataDir
    保存Zookeeper中的数据
    留意:默许的tmp目次,简单被Linux体系按期删除,以是普通不用默许的tmp目次。
  • clientPort = 2181 :
    客户端毗连端心 ,凡是没有做修正。

Zookeeper 散群操纵

3.1 散群操纵

3.1.1 散群装置



  • 散群计划
    正在 hadoop102、hadoop103 战 hadoop104 三个节面上皆布置 Zookeeper。
    考虑:假如是 10 台效劳器,需求布置几台 Zookeeper ?
  • 解压装置
    反复上里的单机装置历程
  • 设置效劳器编号

    • (1)正在创立 zkData
      1. mkdir zkData
      复造代码
    • (2)正在zkData 目次下创立一个 myid 的文件
      1. touch myid
      2. vi myid
      复造代码
      正在文件中增加取 server 对应的编号(留意:高低没有要有空止,阁下没有要有空格)
      1. 2
      复造代码
      留意:增加 myid 文件,必然要正在 Linux 内里创立,正在 notepad++内里极可能治码
    • (3)拷贝设置好的 zookeeper 到其他机器上
      1. xsync zookeeper-3.5.7
      复造代码
      并别离正在 hadoop103、hadoop104 上修正 myid 文件中内乱容为 3、4

  • 设置zoo.cfg 文件
  • (1)如上一样重定名zoo_sample.cfg 为zoo.cnf
  • (2)翻开 zoo.cfg 文件
    1. vim zoo.cfg
    复造代码

    • #修正数据存储途径设置
      1. dataDir=/usr/local/zookeeper/zkData
      复造代码
    • #增长以下设置
      1. #######################cluster##########################
      2. server.1=192.168.109.101:2888:3888
      3. server.2=192.168.109.102:2888:3888
      4. server.3=192.168.109.103:2888:3888
      复造代码
      155513z723szueuuk8u2j8.png


  • (3)设置参数解读
    1. server.A=B:C:D。
    复造代码

    • A 是一个数字,暗示那个是第几号效劳器;
      散群形式下设置一个文件 myid,那个文件正在 dataDir 目次下,那个文件内里有一个数据便是 A 的值,Zookeeper 启动时读与此文件,拿到内里的数据取 zoo.cfg 内里的设置疑息比力从而判定究竟是哪一个 server。
    • B 是那个效劳器的地点;
    • C 是那个效劳器 Follower 取散群中的 Leader 效劳器交流疑息的端心;
    • D 是万一散群中的 Leader 效劳器挂了,需求一个端心去从头停止推举,选出一个新的Leader,而那个端心便是用去施行推举时效劳器互相通讯的端心。

  • (4)同步 zoo.cfg 设置文件
    1. xsync zoo.cfg
    复造代码
  • 散群操纵
  • (1)别离启动 Zookeeper
    1. bin/zkServer.sh start #s1
    2. bin/zkServer.sh start #s2
    3. bin/zkServer.sh start #s3
    复造代码
  • (2)检察形态
    1. [root@s1 zookeeper3.5.7]# sh bin/zkServer.sh status
    2. ZooKeeper JMX enabled by default
    3. Using config: /usr/local/zookeeper/zookeeper3.5.7/bin/../conf/zoo.cfg
    4. Client port found: 2181. Client address: localhost.
    5. Mode: follower
    6. [root@s2 zookeeper3.5.7]# sh bin/zkServer.sh status
    7. ZooKeeper JMX enabled by default
    8. Using config: /usr/local/zookeeper/zookeeper3.5.7/bin/../conf/zoo.cfg
    9. Client port found: 2181. Client address: localhost.
    10. Mode: follower
    11. [root@s3 zookeeper3.5.7]# sh bin/zkServer.sh status
    12. ZooKeeper JMX enabled by default
    13. Using config: /usr/local/zookeeper/zookeeper3.5.7/bin/../conf/zoo.cfg
    14. Client port found: 2181. Client address: localhost.
    15. Mode: leader
    复造代码

3.1.2 推举机造(口试重面)



  • Zookeeper推举机造—— 第一次启动
总结一句话,厥后者居上
155513uboyaovyapcpslam.jpg



  • Zookeeper推举机造——非第一次启动
155514d1cvwzz1kfxwvjfv.jpg


3.1.3 ZK 散群启动截至剧本

  
3.2 客户端 号令止 操纵

3.2.1 号令止语法

号令根本语法功用描摹chmod u+x zk.sh显现一切操纵号令ls path利用 ls 号令去检察当前 znode 的子节面 [可监听]
-w 监听子节面变革
-s 附减次级疑息create一般创立
-s 露有序列
-e 暂时(重启大概超时消逝)get path获得节面的值 [可监听]
-w 监听节面内乱容变革
-s 附减次级疑息set设置节面的详细值stat检察节面形态delete删除节面deleteall递回删除节面

  • 1) 启动客户端
    1. #!/bin/bash
    2. case $1 in
    3. "start"){
    4. for i in 192.168.109.101 192.168.109.102 192.168.109.103
    5. do
    6. echo ---------- zookeeper $i 启动 ------------
    7. ssh $i "sh /usr/local/zookeeper/zookeeper3.5.7/bin/zkServer.sh start"
    8. done
    9. };;
    10. "stop"){
    11. for i in 192.168.109.101 192.168.109.102 192.168.109.103
    12. do
    13. echo ---------- zookeeper $i 截至 ------------
    14. ssh $i "sh /usr/local/zookeeper/zookeeper3.5.7/bin/zkServer.sh stop"
    15. done
    16. };;
    17. "status"){
    18. for i in 192.168.109.101 192.168.109.102 192.168.109.103
    19. do
    20. echo ---------- zookeeper $i 形态 ------------
    21. ssh $i "sh /usr/local/zookeeper/zookeeper3.5.7/bin/zkServer.sh status"
    22. done
    23. };;
    24. esac
    复造代码
    155515tukca133koci333l.jpg

  • 2) 显现一切操纵号令
    1. chmod u+x zk.sh
    复造代码

3.2.2 znode 节面数据疑息



  • 1) 检察当前znode 中所包罗的内乱容
  1. ./zk.sh start
复造代码


  • 2) 检察当前节面具体 数据
    1. ./zk.sh stop
    复造代码
    155515f22l25l9z8lbzyms.jpg


    • czxid

      • 创立节面的事件 zxid每次修正 ZooKeeper 形态城市发生一个 ZooKeeper 事件 ID。事件 ID 是 ZooKeeper 中一切修正总的序次。
      • 每次修正皆有独一的 zxid,假如 zxid1 小于 zxid2,那末 zxid1 正在 zxid2 前发作。

    • ctime

      • znode 被创立的毫秒数(从 1970 年开端)

    • mzxid

      • znode 最初更新的事件 zxid

    • mtime

      • znode 最初修正的毫秒数(从 1970 年开端)

    • pZxid

      • znode 最初更新的子节面 zxid

    • cversion

      • znode 子节面变革号,znode 子节面修正次数

    • dataversion

      • znode 数据变革号

    • aclVersion

      • znode 会见掌握列表的变革号

    • ephemeralOwner

      • 假如是暂时节面,那个是 znode 具有者的 session id。假如没有是暂时节面则是 0。

    • dataLength

      • znode 的数据少度

    • numChildren

      • znode 子节面数目



3.2.3 节面范例 (持久/ 长久/ 有序号/ 无序号)



  • 节面范例
    155516oqejhq6gqyefi69h.jpg


    • 1) 别离创立2 个一般节面 (永世节面 + 没有带序号)
    1. bin/zkCli.sh -server 192.168.109.101:2181
    复造代码
    留意:创立节面时,要赋值
       

    • 2)获得节面的值
    1. help
    复造代码
      

    • 3)创立带序号的节面 (永世节面 + 带序号)

      • (1)先创立一个一般的根节面/sanguo/weiguo
      1. ls /
      复造代码
         

      • (2)创立带序号的节面
      1. ls -s /
      复造代码
      假如本来出有序号节面,序号从 0 开端顺次递删。假如本节面下已有 2 个节面,则再排序时从 2 开端,以此类推。

    • 4) 创立长久节面 (长久节面 + 没有带序号 or 带序号)

      • (1)创立长久的没有带序号的节面
      1. create /sanguo "diaochan"
      复造代码
         

      • (2)创立长久的带序号的节面
      1. get -s /sanguo
      复造代码
         

      • (3)正在当前客户端是能检察到的
      1. ./zk.sh startsanguo
      复造代码
         

      • (4)退出当前客户端然后再重启客户端
      1. create -s /sanguo/weiguo/zhangliao "zhangliao"
      复造代码
         

      • (5)再次检察根目次下长久节面曾经删除
      1. create -e /sanguo/wuguo"zhouyu"
      复造代码



3.2.4 监听器道理

客户端注册监听它体贴的目次节面,当目次节面发作变革(数据改动、节面删除、子目次节面增长删除)时,ZooKeeper 会告诉客户端。监听机造包管 ZooKeeper 保存的任何的数据的任何改动皆能快速的呼应到监听了该节面的使用法式。
155516pztbxzcaee104b4c.jpg



  • 1)节面的值变革监听

    • (1)正在 192.168.109.103主机上注册监听/sanguo 节面数据变革
    1. create -e -s /sanguo/wuguo"zhouyu"
    复造代码
      

    • (2)正在 192.168.109.102主机上修正/sanguo 节面的数据
    1. ls /sanguo
    复造代码
      

    • (3)察看 192.168.109.103主机支到数据变革的监听
    1. quit
    复造代码
    留意:正在192.168.109.102再屡次修正/sanguo的值,192.168.109.103上没有会再支到监听。由于注册一次,只能监听一次。念再次监听,需求再次注册。

  • 2)节面的子节面变革监听(途径变革)

    • (1)正在 192.168.109.103主机上注册监听/sanguo 节面的子节面变革
    1. set /sanguo/weiguo "simayi"
    复造代码
      

    • (2)正在 192.168.109.102 主机/sanguo 节面上创立子节面
    1. get -w /sanguo
    复造代码
      

    • (3)察看 192.168.109.103主机支到子节面变革的监听
    1. set /sanguo "xisi"
    复造代码
    留意:节面的途径变革,也是注册一次,见效一次。念屡次见效,便需求屡次注册。


3.2.5 节面删除取检察



  • 1) 删除节面
  1. WATCHER::
  2. WatchedEvent state:SyncConnected type:NodeDataChanged
  3. path:/sanguo
复造代码


  • 2) 递回删除节面
  1. ls -w /sanguo
复造代码


  • 3) 检察节面形态
  1. create /sanguo/jin "simayi"
复造代码

3.3 客户端 API 操纵

3.3.1 IDEA 状况

条件:包管 192.168.109.101、192.168.109.102、192.168.109.103效劳器上 Zookeeper 散群效劳端启动。


  • 1) 创立一个 工程: :zookeeper
  • 2) 增加pom
  1. WATCHER::
  2. WatchedEvent state:SyncConnected type:NodeChildrenChanged
  3. path:/sanguo
复造代码


  • 3) 拷贝log4j.properties 文件到项目根目次
需求正在项目标 src/main/resources 目次下,新建一个文件,定名为“log4j.properties”,正在文件中挖进。
  1. delete /sanguo/jin
复造代码


  • 4 )创立包名com.achang.zk
  • 5 )创立类称号zkClient

3.3.2 创立 ZooKeeper 客户端

  1. deleteall /sanguo/shuguo
复造代码

3.3.3 创立子节面

  1. stat /sanguo
复造代码
测试:正在 192.168.109.101的 zk 客户端上检察创立节面状况
  1. <dependencies>
  2.     <dependency>
  3.         <groupId>junit</groupId>
  4.         <artifactId>junit</artifactId>
  5.         <version>RELEASE</version>
  6.     </dependency>
  7.    
  8.     <dependency>
  9.         <groupId>org.apache.logging.log4j</groupId>
  10.         <artifactId>log4j-core</artifactId>
  11.         <version>2.8.2</version>
  12.     </dependency>
  13.    
  14.     <dependency>
  15.         <groupId>org.apache.zookeeper</groupId>
  16.         <artifactId>zookeeper</artifactId>
  17.         <version>3.5.7</version>
  18.     </dependency>
  19. </dependencies>
复造代码

3.3.4 获得 子节面 并 监听 节面 变革

  1. log4j.rootLogger=INFO, stdout
  2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  3. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  4. log4j.appender.stdout.layout.ConversionPattern=%d %p [%c]- %m%n
  5. log4j.appender.logfile=org.apache.log4j.FileAppender
  6. log4j.appender.logfile.File=target/spring.log
  7. log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
  8. log4j.appender.logfile.layout.ConversionPattern=%d %p [%c]- %m%n
复造代码


  • (1)正在 IDEA 掌握台上看到以下节面:
  1. // 留意:逗号前后不克不及有空格
  2. private static String connectString = "192.168.109.101:2181,192.168.109.102:2181,192.168.109.103:2181";
  3. private static int sessionTimeout = 2000;
  4. private ZooKeeper zkClient = null;
  5. @Before
  6. public void init() throws Exception {
  7.     zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
  8.         @Override
  9.         public void process(WatchedEvent watchedEvent) {
  10.             // 支到变乱告诉后的回调函数(用户的营业逻辑)
  11.             System.out.println(watchedEvent.getType() + "--" + watchedEvent.getPath());
  12.             // 再次启动监听
  13.             try {
  14.                 List<String> children = zkClient.getChildren("/", true);
  15.                 for (String child : children) {
  16.                     System.out.println(child);
  17.                 }
  18.             } catch (Exception e) {
  19.                 e.printStackTrace();
  20.             }
  21.         }
  22.     });
  23. }
复造代码


  • (2)正在 192.168.109.101的客户端上创立再创立一个节面/achang1,察看 IDEA 掌握台
  1. // 创立子节面
  2. @Test
  3. public void create() throws Exception {
  4.     // 参数 1:要创立的节面的途径; 参数 2:节面数据 ; 参数 3:节面权限 ;参数 4:节面的范例
  5.     String nodeCreated = zkClient.create("/achang","shuaige".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
  6. }
复造代码


  • (3)正在 192.168.109.101的客户端上删除节面/achang1,察看 IDEA 掌握台
  1. [zk: localhost:2181(CONNECTED) 16] get -s /achang
  2. shuaige
复造代码

3.3.5 判定 Znode 能否存正在

  1. // 获得子节面
  2. @Test
  3. public void getChildren() throws Exception {
  4.     List<String> children = zkClient.getChildren("/", true);
  5.     for (String child : children) {
  6.         System.out.println(child);
  7.     }
  8.     // 延时壅闭
  9.     Thread.sleep(Long.MAX_VALUE);
  10. }       
复造代码

3.4 客户端背效劳端写数据流程



  • 写流程之写进恳求间接收收给Leader节面
155517mhzw59opga77inuh.jpg



  • 写流程之写进恳求收收给follower节面
155517kwfaipw6ala3wwbb.jpg



免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则