ZooKeeper:分布式应用程序的分布式协调服务
ZooKeeper是一种用于分布式应用程序的分布式开源协调服务。它公开了一组简单的原语,分布式应用程序可以构建这些原语,
以实现更高级别的服务,以实现同步,配置维护以及组和命名。它被设计为易于编程,并使用在熟悉的文件系统目录树结构之后设计的数据模型。
它在Java中运行,并且具有Java和C的绑定。
ZooKeeper背后的动机是减轻分布式应用程序从头开始实施协调服务的责任。
以一个简单的例子来说明整个选举的过程:
假设有五台服务器组成的zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,
在存放数据量这一点上,都是一样的.假设这些服务器依序启动,来看看会发生什么.
1) 服务器1启动,此时只有它一台服务器启动了,它发出去的汇报没有任何响应,所以它的选举状态一直是LOOKING状态
2) 服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,
所以id值较大的服务器2胜出(Leader id:就是我们配置的myid中的值,每个机器一个),
但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1,2还是继续保持LOOKING状 态.
3) 服务器3启动,根据前面的理论分析,服务器3成为服务器1,2,3中的老大,而与上面不同的是,此时有三台服务器选举了它,
所以它成为了这次选举的leader.
4) 服务器4启动,根据前面的分析,理论上服务器4应该是服务器1,2,3,4中最大的,但是由于前面已经有半数以上的服务器选举了服务 器3,所以它只能接受当小弟的命了.
5) 服务器5启动,同4一样,当小弟.
集群服务器宕掉的情况: 半数以上服务器宕机代表zookeeper服务器宕机
例如我们集群服务器有3台, 其中有一台zkServer宕机,那么整个ZK还是可以服务的
如果集群服务器只有2台,其中1台宕机,ZK就是不可用的
案例演示 分别启动zkServer.sh start(master slave1 slave2)
1.查看选举状态zkServer.sh status(分别三台节点查看)
2.jps查看leader的状态 kill掉leader所在的节点
3.再次查看 slave2应该是leader
4.再次启动slave1的zkServer.sh start 它只能当小弟了
zookeeper维护了一份分布式文件系统,每个节点称为“Znode”, Znode维护数据和与之关联的子节点;
Znodes维护一个状态结构:
【znode:/根节点stat说明
cZxid = 0x0 //create事务ID
ctime = Wed Dec 31 16:00:00 PST 1969 //当前节点的create时间
mZxid = 0x0 //当前节点的修改事务ID
mtime = Wed Dec 31 16:00:00 PST 1969 //当前节点的时间
pZxid = 0x900000018 //最后修改此znode的子项的更改的zxid
cversion = 4 //此znode的子项的更改数
dataVersion = 0 //此znode数据的更改次数(版本)
aclVersion = 0 //ACL(访问控制列表)的版本
ephemeralOwner = 0x0 //表示当前节点是否为临时节点,
如有数据为临时节点;如为0X0,代表当前节点的永久节点;
dataLength = 0 //表示当前节点的数据长度,
默认情况下,每个Znode节点可存放1M的数据
numChildren = 2 //表示当前节点拥有的子节点数 】
zookeeper数据模型:
1.会话
$ bin/zkCli.sh -server 127.0.0.1:2181
创建znode 临时 / 永久
$ bin/zkCli.sh -server slave1:2181
$ bin/zkCli.sh -server master:2181,slave1:2181
关闭当前Zk连接会话:
$>close
connect host:port 连接其他的Zookeeper服务端:
$>connect slave1:2181
1.创建永久节点,不加s和加s的区别:【注意序号】
[zk: master:2181(CONNECTED) 1] create /aaa1 helloword
Created /aaa1
[zk: master:2181(CONNECTED) 2] ls /
[zookeeper, aaa1, hadoop-ha]
[zk: master:2181(CONNECTED) 3] create -s /aaa2 helloword2
Created /aaa20000000023
2.zookeeper当中不能往znode中去追加内容,只能覆盖
set /aaa20000000023 newwords
3.创建临时znode (临时节点不能有子节点)
create -e /path data
4.删除znode(删除znode时,不能有子znode,需要先删除子znode再删除父znode)
delete /path
5. rmr 删除所有znode,可以包含子路径
临时节点与永久节点的概念:
--按生命周期分类
ZooKeeper中的节点有两种,分别为临时节点和永久节点。节点的类型在创建时即被确定,并且不能改变。
① 临时节点:该节点的生命周期依赖于创建它们的会话。一旦会话(Session)结束,临时节点将被自动删除,
当然可以也可以手动删除。虽然每个临时的Znode都会绑定到一个客户端会话,但他们对所有的客户端还是可 见的。
另外,ZooKeeper的临时节点不允许拥有子节点。
② 永久节点:该节点的生命周期不依赖于会话,并且只有在客户端显式地执行删除操作的时候,他们才能被删除。
顺序节点:
当创建Znode的时候,用户可以请求在ZooKeeper的路径结尾添加一个递增的计数。
这个计数对于此节点的父节点来说是唯一的,它的格式为"%10d"(10位数字,没有数值的数位用0补充,例如"0000000001")。
当计数值大于2^32 - 1时,计数器将溢出。
观察:
客户端可以在节点上设置watch,我们称之为监视器。
当节点状态发生改变(Znode的增、删、改)时,将会触发watch所对应的操作。
当watch被触发时,ZooKeeper将会向客户端发送且仅发送一条通知,因为watch只能被触发一次,这样可以减少网络流量。
监听/path下的变化
stat /path true