//下载
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
//解压
tar xvf zookeeper-3.4.6.tar.gz
//文件夹重命名
mv zookeeper-3.4.6 zk
//配置环境变量
export ZOOKEEPER_HOME=/usr/local/zk
export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf
cd conf/
mv zoo_sample.cfg zoo_1.cfg
mv zoo_sample.cfg zoo_2.cfg
mv zoo_sample.cfg zoo_3.cfg
zoo_1.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.
dataDir=/usr/local/zk/data_1
# the port at which the clients will connect
clientPort=2181
#the location of the log file
dataLogDir=/usr/local/zk/logs_1
server.0=128.199.173.52:2287:3387
server.1=128.199.173.52:2288:3388
server.2=128.199.173.52:2289:3389
zoo_2.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.
dataDir=/usr/local/zk/data_2
# the port at which the clients will connect
clientPort=2182
#the location of the log file
dataLogDir=/usr/local/zk/logs_2
server.0=128.199.173.52:2287:3387
server.1=128.199.173.52:2288:3388
server.2=128.199.173.52:2289:3389
zoo_3.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.
dataDir=/usr/local/zk/data_3
# the port at which the clients will connect
clientPort=2183
#the location of the log file
dataLogDir=/usr/local/zk/logs_3
server.0=128.199.XXX.XX:2287:3387
server.1=128.199.XXX.XX:2288:3388
server.2=128.199.XXX.XX:2289:3389
- initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20 秒。
- syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 5*2000=10 秒。
- server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器,就是集群模式下配置的myid文件所存放的数值;B是这个服务器的ip地址;C表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于B都是一样,所以不同的Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
/usr/local/zk/data_x目录中分别创建myid,cfg文件中的server.X,“X”表示每个目录中的myid的值。
vi myid
在bin目录中启动zookeeper
./zkServer.sh start zoo1.cfg
在bin目录中查看zookeeper运行状态
./zkServer.sh status zoo1.cfg
通过客户端连接,进入zookeeper命令行
bin/zkCli.sh -server 128.199.XXX.XX:2181,128.199.XXX.XX:2182,128.199.XXX.XX:2183
zookeeper命令:
//查看操作
help
//查看已经存在的znode
ls /
//创建znode
create /test "test"
//获取znode
get /test
//删除znode。若删除节点存在子节点,必须先删除子节点,再删除父节点。
delete /test
//创建临时节点,创建它的客户端断开时会自动删除
create -e /test-temp "temp"
//创建顺序节点,会在节点名后添加自增长数字
create -s /test-no. ""
//更新节点
set /test "test2"
//退出
quit
Znode维护着数据、ACL(access control list,访问控制列表)、时间戳等交换版本号等数据结构。每当Znode中的数据更新后它所维护的版本号将增加,这非常类似于数据库中计数器时间戳的操作方式。另外Znode还具有原子性操作的特点:命名空间中,每一个Znode的数据将被原子地读写。读操作将读取与Znode相关的所有数据,写操作将替换掉所有的数据。除此之外,每一个节点都有一个访问控制列表,这个访问控制列表规定了用户操作的权限。
ZooKeeper中同样存在临时节点。这些节点与session同时存在,当session生命周期结束,这些临时节点也将被删除。临时节点在某些场合也发挥着非常重要的作用。Watch机制就是监控某一个或者一些Znode的变化。一个Watch事件是一个一次性的触发器,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端,以便通知它们。
Watch机制主要有以下三个特点:
1.一次性的触发器
当数据改变的时候,那么一个Watch事件会产生并且被发送到客户端中。但是客户端只会收到一次这样的通知,如果以后这个数据再次发生改变的时候,之前设置Watch的客户端将不会再次收到改变的通知。
例子:如果客户端调用了 getData("/znode1", true) 并且稍后 /znode1 节点上的数据发生了改变或者被删除了,客户端将会获取到 /znode1 发生变化的监视事件,而如果 /znode1 再一次发生了变化,除非客户端再次对 /znode1 设置监视,否则客户端不会收到事件通知。
2.发送给客户端(Sent to the client)
这个表明了Watch的通知事件是从服务器发送给客户端的,Zookeeper客户端和服务端是通过Socket进行通信的,是异步的,这就表明不同的客户端收到的Watch的时间可能不同(或因为故障不会成功地到达客户端),但是ZooKeeper有保证当一个客户端在看到Watch事件之前不会看到结点数据的变化。
例子:A=3,此时在上面设置了一次Watch,如果A突然变成4了,那么客户端会先收到Watch事件的通知,然后才会看到A=4。
3.被设置Watch的数据
znode 节点本身具有不同的改变方式。也可以想象 Zookeeper 维护了两条监视链表:数据监视和子节点监视getData()/exists()设置数据监视。getChildren() 设置子节点监视。
例子:
一次成功的 setData()会触发设置在某一节点上所设置的数据监视。
一次成功的 create() 操作则会出发当前节点上所设置的数据监视以及父节点的子节点监视(child watch)。
一次成功的 delete() 操作将会触发当前节点的数据监视和子节点监视事件,同时也会触发该节点父节点的的子节点监视(child watch)。
当客户端与Zookeeper服务器端失去联系时,客户端并不会收到监视事件的通知,当客户端重新连接后,以前注册的监视会重新被注册并触发,对于开发人员来说 这通常是透明的。只有一种情况会导致监视事件的丢失,即:通过exists()设置了某个znode节点的监视,但是如果某个客户端在此znode节点被创建和删除的时间间隔内与zookeeper服务器失去了联系,该客户端即使稍后重新连接 zookeeper服务器后也得不到事件通知。-
ACL访问控制列表。ZooKeeper使用ACL来控制对旗下Znode结点们的访问。通过设置权限为来表明是否允许改变一个结点的内容。需要注意的是一条ACL仅针对于一个特定的节点,不适用于子节点。
例子:如果/app 只对IP:172.16.16.1可读 而 / APP/status 是对任何人可读的。
与传统Linux机制不同,一个结点的数据没有类似“拥有者,组用户,其他用户”的概念,在ZooKeeper中,ACL通过设置ID以及与其关联的权限来完成访问控制的。ACL的权限组成语法是:(scheme:expression, perms)。前者表明设置的ID,逗号后面表示的是ID相关的权限。
例子:ip:172.16.16.1,READ 指明了IP地址为如上的用户的权限为只读。可设置的schemes: world 有个唯一的id, anyone ,代表所有人。 auth 不使用任何id,代表任何已认证的用户。 digest 用 username:password 字符串来产生一个MD5串,然后该串被用来作为ACL ID。认证是通过明文发送username:password 来进行的,当用在ACL时,表达式为username:base64 ,base64是password的SHA1摘要的编码。 ip 使用客户端的主机IP作为ACL ID 。这个ACL表达式的格式为addr/bits ,此时addr中的有效位与客户端addr中的有效位进行比对。 可设置的权限: CREATE:表明你可以创建一个Znode的子结点。 READ:你可以得到这个结点的数据以及列举该结点的子结点情况。 WRITE:设置一个结点的数据。 DELETE:可以删除一个结点 ADMIN:对一个结点设置权限。