zookeeper安装部署

zookeeper安装部署

下载

wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz

解压

tar xvf zookeeper-3.4.12.tar.gz

解压完成后进入zookeeper-3.4.12

目录结构如下:

├── bin

├── build.xml

├── conf

├── contrib

├── dist-maven

├── docs

├── ivysettings.xml

├── ivy.xml

├── lib

├── LICENSE.txt

├── NOTICE.txt

├── README.md

├── README_packaging.txt

├── recipes

├── src

├── zookeeper-3.4.12.jar

├── zookeeper-3.4.12.jar.asc

├── zookeeper-3.4.12.jar.md5

└── zookeeper-3.4.12.jar.sha1

其中:

  • bin

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

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

    • zk依赖的包。
  • contrib

    • 一些用于操作zk的工具包。
  • recipes

    • zk某些用法的代码示例

单机模式部署

单机模式的部署较为简单,主要用于开发环境下较为方便的开发和测试,生产环境不可应用单击模式,无论稳定性和IO效率单机模式都无法满足生产需求。

单机模式配置

运行单击模式需要更改一下配置文件,zk的本身提供了一个样例配置文件,位于conf/zoo_sample.cfg,复制一份命名为zoo.cfg并根据需求修改 cp conf/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=/depdata/zk/dataDir
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

其中:

  • tickTime

    • 心跳间隔时间,以毫秒为单位。客户端与ZK服务端每2000ms进行一次心跳通信,如果ZK服务端超过4000ms没有收到客户端的心跳,那么认为客户端会话超时
    • 更低的tickTime值可以更快的发现超时问题,但是也会因为心跳通信更频繁而导致更高的网络流量和更高的CPU使用
  • dataDir

    • ZK存储内存数据库的位置,目录位置可以自定义,更改为/depdata/zk/dataDir/
    • 注意提前创建/depdata/zk/dataDir/目录,并保证读写权限
  • clientPort

    • ZK服务进程监听的TCP端口,客户端与ZK服务端连接时即使用这个端口号

单机模式启动

启动服务端

后台启动 /bin/zkServer.sh start

如果想要前台启动并查看日志 bin/zkServer.sh start-foreground

可以观察到日志输出:

......

2018-06-24 18:01:21,076 [myid:] - INFO  [main:Environment@100] - Server environment:user.home=/root
2018-06-24 18:01:21,076 [myid:] - INFO  [main:Environment@100] - Server environment:user.dir=/storage/dep/zookeeper-3.4.12
2018-06-24 18:01:21,098 [myid:] - INFO  [main:ZooKeeperServer@835] - tickTime set to 2000
2018-06-24 18:01:21,098 [myid:] - INFO  [main:ZooKeeperServer@844] - minSessionTimeout set to -1
2018-06-24 18:01:21,098 [myid:] - INFO  [main:ZooKeeperServer@853] - maxSessionTimeout set to -1
2018-06-24 18:01:21,141 [myid:] - INFO  [main:ServerCnxnFactory@117] - Using org.apache.zookeeper.server.NIOServerCnxnFactory as server connection factory
2018-06-24 18:01:21,148 [myid:] - INFO  [main:NIOServerCnxnFactory@89] - binding to port 0.0.0.0/0.0.0.0:2181


观察日志可知ZK服务已经启动并且绑定了我们在配置文件zoo.cfg中指定的端口号2181

客户端连接

在同一台主机上可以启动ZK客户端进行连接 bin/zkCli.sh 默认客户端会连接本机127.0.0.1 端口号2181

如果客户端和服务端位于不同的机器,可以使用-server 来指定ip和端口,比如bin/zkCli.sh -server 192.168.4.50:2181

客户端连接成功之后,可以输出几个命令来测试客户端连接,如ls /

输出:[zookeeper]

创建一个节点 create /zk_test my_data,再ls /得到输出[zookeeper, zk_test],说明zk_test节点创建好了

观察我们在配置文件指定的dataDir(ZK存储内存数据库的位置)ll /depdata/zk/dataDir/发现已经有ZK创建的文件

关闭ZK服务bin/zkServer.sh stop

集群模式部署

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

注意

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

集群模式配置

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

tickTime=2000
dataDir=/depdata/zk/dataDir/
clientPort=2181
initLimit=5
syncLimit=2
server.0=192.168.4.50:2888:3888
server.1=vc1:2888:3888
server.2=vc2: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文件的内容。
    • 不同的机器下需要在dataDir下分别生成一个myid文件,文件的内容就是主机对应的id号,比如机器vc0的/depdata/zk/dataDir/下需要有文件myid,内容为0
    • host是该zk服务所在的IP地址
    • port1表示follower和leader交换消息所使用的端口,port2表示选举leader所使用的端口。

将配置文件拷贝到3个不同的主机之后,在/depdata/zk/dataDir下创建文件myid,文件myid的内容为0或1或2,取值对应的是server.id的配置值

集群模式启动

分别在3台主机上启动ZK服务bin/zkServer.sh start-foreground

查看ZK集群的服务状态

分别查看ZK的服务状态bin/zkServer.sh status

三台主机分别返回:


[root@vc1 zookeeper-3.4.12]# bin/zkServer.sh status  
ZooKeeper JMX enabled by default
Using config: /root/dep/zookeeper-3.4.12/bin/../conf/zoo.cfg
Mode: leader

[root@vc0 zookeeper-3.4.12]# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/dep/zookeeper-3.4.12/bin/../conf/zoo.cfg
Mode: follower


[root@vc2 zookeeper-3.4.12]# bin/zkServer.sh status  
ZooKeeper JMX enabled by default
Using config: /root/dep/zookeeper-3.4.12/bin/../conf/zoo.cfg
Mode: follower

测试集群高可用性

停掉集群中的为leader的ZK服务,在名称为vc1的主机上执行bin/zkServer.sh stop

连接集群

输入:bin/zkCli.sh -server 192.168.4.50:2181,192.168.4.14:2181,192.168.4.18:2181

响应:

2018-06-24 21:16:02,305 [myid:] - INFO  [main:ZooKeeper@441] - Initiating client connection, connectString=192.168.4.50:2181,192.168.4.14:2181,192.168.4.18:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@4b85612c
Welcome to ZooKeeper!
2018-06-24 21:16:02,360 [myid:] - INFO  [main-SendThread(192.168.4.18:2181):ClientCnxn$SendThread@1028] - Opening socket connection to server 192.168.4.18/192.168.4.18:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2018-06-24 21:16:02,422 [myid:] - INFO  [main-SendThread(192.168.4.18:2181):ClientCnxn$SendThread@878] - Socket connection established to 192.168.4.18/192.168.4.18:2181, initiating session
[zk: 192.168.4.50:2181,192.168.4.14:2181,192.168.4.18:2181(CONNECTING) 0] 2018-06-24 21:16:02,497 [myid:] - INFO  [main-SendThread(192.168.4.18:2181):ClientCnxn$SendThread@1302] - Session establishment complete on server 192.168.4.18/192.168.4.18:2181, sessionid = 0x2000002cb0c0000, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null

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

你可能感兴趣的:(zookeeper安装部署)