• ZooKeeper的安装与部署


    ZooKeeper的安装与部署

    1         系统要求

    ZooKeeper支持的运行平台

     

        ZooKeeper可以运行在多种系统平台上面,上表展示了zk支持的系统平台,以及在该平台上是否支持开发环境或者生产环境。

    系统

    开发环境

    生产环境

    Linux

    支持

    支持

    Solaris

    支持

    支持

    FreeBSD

    支持

    支持

    Windows

    支持

    不支持

    MacOS

    支持

    不支持

       

     

     

     

     

     

     

     

     

     

           ZooKeeper是用Java编写的,运行在Java环境上,因此,在部署zk的机器上需要安装Java运行环境。为了正常运行zk,我们需要JRE1.6或者以上的版本。 
    对于集群模式下的ZooKeeper部署,3个ZooKeeper服务进程是建议的最小进程数量,而且不同的服务进程建议部署在不同的物理机器上面,以减少机器宕机带来的风险,以实现ZooKeeper集群的高可用。 
           ZooKeeper对于机器的硬件配置没有太大的要求。例如,在Yahoo!内部,ZooKeeper部署的机器其配置通常如下:双核处理器,2GB内存,80GB硬盘。

     

    2         安装包下载及软件目录

    可以从 https://zookeeper.apache.org/releases.html 下载ZooKeeper,目前最新的稳定版本为 3.4.8 版本,用户可以自行选择一个速度较快的镜像来下载即可

    [root@xuegod42 ~]# tar xf zookeeper-3.4.8.tar.gz -C /usr/local/src/

    下载并解压ZooKeeper软件压缩包后,可以看到zk包含以下的文件和目录

    [root@xuegod42 ~]# ls /usr/local/src/zookeeper-3.4.8/

    bin          contrib          ivy.xml      README_packaging.txt  zookeeper-3.4.8.jar

    build.xml    dist-maven       lib          README.txt            zookeeper-3.4.8.jar.asc

    CHANGES.txt  docs             LICENSE.txt  recipes               zookeeper-3.4.8.jar.md5

    conf         ivysettings.xml  NOTICE.txt   src                   zookeeper-3.4.8.jar.sha1

    bin目录 : zk的可执行脚本目录,包括zk服务进程,zk客户端,等脚本。其中,.sh是Linux环境下的脚本,.cmd是Windows环境下的脚本。

    conf目录 : 配置文件目录。zoo_sample.cfg为样例配置文件,需要修改为自己的名称,一般为zoo.cfg。log4j.properties为日志配置文件。

    lib :zk依赖的包。

    contrib目录 : 一些用于操作zk的工具包。

    recipes目录 : zk某些用法的代码示例

    3         单机模式

    ZooKeeper的安装包括单机模式安装,以及集群模式安装。

    单机模式较简单,是指只部署一个zk进程,客户端直接与该zk进程进行通信。 
    在开发测试环境下,通过来说没有较多的物理资源,因此我们常使用单机模式。当然在单台物理机上也可以部署集群模式,但这会增加单台物理机的资源消耗。故在开发环境中,我们一般使用单机模式。 
    但是要注意,生产环境下不可用单机模式,这是由于无论从系统可靠性还是读写性能,单机模式都不能满足生产的需求。

    3.1     安装jdk

    [root@xuegod42 ~]# rpm -ivh jdk-8u60-linux-x64.rpm

    配置环境变量

    [root@xuegod42 ~]# vim /etc/profile      #添加如下配置

    export JAVA_HOME=/usr/java/jdk1.8.0_60

    export JAVA_BIN=/usr/java/jdk1.8.0_60/bin

    export PATH=${JAVA_HOME}bin:$PATH

    export CLASSPATH=.:${JAVA_HOME}/lib.dt.jar:${JAVA_HOME}/lib/tools.jar

    [root@xuegod42 ~]# source /etc/profile

    [root@xuegod42 ~]# java -version

    java version "1.8.0_60"

    Java(TM) SE Runtime Environment (build 1.8.0_60-b27)

    Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)

    [root@xuegod42 ~]# scp /etc/profile root@192.168.10.43:/etc/

    3.2     运行配置

    上面提到,conf目录下提供了配置的样例zoo_sample.cfg,要将zk运行起来,需要将其名称修改为zoo.cfg。 
    打开zoo.cfg,可以看到默认的一些配置。

    [root@xuegod42 conf]# ls

    configuration.xsl  log4j.properties  zoo_sample.cfg

    [root@xuegod42 conf]# mv zoo_sample.cfg zoo.cfg

    [root@xuegod42 conf]# vim 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=/tmp/zookeeper

    # the port at which the clients will connect

    clientPort=2181

    • tickTime 
      时长单位为毫秒,为zk使用的基本时间度量单位。例如,1 * tickTime是客户端与zk服务端的心跳时间,2 * tickTime是客户端会话的超时时间。 
      tickTime的默认值为2000毫秒,更低的tickTime值可以更快地发现超时问题,但也会导致更高的网络流量(心跳消息)和更高的CPU使用率(会话的跟踪处理)。
    • clientPort 
      zk服务进程监听的TCP端口,默认情况下,服务端会监听2181端口。
    • dataDir 
      无默认配置,必须配置,用于配置存储快照文件的目录。如果没有配置dataLogDir,那么事务日志也会存储在此目录。

    dataDir=/usr/local/zookeeper/data

    dataLogDir=/usr/local/zookeeper/logs

    3.3     运行

    [root@xuegod42 ~]# mv /usr/local/src/zookeeper-3.4.8/ /usr/local/

    [root@xuegod42 ~]# mv /usr/local/zookeeper-3.4.8/ /usr/local/zookeeper

    在Windows环境下,直接双击zkServer.cmd即可。在Linux环境下,进入bin目录,执行命令

    [root@xuegod42 bin]# ./zkServer.sh start

    这个命令使得zk服务进程在后台进行。

    如果想在前台中运行以便查看服务器进程的输出日志,可以通过以下命令运行:

    ./zkServer.sh start-foreground

    执行此命令,可以看到大量详细信息的输出,以便允许查看服务器发生了什么。

    使用文本编辑器打开zkServer.cmd或者zkServer.sh文件,可以看到其会调用zkEnv.cmd或者zkEnv.sh脚本。zkEnv脚本的作用是设置zk运行的一些环境变量,例如配置文件的位置和名称等。

    3.4     连接

    如果是连接同一台主机上的zk进程,那么直接运行bin/目录下的zkCli.cmd(Windows环境下)或者zkCli.sh(Linux环境下),即可连接上zk。 
    直接执行zkCli.cmd或者zkCli.sh命令默认以主机号 127.0.0.1,端口号 2181 来连接zk,如果要连接不同机器上的zk,可以使用 -server 参数,例如:

    [root@xuegod42 zookeeper]# ./bin/zkCli.sh  -server 127.0.0.1:2181

    4         集群模式

    单机模式的zk进程虽然便于开发与测试,但并不适合在生产环境使用。在生产环境下,我们需要使用集群模式来对zk进行部署。

    注意: 
    在集群模式下,建议至少部署3个zk进程,或者部署奇数个zk进程。如果只部署2个zk进程,当其中一个zk进程挂掉后,剩下的一个进程并不能构成一个quorum的大多数。因此,部署2个进程甚至比单机模式更不可靠,因为2个进程其中一个不可用的可能性比一个进程不可用的可能性还大。

    4.1     运行配置

    在集群模式下,所有的zk进程可以使用相同的配置文件(是指各个zk进程部署在不同的机器上面),例如如下配置:

    tickTime=2000

    dataDir=/usr/local/zookeeper/data

    dataLogDir=/usr/local/zookeeper/logs

    clientPort=2181

    initLimit=5

    syncLimit=2

    server.1=192.168.10.42:2888:3888

    server.2=192.168.10.43:2888:3888

    server.3=192.168.10.44:2888:3888

    • initLimit 
      ZooKeeper集群模式下包含多个zk进程,其中一个进程为leader,余下的进程为follower。 
      当follower最初与leader建立连接时,它们之间会传输相当多的数据,尤其是follower的数据落后leader很多。initLimit配置follower与leader之间建立连接后进行同步的最长时间。
    • syncLimit 
      配置follower和leader之间发送消息,请求和应答的最大时间长度。
    • tickTime 
      tickTime则是上述两个超时配置的基本单位,例如对于initLimit,其配置值为5,说明其超时时间为 2000ms * 5 = 10秒。
    • server.id=host:port1:port2 
      其中id为一个数字,表示zk进程的id,这个id也是dataDir目录下myid文件的内容。 
      host是该zk进程所在的IP地址,port1表示follower和leader交换消息所使用的端口,port2表示选举leader所使用的端口。
    • dataDir 
      其配置的含义跟单机模式下的含义类似,不同的是集群模式下还有一个myid文件。myid文件的内容只有一行,且内容只能为1 - 255之间的数字,这个数字亦即上面介绍server.id中的id,表示zk进程的id。

    注意: 
    如果仅为了测试部署集群模式而在同一台机器上部署zk进程,server.id=host:port1:port2配置中的port参数必须不同。但是,为了减少机器宕机的风险,强烈建议在部署集群模式时,将zk进程部署不同的物理机器上面。

    4.2     启动

    假如我们打算在三台不同的机器 192.168.229.160,192.168.229.161,192.168.229.162上各部署一个zk进程,以构成一个zk集群。 

    三个zk进程均使用相同的 zoo.cfg 配置:

    tickTime=2000

    dataDir=/usr/local/zookeeper/data

    dataLogDir=/usr/local/zookeeper/logs

    clientPort=2181

    initLimit=5

    syncLimit=2

    server.1=192.168.10.42:2888:3888

    server.2=192.168.10.43:2888:3888

    server.3=192.168.10.44:2888:3888

    在三台机器dataDir目录( /home/myname/zookeeper 目录)下,分别生成一个myid文件,其内容分别为1,2,3。然后分别在这三台机器上启动zk进程,这样我们便将zk集群启动了起来。

    [root@xuegod42 data]# cat myid

    1

    [root@xuegod43 data]# cat myid

    2

    [root@xuegod44 data]# cat myid

    3

    4.3     连接

    可以使用以下命令来连接一个zk集群:

    bin/zkCli.sh -server 192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181

    成功连接后,可以看到如下输出:

    2016-06-28 19:29:18,074 [myid:] - INFO  [main:ZooKeeper@438] - Initiating client connection, connectString=192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@770537e4

    Welcome to ZooKeeper!

    2016-06-28 19:29:18,146 [myid:] - INFO  [main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@975] - Opening socket connection to server 192.168.229.162/192.168.229.162:2181. Will not attempt to authenticate using SASL (unknown error)

    JLine support is enabled

    2016-06-28 19:29:18,161 [myid:] - INFO  [main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@852] - Socket connection established to 192.168.229.162/192.168.229.162:2181, initiating session

    2016-06-28 19:29:18,199 [myid:] - INFO  [main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@1235] - Session establishment complete on server 192.168.229.162/192.168.229.162:2181, sessionid = 0x3557c39d2810029, negotiated timeout = 30000

     

    WATCHER::

     

    WatchedEvent state:SyncConnected type:None path:null

    [zk: 192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181(CONNECTED) 0]

     

    图2:客户端连接zk集群的输出日志

    从日志输出可以看到,客户端连接的是192.168.229.162:2181进程(连接上哪台机器的zk进程是随机的),客户端已成功连接上zk集群。

    5         伪集群模式

    所谓伪集群, 是指在单台机器中启动多个zookeeper进程, 并组成一个集群. 以启动3个zookeeper进程为例.

    将zookeeper的目录拷贝2份:

    Bash代码  

    1. |--zookeeper0  
    2. |--zookeeper1  
    3. |--zookeeper2  

     更改zookeeper0/conf/zoo.cfg文件为:

    Bash代码  

    1. tickTime=2000    
    2. initLimit=5    
    3. syncLimit=2    
    4. dataDir=/Users/apple/zookeeper0/data    
    5. dataLogDir=/Users/apple/zookeeper0/logs    
    6. clientPort=4180  
    7. server.0=127.0.0.1:8880:7770    
    8. server.1=127.0.0.1:8881:7771    
    9. server.2=127.0.0.1:8882:7772  

    新增了几个参数, 其含义如下:

    • initLimit: zookeeper集群中的包含多台server, 其中一台为leader, 集群中其余的server为follower. initLimit参数配置初始化连接时, follower和leader之间的最长心跳时间. 此时该参数设置为5, 说明时间限制为5倍tickTime, 即5*2000=10000ms=10s.
    • syncLimit: 该参数配置leader和follower之间发送消息, 请求和应答的最大时间长度. 此时该参数设置为2, 说明时间限制为2倍tickTime, 即4000ms.
    • server.X=A:B:C 其中X是一个数字, 表示这是第几号server. A是该server所在的IP地址. B配置该server和集群中的leader交换消息所使用的端口. C配置选举leader时所使用的端口. 由于配置的是伪集群模式, 所以各个server的B, C参数必须不同.

    参照zookeeper0/conf/zoo.cfg, 配置zookeeper1/conf/zoo.cfg, 和zookeeper2/conf/zoo.cfg文件. 只需更改dataDir, dataLogDir, clientPort参数即可.

    在之前设置的dataDir中新建myid文件, 写入一个数字, 该数字表示这是第几号server. 该数字必须和zoo.cfg文件中的server.X中的X一一对应.
    /Users/apple/zookeeper0/data/myid文件中写入0, /Users/apple/zookeeper1/data/myid文件中写入1, /Users/apple/zookeeper2/data/myid文件中写入2.

    分别进入/Users/apple/zookeeper0/bin, /Users/apple/zookeeper1/bin, /Users/apple/zookeeper2/bin三个目录, 启动server.
    任意选择一个server目录, 启动客户端:

    Bash代码  

    1. bin/zkCli.sh -server localhost:4180  

    参考资料:

    1.http://blog.csdn.net/lihao21/article/details/51778255

    2.http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html

    3.http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html

    4.《ZooKeeper分布式系统开发实战》课程,主讲人:玺感

    5.《ZooKeeper分布式过程协同技术详解》,Flavio Junqueira等著,谢超等译

    6.百度百科有关quorum的解释,http://baike.baidu.com/link?url=pqWrzgH-_VhMLnscR1iRTpPjovfyhxG-8Qs9HxGutiGi5bhnA_lX_pmabLQ-3MiDeigcHRFMYSbFg90RAYVAta

    7.《Zookeeper 安装和配置》,http://coolxing.iteye.com/blog/1871009

  • 相关阅读:
    利用SuperMap Deskpro进行Peking 54到WGS84的转换
    远程序列化xml文件(可用于自动更新程序中版本号的比较,更新文件的读取等)
    [转]C#导出到EXCEL
    [转]常用数学公式
    CLR Via C#系列学习笔记之委托
    黑马程序员C#语言中的三种循环:while 循环、dowhile 循环、for 循环。
    .net2005中GridView或者Datalist等超級流行的分頁
    Array.splice()删除数组中重复的数据
    .net中常需对文件夹以及常用的操作方法
    文件的上传下载示例
  • 原文地址:https://www.cnblogs.com/hailun1987/p/7537883.html
Copyright © 2020-2023  润新知