设为首页 收藏本站
查看: 1111|回复: 0

[经验分享] [java, zookeeper] ZooKeeper 的安装与编程

[复制链接]

尚未签到

发表于 2015-12-24 11:32:34 | 显示全部楼层 |阅读模式
这篇文章来简单介绍一下, ZooKeeper的伪集群安装,以及基于本机的 ZooKeeper 如何搭建开发环境。
这里介绍的"集群安装"是伪集群安装,考虑到自己的计算机在同时开3,4 个虚拟机的情况下已经很难保证运行速度,
所以采用的是伪集群安装, 这里的为集群安装是通过把多个不同的端口号分配给不同的 zookeeper 进程来运行,即 127.0.0.1:{2181, 2182,2183}
而真正的集群安装是,把每个主机上面的 不同 IP 地址和相同端口号 {10.2.0.27,10.2.0.28,20.2.0.29}:2181分配给不同的 zookeeper 服务进程来运行。

如果不考虑性能,其实现的效果都是一样的,伪分布式在编程的时候更加容易调试,等到基于伪分布式编写的程序能够正常运行,再将其移植到分布式环境中
也是一个好方法。


ZooKeeper 的安装

1. 下载
wget http://apache.dataguru.cn/zookeeper/stable/zookeeper-3.4.6.tar.gz

2. 解压
tar -xzf zookeeper-3.4.6.tar.gz

3. 修改系统配置文件
vi /etc/profile
add
export PATH_TO_ZK=/home/zookeeper-3.4.6
export ZK_HOME=/home/zookeeper-3.4.6/bin
export PATH=$PATH:$ZK_HOME

source /etc/profile

4. 修改 ZooKeeper 配置文件

复制一份 ../config/ 路径下面的 zoo_sample.cfg
cp zoo_sample.cfg zoo.cfg
并将 zoo.cfg 文件按照如下的格式进行修改




  • # The number of milliseconds of each tick

  • tickTime=2000

  • # The number of ticks that the initial
  • # synchronization phase can take
  • initLimit=10

  • # The number of ticks that can pass between
  • # sending a request and getting an acknowledgement
  • syncLimit=5

  • # the directory where the snapshot is stored.
  • # do not use /tmp for storage, /tmp here is just
  • # example sakes.

  • dataDir=/home/zookeeper-3.4.6/data

  • # the port at which the clients will connect

  • clientPort=2181


  • server.1=127.0.0.1:2222:2223
  • server.2=127.0.0.1:3333:3334
  • server.3=127.0.0.1:4444:4445

其中 server.*=host:port1:port2 ,中的 host 用于指定 zookeeper 服务器进程运行的主机 IP 地址,

port1 指的是 server 进程运行的端口号, 而 port2 指的是当需要选举 leader 的时候用于竞争的端口号码。
因为我们在配置文件中修改了 dataDir 的路径,所以在 /home/zookeeper-3.4.6/ 路径下面创建一个名为 data 的文件夹。

要注意的是,当前我们改写的这个配置文件仅仅也是一个模板,启动不同的 zookeeper 服务进程的时候,
需要指定不同的配置文件。
因为我们要运行 3 个 zookeeper 服务进程,所以我们要分别创建 3 个不同的配置文件,并且为其设定不同的端口号
4.1 创建文件夹
    mkdir -p /home/zookeeper-3.4.6/z1/data
    mkdir -p /home/zookeeper-3.4.6/z2/data
    mkdir -p /home/zookeeper-3.4.6/z3/data
   
4.2 分别在各自的文件夹下面创建 myid 文件,并在文件中写入 1-225 的数值,用来与配置文件中的 server.X 的 X 相对应
   echo 1 > /home/zookeeper-3.4.6/z1/data/myid
   echo 2 > /home/zookeeper-3.4.6/z2/data/myid
   echo 3 > /home/zookeeper-3.4.6/z3/data/myid

4.3 将刚刚修改好的配置文件,分别拷贝到 /home/zookeeper-3.4.6/{z1,z2 ,z3} 路径下面,
并将其重新命名为 {z1.cfg, z2.cfg, z3.cfg},
不过,除了 z1.cfg , z2,z3.cfg 配置文件中的 clientPort 要分别重新命名为 {2182, 2183} 因为主要以端口号来区分
不同的服务进程,从而实现伪分布 , 如果端口号相同,主机是不会允许在同一 IP:port 上运行 2 个或以上的进程的,
所以若不修改,启动的时候一定会出现错误。

5. 启动多个 ZooKeeper 服务器进程
首先,将目录切换到 z1 路径下,也就是存放 z1.cfg 配置文件的路径下面,执行如下命令

[iyunv@ayanami_rei z1]# /home/zookeeper-3.4.6/bin/zkServer.sh start ./z1.cfg

如果,成功启动 zookeeper server 进程的话,将会显示如下的提示信息:
JMX enabled by default
Using config: ./z1.cfg
Starting zookeeper ... STARTED

接下来,分别切换到 z2,z3 的路径下面以同样的方式对应不同的配置文件{z2.cfg, z3.cfg }来启动 zookeeper server 进程


6. 启动单个 ZooKeeper 客户端进程

等到全部 server  进程启动之后, 一如下的命令启动客户端进程:

${PATH_TO_ZK}/bin/zkCli.sh -server 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183

