zookeeper
ZooKeeper简介
ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。

ZooKeeper设计目的
1.最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。
2.可靠性:具有简单、健壮、良好的性能,如果消息m被到一台服务器接受,那么它将被所有的服务器接受。
3.实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。
4.等待无关(wait-free):慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待。
5.原子性:更新只能成功或者失败,没有中间状态。
6.顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。
ZooKeeper数据模型
Zookeeper会维护一个具有层次关系的数据结构,它非常类似于一个标准的文件系统,比如linux的目录结构。如图所示:

Zookeeper这种数据结构有如下这些特点:
1)每个子目录项如NameService都被称作为znode,这个znode是被它所在的路径唯一标识,如Server1这个znode的标识为/NameService/Server1。
2)znode可以有子节点目录,并且每个znode可以存储数据,注意EPHEMERAL(临时的)类型的目录节点不能有子节点目录。
3)znode是有版本的(version),每个znode中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据,version号自动增加。
4)znode的类型:
- Persistent 节点,一旦被创建,便不会意外丢失,即使服务器全部重启也依然存在。每个 Persist 节点即可包含数据,也可包含子节点。
- Ephemeral 节点,在创建它的客户端与服务器间的 Session 结束时自动被删除。服务器重启会导致 Session 结束,因此 Ephemeral 类型的 znode 此时也会自动删除。
- Non-sequence 节点,多个客户端同时创建同一 Non-sequence 节点时,只有一个可创建成功,其它匀失败。并且创建出的节点名称与创建时指定的节点名完全一样。
- Sequence 节点,创建出的节点名在指定的名称之后带有10位10进制数的序号。多个客户端创建同一名称的节点时,都能创建成功,只是序号不同。
5)znode可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是Zookeeper的核心特性,Zookeeper的很多功能都是基于这个特性实现的。
6)ZXID:每次对Zookeeper的状态的改变都会产生一个zxid(ZooKeeper Transaction Id),zxid是全局有序的,如果zxid1小于zxid2,则zxid1在zxid2之前发生。
zookeeper分布式集群部署
部署环境如下:
我们知道zookeeper分布式集群的部署节点数要大于或等于3,当节点数失效为集群节点总数的一半的时候zk集群便不起作用,一般部署zk集群的节点数量为至少3的奇数(例如3、5、7这要看生产环境中规模),我们按照3个节点来部署zk集群。
| zk集群架构 | ||
| 主机名 | IP地址 | |
| server1 | s100 | 192.168.1.100 |
| server2 | s101 | 192.168.1.101 |
| server3 | s102 | 192.168.1.102 |
首先在s100上部署zookeeper
#部署zookeeper root@s100:~/Downloads# tar xf zookeeper-3.4.10.tar.gz -C /soft/ root@s100:~/Downloads# cd /soft/ root@s100:/soft# ln -s /soft/zookeeper-3.4.10 /soft/zk #添加zookeeper的环境变量 root@s100:/soft# vim /etc/environment JAVA_HOME=/soft/jdk HADOOP_HOME=/soft/hadoop ZOOKEEPER_HOME=/soft/zk PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/so ft/jdk/bin:/soft/hadoop/bin:/soft/hadoop/sbin:/soft/zk/bin" root@s100:/soft# source /etc/environment #修改zookeeper的配置文件 root@s100:/soft/zk/conf# cp zoo_sample.cfg zoo.cfg root@s100:~# grep '^[a-Z]' /soft/zk/conf/zoo.cfg tickTime=2000 initLimit=10 syncLimit=5 dataDir=/root/zkdata clientPort=2181 server.100=s100:2888:3888 server.101=s101:2888:3888 server.102=s102:2888:3888 #创建zookeeper配置文件中定义的目录zkdata root@s100:~# mkdir zkdata #创建zookeeper的节点的myid,这个一定要创建,myid在zk选举leader时要用到,而且myid每个节点的值不同 root@s100:~# echo 100 > zkdata/myid
在s100节点上部署完zk后就可以将配置推送到s101及s102节点上,使这些节点部署成zk集群
root@s100:~# rsync -lr /soft/* s101:/soft/ root@s100:~# rsync -lr /soft/* s102:/soft/ root@s100:~# scp /etc/environment s101:/etc/ root@s100:~# scp /etc/environment s102:/etc/ #在s101 s102上source环境变量,创建zkdata目录,生成myid等 root@s101:~# source /etc/environment root@s102:~# source /etc/environment root@s101:~# mkdir zkdata root@s102:~# mkdir zkdata root@s101:~# echo 101 > zkdata/myid root@s102:~# echo 102 > zkdata/myid
最后在每个节点上启动zk服务
root@s100:~# zkServer.sh start root@s100:~# ssh s101 zkServer.sh start root@s100:~# ssh s102 zkServer.sh start #查看leader的选举结果 root@s100:~# zkServer.sh status Mode: follower root@s100:~# ssh s101 zkServer.sh status Mode: leader root@s100:~# ssh s102 zkServer.sh status Mode: follower
这个leader的选举过程一般是按照myid的大小来选举的,myid大的选举成leader的几率越大,这要看服务器的启动过程,如果是服务器集群同时启动,基本上是按照myid的值越大选举成leader几率越来,如果服务器是一个个手工启动的话,当启动的服务器数量超过集群节点总数一半的时候leader便选举成功,至于后面启动的主机无论myid是大还是小都会成为follower角色。
使用客户端来连接zk服务
#直接连接到本地的zk服务
root@s100:~# zkCli.sh #客户端脚本后不加任何参数
[zk: localhost:2181(CONNECTED) 0]
#连接到远程的zk服务,比如连接到s101上的zk
root@s100:~# zkCli.sh -server s101:2181
[zk: s101:2181(CONNECTED) 0]
#通过help命令可以查看zk中可以使用的命令,比如增(create)、删(delete rmr)、改(set)、查(get ls)
[zk: s101:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
浙公网安备 33010602011771号