zoukankan      html  css  js  c++  java
  • zookeeper windows 入门安装和测试

    一、序言

          以下是我对zookeeper 的一些理解:       zookeeper 作为一个服务注册信息存储的管理工具,好吧,这样说得很抽象,我们举个“栗子”。

          栗子1号:

          假设我是一家KTV的老板,我同时拥有5家KTV,我肯定得时刻监视我KTV 的情况吧,是不是有人打架,或者发生火灾什么的,这时候我会给设置一个视频监控,然后每一家都连接到我的视频监控里面,那么我就可以在家里看到所有KTV 的情况了,如果某一家出现问题,我就能及时发现,并且做出反应。

    这个视频监控就相当于zookeeper,每一家的连接,就相当于KTV 的信息。

           

     

    二、安装过程

         2.1  http://mirrors.hust.edu.cn/apache/zookeeper/  下载,我的版本是 3.4.6(stable) 稳定

         2.2  解压到 F:zookeeper-3.4.6 

         3.3  到目录conf 下创建 zoo.cfg 文件,默认就是加载这个文件,文件内容 我直接copy 的sample里面的

              

    Java代码 复制代码 收藏代码
    1. #zoo.cfg 的内容  
    2. #   心跳检查的时间 2秒  
    3. tickTime=2000  
    4. # 初始化时 连接到服务器端的间隔次数,总时间10*2=20秒  
    5. initLimit=10  
    6. # ZK Leader 和follower 之间通讯的次数,总时间5*2=10秒   
    7. syncLimit=5  
    8. # 存储内存中数据库快照的位置,如果不设置参数,更新事务日志将被存储到默认位置。  
    9. dataDir=F:\zk\tmp\zookeeper  
    10. # 错误日志的存放位置  
    11. dataLogDir=F:\zk\logs\zookeeper  
    12.   
    13. # ZK 服务器端的监听端口  
    14. clientPort=2181  
    #zoo.cfg 的内容
    #   心跳检查的时间 2秒
    tickTime=2000
    # 初始化时 连接到服务器端的间隔次数,总时间10*2=20秒
    initLimit=10
    # ZK Leader 和follower 之间通讯的次数,总时间5*2=10秒 
    syncLimit=5
    # 存储内存中数据库快照的位置,如果不设置参数,更新事务日志将被存储到默认位置。
    dataDir=F:\zk\tmp\zookeeper
    # 错误日志的存放位置
    dataLogDir=F:\zk\logs\zookeeper
    
    # ZK 服务器端的监听端口
    clientPort=2181

     

       上面的说明介绍:http://zookeeper.apache.org/doc/current/zookeeperStarted.html

       然后 cd 到bin 目录下 执行zkServer.cmd 就启动成功了。

       注意:dataDir  和  dataLogDir 目录不会自动创建,得手动创建才能启动。

       可以用netstat -ano|findstr "2181" 看看是否OK。

       也可以用JPS 查看启动的JAVA 进程的情况,会出现这样

       

    Java代码 复制代码 收藏代码
    1. C:windowssystem32>jps  
    2. 8068  
    3. 10040 QuorumPeerMain  // 这东西是zk的东西,源码有介绍  
    4. 10556 Jps  
    C:windowssystem32>jps
    8068
    10040 QuorumPeerMain  // 这东西是zk的东西,源码有介绍
    10556 Jps

       也可以用自带客户端命令 :  zkCli.cmd -server 127.0.0.1:2181

       关于JPS的东西,可以自己去JAVA_HOMEin 目录下去看,里面很多命令。

       

    四、JAVA 操作zookeeper :

           上面安装挺简单的,我们来实际操作下:

           4.1  导入依赖:

            

    Java代码 复制代码 收藏代码
    1. <dependency>  
    2.            <groupId>org.apache.zookeeper</groupId>  
    3.            <artifactId>zookeeper</artifactId>  
    4.            <version>3.4.6</version>  
    5.        </dependency>  
     <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>3.4.6</version>
            </dependency>

     

        4.2 JAVA 实现:这里我们简单实现上面的栗子

           

    Java代码 复制代码 收藏代码
    1. // 根节点  
    2. public static final String ROOT = "/root-ktv";  
    3.   
    4. public static void main(String[] args) throws Exception {  
    5.     // 创建一个与服务器的连接  
    6.     ZooKeeper zk = new ZooKeeper("localhost:2181", 30000, new Watcher() {  
    7.         // 监控所有被触发的事件  
    8.         public void process(WatchedEvent event) {  
    9.             System.out.println("状态:" + event.getState()+":"+event.getType()+":"+event.getWrapper()+":"+event.getPath());  
    10.         }  
    11.     });  
    12.     // 创建一个总的目录ktv,并不控制权限,这里需要用持久化节点,不然下面的节点创建容易出错  
    13.     zk.create(ROOT, "root-ktv".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);  
    14.   
    15.     // 然后杭州开一个KTV ,       PERSISTENT_SEQUENTIAL 类型会自动加上 0000000000 自增的后缀  
    16.     zk.create(ROOT+"/杭州KTV", "杭州KTV".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);  
    17.   
    18.     // 也可以在北京开一个,       EPHEMERAL session 过期了就会自动删除  
    19.     zk.create(ROOT+"/北京KTV", "北京KTV".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);  
    20.   
    21.     // 同理,我可以在北京开多个,EPHEMERAL_SEQUENTIAL  session 过期自动删除,也会加数字的后缀  
    22.     zk.create(ROOT+"/北京KTV-分店", "北京KTV-分店".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);  
    23.   
    24.     // 我们也可以 来看看 一共监视了多少家的ktv  
    25.     List<String> ktvs = zk.getChildren(ROOT, true);  
    26.     System.out.println(Arrays.toString(ktvs.toArray()));  
    27.     for(String node : ktvs){  
    28.         // 删除节点  
    29.         zk.delete(ROOT+"/"+node,-1);  
    30.     }  
    31.     // 根目录得最后删除的  
    32.     zk.delete(ROOT, -1);  
    33.     zk.close();  
    34. }  
        // 根节点
        public static final String ROOT = "/root-ktv";
    
        public static void main(String[] args) throws Exception {
            // 创建一个与服务器的连接
            ZooKeeper zk = new ZooKeeper("localhost:2181", 30000, new Watcher() {
                // 监控所有被触发的事件
                public void process(WatchedEvent event) {
                    System.out.println("状态:" + event.getState()+":"+event.getType()+":"+event.getWrapper()+":"+event.getPath());
                }
            });
            // 创建一个总的目录ktv,并不控制权限,这里需要用持久化节点,不然下面的节点创建容易出错
            zk.create(ROOT, "root-ktv".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    
            // 然后杭州开一个KTV ,       PERSISTENT_SEQUENTIAL 类型会自动加上 0000000000 自增的后缀
            zk.create(ROOT+"/杭州KTV", "杭州KTV".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
    
            // 也可以在北京开一个,       EPHEMERAL session 过期了就会自动删除
            zk.create(ROOT+"/北京KTV", "北京KTV".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
    
            // 同理,我可以在北京开多个,EPHEMERAL_SEQUENTIAL  session 过期自动删除,也会加数字的后缀
            zk.create(ROOT+"/北京KTV-分店", "北京KTV-分店".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
    
            // 我们也可以 来看看 一共监视了多少家的ktv
            List<String> ktvs = zk.getChildren(ROOT, true);
            System.out.println(Arrays.toString(ktvs.toArray()));
            for(String node : ktvs){
                // 删除节点
                zk.delete(ROOT+"/"+node,-1);
            }
            // 根目录得最后删除的
            zk.delete(ROOT, -1);
            zk.close();
        }

     

        zookeeper 的结构图和其他的一些功能,可参考:                                                                                         http://www.blogjava.net/shenh062326/archive/2011/10/29/zookeeper_yuling.html

        

      

     三、zookeeper 伪集群

          上面栗子我们看到,如果我们的监控室也停电了,那不是就监测不到KTV情况了?一般情况下,zk 也是作为分布式部署了,也就是有多台监控,由于监控多了,肯定要有一定为准(比如直播会有一些延迟),就要涉及到选举的算法,这里暂时不介绍,先搭建一个伪集群,因为机器不够,只能再一台机器上模拟搭建,整个过程无非是将上面的一些配置copy 几份,然后配置不同的 地址和端口就行。

         

           3.1  我们将F:zookeeper-3.4.6conf下的zoo.cfg 改成zoo1.cfg,内容改为:

           

    Java代码 复制代码 收藏代码
    1. # 存储内存中数据库快照的位置,如果不设置参数,更新事务日志将被存储到默认位置。  
    2. # 每一个文件路径和下面的对应,zk1 zk2 zk3  
    3. dataDir=F:\zk\tmp\zk1  
    4. # 错误日志的存放位置  
    5. dataLogDir=F:\zk\logs\zk1  
    6.   
    7. # ZK 服务器端的监听端口  
    8. # 对应分别:2181  2182  2183  
    9. clientPort=2181  
    10. # 伪集群   
    11. #2887 是server 之间通讯的,3887 是应用程序通讯的  
    12. # 同时加入其他两个服务的地址和端口信息  
    13. server.1=127.0.0.1:2887:3887   
    14. server.2=127.0.0.1:2888:3888   
    15. server.3=127.0.0.1:2889:3889   
    16. # 最后在钱文件目录下创建3份,zoo1.cfg,zoo2.cfg,zoo3,cfg 记得改参数  
    # 存储内存中数据库快照的位置,如果不设置参数,更新事务日志将被存储到默认位置。
    # 每一个文件路径和下面的对应,zk1 zk2 zk3
    dataDir=F:\zk\tmp\zk1
    # 错误日志的存放位置
    dataLogDir=F:\zk\logs\zk1
    
    # ZK 服务器端的监听端口
    # 对应分别:2181  2182  2183
    clientPort=2181
    # 伪集群 
    #2887 是server 之间通讯的,3887 是应用程序通讯的
    # 同时加入其他两个服务的地址和端口信息
    server.1=127.0.0.1:2887:3887 
    server.2=127.0.0.1:2888:3888 
    server.3=127.0.0.1:2889:3889 
    # 最后在钱文件目录下创建3份,zoo1.cfg,zoo2.cfg,zoo3,cfg 记得改参数

     

       3.2 同时我们将F:zookeeper-3.4.6in下的 zkServer.cmd 改为zkServer1.cmd,内容加上:

        

    Java代码 复制代码 收藏代码
    1. set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain  
    2. # 读取配置的路径,每个启动服务对应一份  
    3. set ZOOCFG=..confzoo1.cfg  
    4. # 同理创建3个zkServer1.cmd,zkServer2.cmd,zkServer3.cmd  记得改zoo 3.cfg  
    set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
    # 读取配置的路径,每个启动服务对应一份
    set ZOOCFG=..confzoo1.cfg
    # 同理创建3个zkServer1.cmd,zkServer2.cmd,zkServer3.cmd  记得改zoo 1 2 3.cfg

       

       3.3 还得在dataDir 指定目录,也就是F:\zk\tmp\zk1 下创建myid 的文件,内容对应1 2 3 即可。

      这个的数字是唯一的,在1-255 之间,用来表示自身的id(其实我不明白 为啥zk 要这么设计- -!)

     

       3.4 启动3个zkServer1.cmd 就OK了,如果要多服务器配置,只需要要将 3份分开放到不同服务器就OK

       依次启动的时刻有错误信息,因为你启动server1 的时候 2 和 3 没找到,但是后面都启动了 就没问题了。

     

    小结:

          1.zookeeper  现在大家都用得比较多,这里也是仅仅介绍下入门知识,linux 上安装区别不打,还是得看具体应用。

          2.关于选举、一致性 和一些其他的东西,慢慢再写!

          3.有错误,请指出哦~。~ 感激。

  • 相关阅读:
    datagridview绑定xml
    为当前会话的所有作用域中的任何表最后生成的标识值。
    Installation failed with message Failed to finalize session : INSTALL_FAILED_INVALID_APK: Split lib_slice_8_apk was defined multiple times. It is possible that this issue is resolved by uninstalling a
    修改android Studio SDK 路径产生的问题(模拟器不能启动了)
    android 2.3.3 配置github的两步骤
    Android Studio 2.3.3 调用asp.net webService实战(拒绝忽悠)
    CSS style 属性
    Html fieldset、legend 标签
    Html lable 标签
    Html table、thead、tr、th、td 标签
  • 原文地址:https://www.cnblogs.com/xuxiuxiu/p/5868483.html
Copyright © 2011-2022 走看看