如果正常运行的话,将会显示如下提示信息
Connecting to 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
2015-06-28 11:18:39,386 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT
2015-06-28 11:18:39,407 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=<NA>
2015-06-28 11:18:39,407 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.8.0_45
2015-06-28 11:18:39,443 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2015-06-28 11:18:39,443 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/usr/local/jdk-1.8/jre
2015-06-28 11:18:39,444 [myid:] - INFO  [main:Environment@100] - Client environment:java.class.path=/home/zookeeper-3.4.6/bin/../build/classes:/home/zookeeper-3.4.6/bin/../build/lib/*.jar:/home/zookeeper-3.4.6/bin/../lib/slf4j-log4j12-1.6.1.jar:/home/zookeeper-3.4.6/bin/../lib/slf4j-api-1.6.1.jar:/home/zookeeper-3.4.6/bin/../lib/netty-3.7.0.Final.jar:/home/zookeeper-3.4.6/bin/../lib/log4j-1.2.16.jar:/home/zookeeper-3.4.6/bin/../lib/jline-0.9.94.jar:/home/zookeeper-3.4.6/bin/../zookeeper-3.4.6.jar:/home/zookeeper-3.4.6/bin/../src/java/lib/*.jar:/home/zookeeper-3.4.6/bin/../conf:.:/usr/local/jdk-1.8/jre/lib/rt.jar:/usr/local/jdk-1.8/lib/dt.jar:/usr/local/jdk-1.8=/lib/tools.jar:/java_conf/maven/demos
基于 ZooKeeper API 的编程环境搭建

1. 首先,使用 idea 搭建一个 Maven 项目
2. 修改 Maven 项目中的 pom.xml 文件

添加如下常用的依赖关系




  • <dependencies>



  •         <dependency>
  •             <groupId>org.slf4j</groupId>
  •             <artifactId>slf4j-api</artifactId>
  •             <version>1.7.1</version>
  •         </dependency>

  •         <dependency>
  •             <groupId>junit</groupId>
  •             <artifactId>junit</artifactId>
  •             <version>4.11</version>
  •         </dependency>

  •         <dependency>
  •             <groupId>log4j</groupId>
  •             <artifactId>log4j</artifactId>
  •             <version>1.2.16</version>
  •         </dependency>

  •         <dependency>
  •             <groupId>org.apache.zookeeper</groupId>
  •             <artifactId>zookeeper</artifactId>
  •             <version>3.4.6</version>
  •             <exclusions>
  •                 <exclusion>
  •                     <groupId>com.sun.jmx</groupId>
  •                     <artifactId>jmxri</artifactId>
  •                 </exclusion>
  •                 <exclusion>
  •                     <groupId>com.sun.jdmk</groupId>
  •                     <artifactId>jmxtools</artifactId>
  •                 </exclusion>
  •                 <exclusion>
  •                     <groupId>javax.jms</groupId>
  •                     <artifactId>jms</artifactId>
  •                 </exclusion>
  •             </exclusions>
  •         </dependency>

  •         <dependency>
  •             <groupId>org.apache.curator</groupId>
  •             <artifactId>curator-recipes</artifactId>
  •             <version>2.1.0-incubating</version>
  •         </dependency>
  •     </dependencies>

3. 编写简单的测试程序




  • package org.apache.zookeeper.demo;



  • import org.apache.zookeeper.*;
  • import org.apache.zookeeper.data.Stat ;
  • import org.apache.zookeeper.Watcher.Event ;


  • /**

  • * Created by root on 6/28/15.
  • */

  • public class App implements Watcher
  • {


  •     public void process( WatchedEvent event )
  •     {

  •         if ( event.getType() == Event.EventType.NodeChildrenChanged)
  •         {
  •             System.out.println ("child changed ") ;
  •         }
  •         if ( event.getType() == Event.EventType.NodeDeleted )
  •         {
  •             System.out.println ("node deleted ") ;
  •         }
  •         System.out.println(" operation event invoke :") ;
  •         System.out.println (event) ;
  •     }

  •     public static void main ( String [] args ) throws Exception
  •     {
  •         final String CONNECT_STRING = "127.0.0.1:2181" ;
  •         final int SESSION_LIMIT = 20000 ;


  •         App a = new App ( ) ;



  •         final ZooKeeper zk = new ZooKeeper( CONNECT_STRING , SESSION_LIMIT , a ) ;

  •         Stat e = zk.exists("/kylin" , a ) ;

  •         System.out.println("exists "+ e) ;

  •         zk.setData("/kylin" , "server.1=127.0.0.1:2181".getBytes() , -1 ) ;

  •         // here we gonna to create a path , and see what will happen

  •         // here we set the wabher for this path
  •         zk.exists("/new_create_path_for_test" , a) ;

  •         // here we try to re-create , and see if this operation will  invoke the Watcher execution
  •         zk.create("/new_create_path_for_test/children11" ,"test_path".getBytes() ,
  •                 ZooDefs.Ids.OPEN_ACL_UNSAFE ,
  •                 CreateMode.PERSISTENT) ;


  •     }
  • }

运行结果


operation event invoke :
WatchedEvent state:SyncConnected type:None path:null
exists 8589934607,12884901909,1435410248916,1435462858903,6,0,0,0,23,0,8589934607

operation event invoke :
WatchedEvent state:SyncConnected type:NodeDataChanged path:/kylin

Process finished with exit code 0

end

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-155660-1-1.html 上篇帖子: [java,zookeeper]2.1 KeeperState.SyncConnected linker 下篇帖子: Zookeeper学习笔记 1
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表