它是什么
俗称动物管理员,它使用java开发,开源,接口简单,高效,稳定的分布式系统,为其它分布式系统提供协调服务
为什么会存在?
开发分布式系统跟单机上做开发完全不同,碰到的问题完全不同,开发分布式系统会碰到很多棘手的问题,
比如:多台机器间怎么保证数据一致性,需要分布式锁服务,操作数据如何保证按序处理,如何同步集群状态,如何更新集群配置等, 为完成不同功能的分布式系统越来越多,分布式系统碰到的问题有很多共性的部分,如果每个分布式系统都自己解决和实现这些问题,会造成 开发资源的浪费,如果有一个松散耦合易使用提供分布式锁服务和低容量数据存储高可靠高性能的分布式系统,我们可以直接使用,不用自己开发了, zookeeper就是一个这样的系统它可以做什么
命名服务
集群管理 主从切换 服务监控 配置同步 集群选主 分布式锁服务 同步队列 FIFO队列准备
1.JDK6 or greater
2.CPU 2个,2G RAM,80G硬盘 3.机器数: 3 (集群机器数需要符合2n+1,n为集群中可以挂掉的机器个数,至少有一半以上的机器正常,集群才会进行服务) 4.集群配置 server1 ip:192.168.1.15 id:0 server2 ip:192.168.1.16 id:1 server3 ip:192.168.17 id:2下载
wget http://mirrors.hust.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz
解压
[root@master src]# tar xvzf zookeeper-3.4.12.tar.gz
配置
集群中每台机器配置一样,除了data目录下myid文件不一样(存储了当前机器节点编号)
[root@master conf]# cd zookeeper-3.4.12/conf[root@master conf]# cp zoo_sample.cfg zoo.cfg[root@master conf]# cd ..[root@master zookeeper-3.4.12]# mkdir data[root@master zookeeper-3.4.12]# cd data[root@master data]# pwd/usr/local/src/zookeeper-3.4.12/data[root@master data]# echo 0 > myid[root@master data]# lsmyid[root@master data]# cat myid0[root@master data]# vim ../conf/zoo.cfg
# The number of milliseconds of each ticktickTime=2000# 连接leader节点超时tick,超时20秒initLimit=10# 同步主节点数据时,允许的最大过期时间差syncLimit=5# 落地数据目录,保存了快照数据,tx log,myid文件也放在这个目录下dataDir=/usr/local/src/zookeeper-3.4.12/data# the port at which the clients will connectclientPort=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 dataDirautopurge.snapRetainCount=3# Purge task interval in hours# Set to "0" to disable auto purge featureautopurge.purgeInterval=1# quorum 机器列表server.0=master:2888:3888server.1=slave1:2888:3888server.2=slave2:2888:3888
同步到slave1,slave2
修改data/myid文件,值跟servers配置中序号一致
启动
每台机器执行
[root@master zookeeper-3.4.12]# cd bin[root@master bin]# pwd/usr/local/src/zookeeper-3.4.12/bin[root@master bin]# lsREADME.txt zkCleanup.sh zkCli.cmd zkCli.sh zkEnv.cmd zkEnv.sh zkServer.cmd zkServer.sh[root@master bin]# ./zkServer.sh startZooKeeper JMX enabled by defaultUsing config: /usr/local/src/zookeeper-3.4.12/bin/../conf/zoo.cfgStarting zookeeper ... STARTED[root@master bin]# jps1408 Jps1389 QuorumPeerMain
查看状态
[root@master bin]# ./zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /usr/local/src/zookeeper-3.4.12/bin/../conf/zoo.cfgMode: follower
停止
每台机器执行
[root@slave2 bin]# ./zkServer.sh stopZooKeeper JMX enabled by defaultUsing config: /usr/local/src/zookeeper-3.4.12/bin/../conf/zoo.cfgStopping zookeeper ... STOPPED
基本操作
打开交互环境
[root@master bin]# ./zkCli.shConnecting to localhost:2181
显示帮助信息
[zk: localhost:2181(CONNECTED) 0] helpZooKeeper -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
显示节点
[zk: localhost:2181(CONNECTED) 1] ls /[zookeeper]
创建节点
[zk: localhost:2181(CONNECTED) 3] create /zk_test 123Created /zk_test[zk: localhost:2181(CONNECTED) 4] ls /[zookeeper, zk_test]
读取节点内容
[zk: localhost:2181(CONNECTED) 5] get /zk_test123cZxid = 0x300000002ctime = Thu Sep 06 12:33:46 CST 2018mZxid = 0x300000002mtime = Thu Sep 06 12:33:46 CST 2018pZxid = 0x300000002cversion = 0dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 3numChildren = 0
更改节点内容
[zk: localhost:2181(CONNECTED) 6] set /zk_test 456cZxid = 0x300000002ctime = Thu Sep 06 12:33:46 CST 2018mZxid = 0x300000003mtime = Thu Sep 06 12:35:13 CST 2018pZxid = 0x300000002cversion = 0dataVersion = 1aclVersion = 0ephemeralOwner = 0x0dataLength = 3numChildren = 0
删除节点
[zk: localhost:2181(CONNECTED) 8] delete /zk_test[zk: localhost:2181(CONNECTED) 9] ls /[zookeeper]
启动/恢复流程
主挂掉了或者刚开始启动,会通过paxos算法进行选主。选主完成后,learner节点需要从leader节点同步状态信息,一半以上learner节点同步完成后,集群可以开始对外服务了。
节点角色
包含leader,follower,observer。
leader,领导者,负责处理客户端请求,负责写请求投票发起,一半以上follower都同意时,写请求会被接受,写消息原子广播给follower和observer节点,
保证任意时刻所有节点状态信息都是同步的follower:处理客户端请求,写请求转发给leader处理,发起选主投票
observer:只处理客户端请求,不参与投票和发起
数据模型
树状结构,由一系列的节点组成,节点之间有层次关系,节点有自己的属性,节点可以存储自己的数据,节点可以设置自己相关的访问权限
例如
/node1/node1_1 /node1_2 /node_1_2_1/node2/node2_1 /mode2_2
节点类型
PERSISTENT
持久节点PERSISTENT_SEQUENTIAL
持久顺序节点EPHEMERAL
临时节点,客户端断开连接,节点自动删除EPHEMERAL_SEQUENTIAL
临时顺序节点节点权限
ACL: Access Control List
用一个三元组定义客户端的访问权限
(scheme:expression, perms)scheme
模式 | 描述 |
---|---|
World | 它下面只有一个id, 叫anyone, world:anyone代表任何人, zookeeper中对所有人有权限的结点就是属于world:anyone的 |
Auth | 已经被认证的用户(可以用过用户名:密码的方式,kerberos) |
Digest | 通过username: password字符串的MD5编码认证用户 |
Host | 匹配主机名后缀,如, host:corp.com匹配host:host1.corp.com, host:host2.corp.com,但不能匹配host:host1.store.com |
IP | 通过IP识别用户,表达式格式为 addr/bits |
perms
权限 | 描述 | 备注 |
---|---|---|
CREATE | 有创建子节点的权限 | -- |
READ | 有读取节点数据和子节点列表的权限 | -- |
WRITE | 有修改节点数据的权限 | 无创建和删除子节点的权限 |
DELETE | 有删除子节点的权限 | -- |
ADMIN | 有设置节点权限的权限 | -- |
节点监控
客户端监控节点的状态变化,zk通过事件通知客户端,这是非常重要的一个功能,zk支持的功能很多依赖这个实现。事件触发后,监控不再生效,
需要客户端主动重新设置监控才会生效,这里网络抖动会有问题,事件已触发,但客户端没有接收到通知,客户端需要容错机制处理。 通知的类型有,节点数据变化,节点删除,子节点列表变化。应用场景
命名服务
创建持久顺序节点,保证每个节点名是唯一的,取节点名作为主机名
配置管理
创建一个节点存储配置数据,系统其它服务节点监控这个节点的数据变化。当配置有更改时,zk会通知到系统服务节点,服务节点从zk拉取数据,更新自己的配置。
服务可用监控
创建一个节点,每个服务此节点下创建一个临时节点,流量分发器监控这个父节点子节点的变化,当有个服务节点挂掉时,会触发子节点变化事件,zk通知流量分发器,
分发器接到通知,踢掉不可用的节点,不再分配流量。选主服务
每个节点创建一个临时顺序节点,可以制定一个选主策略,比如优先选择顺序号最小的那个作为主,如果主挂了,对应的临时顺序节点也消失了,肯定不会选到有问题的节点作为主。
主从切换
主从节点分别创建临时节点,从节点监控主zk上的节点是否存在的事件,当接收到这个事件通知时,自动切换到主的状态。
分布式锁服务
假如存在/locks节点,客户端在/locks节点下创建临时顺序子节点,获取/locks下的所有子节点,当最小的那个等于自己时,获得锁,使用完,释放锁,删除临时子节点。
当子节点列表中最小的不是自己时,监控比自己小的节点,然后等待。当收到监控的小的节点删除通知时,重复第一步的操作,知道获得锁为止。同步队列
原理跟前面的差不多
FIFO队列
需要借助临时顺序节点,其它跟前面的差不多
参考资料
【0】八斗学院内部zookeeper ppt学习资料
【1】微信PaxosStore:深入浅出Paxos算法协议
http://www.infoq.com/cn/articles/wechat-paxosstore-paxos-algorithm-protocol【2】Zookeeper的功能以及工作原理
https://www.cnblogs.com/felixzh/p/5869212.html【3】ZooKeeper官方文档
http://zookeeper.apache.org/doc/current/index.html 【4】ZooKeeper学习第一期---Zookeeper简单介绍 https://www.cnblogs.com/wuxl360/p/5817471.html 【5】ZooKeeper-about云开发 http://www.aboutyun.com/forum-149-1.html