Zookeeper环境搭建及使用

1. Zookeeper了解
    Zookeeper有能力实现集中配置的能力,举个例子,应用app1 做集群配置,配置3个节点,把app1的配置统一放置zookeeper server /APP1上,所有的app1应用启动就对节点/APP1进行监控,并实现回调方法Watcher,那么在/APP1上数据发生变化的时候,每个app应用节点就会收到通知,Watcher方法被执行,则app1的应用就可以实时得到修改的配置。
Zookeeper 自身可以做集群配置,可以预防由于单点故障导致的信息崩溃问题。
Zookeeper 数据结构类似标准的文件系统
[img]

[/img]

Zookeeper数据结构有如下这些特点:
1. 每个子目录项如 NameService 都被称作为 znode,这个 znode 是被它所在的路径唯一标识,如 Server1 这个 znode 的标识为 /NameService/Server1
2. znode 可以有子节点目录,并且每个 znode 可以存储数据,注意 EPHEMERAL 类型的目录节点不能有子节点目录
3. znode 是有版本的,每个 znode 中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据
4. znode 可以是临时节点,一旦创建这个 znode 的客户端与服务器失去联系,这个 znode 也将自动删除,Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态称为 session,如果 znode 是临时节点,这个 session 失效,znode 也就删除了
5. znode 的目录名可以自动编号,如 App1 已经存在,再创建的话,将会自动命名为 App2
6. znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是 Zookeeper 的核心特性,Zookeeper 的很多功能都是基于这个特性实现的。


2. Zookeeper与redis比较
Zookeeper 不是一个通用的数据库或大型数据存储,而是管理协调数据,
结合软创系统的配置信息,配置信息量不会非常大,完全在可控范围内,同时需要稳定运行,消除单点宕机故障,读取速度不是太大的影响点,综上考虑采用zookeeper作为配置管理中心比较合适。

基于上面描述,使用zookeeper实现我们的配置中心是可行的

3. Zookeeper 安装及使用
3.1 安装(单机)
单机安装非常简单,具体步骤如下:
1. 使用zookeeper3.3.6版本,解压zookeeper-3.3.6.tar.gz至本地目录
2. 配置zoo.cfg(将自带的zoo_sample.cfg copy并改名为zoo.cfg)
# The number of milliseconds of each tick
#心跳时间,客户端与zookeeper server之间的心跳时间
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take 集群配置时,配置zookeeper接受客户端(客户端是指follower服务器,而不是client连接server的客户端) 初始化连接最长能接受的多少个心跳时间间隔数
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement  这个是集群配置时 follower与leader之间的请求应答时间
syncLimit=5
# the directory where the snapshot is stored. zookeeper保存数据目录
dataDir=D:/workspace/config-cache/zookeeper/zookeeper-3.3.6/data/zookeeper
# the port at which the clients will connect  客户端连接zookeeper server的端口
clientPort=2181

3. 启动zookeeper server
执行bin目录下zkServer.cmd
3.2 安装(集群)
配置zookeeper集群(或者在单机上配置伪集群)
本机设置集群,copy zookeeper-3.3.6 到另外一个目录
1. 设置hosts文件,设置server对应的ip
127.0.0.1   zkserver01
127.0.0.1    zkserver02

2. 修改配置文件zoo.cfg
#cluster config
server.1=zkserver01:2000:2001
server.2=zkserver02:2002:2003
解释一下上面的配置 server.1=zkserver01:2000:2001
1:表示第几号服务器,与myid中内容一致
zkserver01: 是server01 的ip地址,或者使用hosts中设置的主机名
2000:表示的是这个服务器与集群中的 Leader 服务器交换信息的端口
2001:表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口

另外,在zoo.cfg文件中,如果在同一台机器上设置集群,clientPort需要设置不同的端口号
3. 添加myid文件
在zoo.cfg 配置的dataDir路径下添加文件myid(文件名),文件内容就是上面的第几号服务器的值
4. 启动集群
执行server01 的zkServer.cmd
执行server02的zkServer.cmd
先执行的server01 在server02启动之前会抛出异常,随着server02启动之后趋于正常,异常可以忽略
3.3 使用demo
Demo中包含两个类Executor 和 DataMonitor 负责监听zookeeper某个节点,如果该节点数据发生变化,则dataMonitor会有所反应,然后把最新的data写入文件,并调用执行本地命令。
Zookeeper的watcher是单次有效,如果需要每次变化都能通知client,需要在client接受到变化之后再次注册watcher
if (path != null && path.equals(znode)) {
                // Something has changed on the node, let's find out
                zk.exists(znode, true, this, null);
            }

Zookeeper中watcher概念及特性可以查阅zookeeperProgrammers.pdf文档

单机zkserver执行Executor 的时候设置args: zkserver01:2181 / F:/app/log.txt hostname
集群执行的时候设置的hostPort 略有不同,zkserver01:2181, zkserver02:3181 / F:/app/log.txt hostname
zookeeper-client.zip为java project ,解压后import 到workspace即可

猜你喜欢

转载自wangyangqq2008.iteye.com/blog/2043026