1.zookeeper简介:
1.zookeeper:
Zookeeper是一个分布式协调服务;就是为用户的分布式应用程序提供协调服务。
A、zookeeper是为别的分布式程序服务的
B、Zookeeper本身就是一个分布式程序(只要有半数以上节点存活,zk就能正常服务)
C、Zookeeper所提供的服务涵盖:主从协调、服务器节点动态上下线、统一配置管理、分布式共享锁、统一名称服务……
D、虽然说可以提供各种服务,但是zookeeper在底层其实只提供了两个功能:
(1)管理(存储,读取)用户程序提交的数据;
(2) 并为用户程序提供数据节点监听服务;
2.zookeeper应用场景:
共同点:(1)提供监听 (2)数据保管
而zookeeper本身就是这么个第三方的程序,具有高可靠性和可用性的特点。它本身就是个集群程序,只有有半数以上的节点存活,那么就能正常服务。节点数一般是奇数(至少三台)。
zookeeper集群的角色: leader 和 follower (observer)
只要集群中有半数以上节点存活,集群就能提供服务。
2.zookeeper安装:
- 首先准备三台服务器(至少三个节点才能提供可靠地zookeeper)
- 安装JDK,因为zookeeper是java程序
- 安装zookeeper
zookeeper的安装我会单独写一篇出来,这里就是占个位置!
3..zookeeper集群角色分配原理:
- 会有主从结构,一个主,剩下的是从。但是如果不进行手动配置的话,zookeeper本身可以实现主从选举(算法:经PAXOS简化成为Zab)
- 过程:假设首先打开mini1这台机器,这个时候mini1就会通过广播来查看有多少台zookeeper服务器在运行,然后发现只有它自己。(但是它的配置文件中写的是有三台)然后进行投票,因为只有它自己运行着,所以票投给了自己,但是集群中一共三台,必须半数以上才可以,所以即使收到了自己投的一票也不行,得等着。直到我们把mini2打开,这时候又需要投票了,内部机制是尽量把票投给ID号大的,所以最后的结果是mini2得票多,当选为leader,mini1为follower。当mini3启动的时候发现集群有了leader,所以,这时候mini3也是follower。
当有数据要写入zookeeper时,都要传给leader,然后leader会将数据传给所有follower,每个都进行复制保存,以保持数据存储一致。
注意:
zookeeper在集群数量很大的时候,保持数据一致所需要的时间会比较长。所以,zookeeper不适合用于数据更新极为频繁和数据一致性非常严格的场景。- 综上,zookeeper安装需要手动配置的信息有(红色的):
(1)每台zookeeper的ID(比如mini1的ID就是myid=1)
(2) 每台上面关于集群的配置文件(有多少台zookeeper服务器)
主从不需要配置,是集群内部自己决定的。
4.zookeeper的命令行客户端:
- 注意:在使用命令行客户端之前需要将服务端启动!否则一直提示重新连。挨个启动zookeeper服务器之后就会提示leader是哪个。
- 在客户端中:
help 可以显示很多信息帮助使用
5.zookeeper中的数据结构:
zookeeper中的数据是有自己的格式的:
- 层次化的目录结构,命名符合常规文件系统规范(见下图)
- 每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识
- 节点Znode可以包含数据和子节点(但是EPHEMERAL类型的节点不能有子节点,下一页详细讲解),任何一个节点都可以保存一份数据。
客户端应用可以在节点上设置监视器.
注意:客户端上面在添加创建节点并附加节点数据的时候有空格时,空格后面的就不算了!
节点类型:
(1)Znode有两种类型:
短暂(ephemeral)(断开连接自己删除) 创建时加入-e参数
create -e …
持久(persistent)(断开连接不删除)
比如:服务器连接zookeeper时候建立的节点就是短暂节点,那么当断开连接的时候,节点就会自己删除。这时候该节点的父节点就会触发一个事件通知自己,要调整了!
(2)Znode有四种形式的目录节点(默认是persistent )
PERSISTENT
PERSISTENT_SEQUENTIAL(持久序列/test0000000019 ) 创建时加-s参数 create -s …
EPHEMERAL
EPHEMERAL_SEQUENTIAL
(3)创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护.
(4) 在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序.
注意:临时节点不能是创建永久的子节点的.
6.命令:(记不住了就用help来查)
quit 退出客户端
help 给出命令的提示等
创建节点: create [-s] [-e] 节点路径名称 节点内容 (有个acl代表权限)
查看节点的子节点: ls 节点路径
获取节点内容: get 节点路径
更新节点内容:set 节点路径 更新后的内容
监听: 跟在各命令之后的watch(watch类型有很多,但是做应用开发的话主要用到的是数据变化和节点变化,也就是跟在get 和 ls 后面的watch)
注意:这个监听只生效一次,并且watch跟在get后面,所以只有在节点内容发生变化的时候才会有监听提醒,而如果是增加子节点是不会提醒的。
还有一部分是zookeeper在java客户端中的代码,那个之后贴上来~