一、概述
1、Zookeeper本身是Yahoo开发的一套用于 进行分布式管理和协调框架,后来贡献给了Apache
2、 Zookeeper提供了 中心化服务:管理配置信息,统一命名,提供分布式锁,提供组策略等
3、Zookeeper是根据Google的 Chubby Lock来进行设计的
4、zookeeper里面有leader节点和follower节点,那么zk是不是主从结构?
不是。主从结果的特点是需要预先指定哪一个主节点哪一个是从节点,不管重启了多少次,主节点都是不会变的。主节点宕机,集群就不能对外提供服务了,因为主从之间是不能进行切换的。而zk的leader节点并没有事先执行,是不确定的,是通过选举产生的,而且leader宕机之后,可以选举产生另外的leader。
之所以比如mysql的主从复制,主节点挂掉之后,从节点会变成主节点,是因为原本就在从节点上面配置了主节点的配置,主从安装在了一个节点上。也不能是真正意义上的主从互换。
很多大数据组件都是动物的标志,例如hadoop是一头大象,所以zookeeper是动物园管理者,也体现了zk在分布式系统中的管理和协调的地址。
二、zookeeper的特点
1、Zookeeper本身是一个 树状结构 - Znode树
2、Zookeeper的根节点是/
3、每一个节点叫做一个Znode节点
4、每一个节点都 需要存储数据,而且是必须指定的,一般是对这个节点的描述信息
5、在Zookeeper中,不存在相对路径的说法,所有的路径 必须从/开始
6、Zookeeper中,要求节点的路径是唯一的 ,不能有两个/video路径,即便他们存储的数据不同
7、Zookeeper将树状结构以及数据维系在 ==内存以及磁盘 ==中
①维系在内存中的目的是为了 读写快
②维系在磁盘中的目的是为了 崩溃恢复
8、Znode树在磁盘中的存储路径由 dataDir来决定
9、znode本身的特点,路径不允许重复以及节点可以存储数据,理论上说,zk可以用来 做缓存服务器,key值用作目录,value存储在znode的数据上;但是,实际过程中不那么做,意味着Zookeeper要面临大量的Znode读写并且要大量占用内存,导致Zookeeper本身的对分布式框架的协调能力降低;而且很重要的一点是Zookeeper的读写效率还不如Redis之类的服务器,所以一般用zk来做分布式协调管理的框架。
10、在Zookeeper中,每一次的写操作(connect,create,delete,rmr,set等)都是一个事务,并且会为这个事务分配一个全局递增的编号,这个编号成为事务id,简写为Zxid (也就是zk的每一次操作都有记录,而且有顺序)
11、临时节点下面是不能挂子节点的。
三、常用命令
sh zkServer.sh start | 启动服务器端 |
---|---|
sh zkServer.sh stop | 停止服务器端 |
sh zkCli.sh | 启动客户端 |
quit | 退出客户端 |
sh zkServer.sh status | 查看服务器运行状态 |
ls / | 查看根路径下的节点 |
create /log ‘manage log servers’ | 在根节点下创建一个子节点log并且指定数据 |
delete /log | 删除根节点下的子节点log |
rmr /video | 递归删除 |
get /video | 查看video节点的数据以及节点信息 |
set /video ‘videos’ | 修改节点数据 |
create -s /video ’ ’ | 创建顺序节点 |
create -s -e /video ’ ’ | 创建临时顺序节点 |
zookeeper是不允许创建两个同名路径的,但是通过顺序节点可以同时请求创建/video节点,zk会自动的在节点后面添加序号,例如/video0000000004,/video0000000005
利用顺序节点实现zk的统一命名。
四、Znode节点信息
属性 | 值 | 解释 |
---|---|---|
cZxid | 0x9 | 创建当前节点的事务id,表示第9个事务创建当前节点 |
ctime | Wed Mar 04 01:01:09 PST 202 | 创建时间 |
mZxid | 0x9 | 修改当前节点数据的事务id,表示第9个事务修改了节点数据 |
mtime | Wed Mar 04 01:01:09 PST 2020 | 修改时间 |
pZxid | 0x9 | 导致子节点个数发生变化的事务id |
cversion | 0 | 记录当前节点的子节点个数的变化次数 |
dataVersion | 0 | 数据版本,记录当前节点数据修改的次数 |
aclVersion | 0 | 权限版本,记录当前节点权限修改的次数 |
ephemeralOwner | 0x0 | 如果是持久节点,值为0;如果是临时节点,值为sessionid |
dataLength | 13 | 数据的字节个数 |
numChildren | 0 | 子节点的个数 |
五、节点类型
zk节点分为四类,临时/持久,顺序/非顺序;
临时节点时当会话结束,客户端退出,临时节点将会被删除
持久顺序节点 Persistent_Sequential create -s ‘/video’ ’ ’
持久非顺序节点 Persistent create ‘/video’ ’ ’
临时顺序节点 Ephemeral_Sequential create -e -s ‘/video’ ‘’
临时非顺序节点 Ephemeral create -e ‘/video’ ’ ’
六、zookeeper具有的特性
1、过半性-过半选举,过半存活,过半操作等
2、数据一致性。因为有原子广播,所以访问任何一个zk节点获取到的数据都是相同的。【follower也可以接受请求,leader收到请求,发送给每一follower,follower接收到请求,会交给leader老大再发送给follower】
3、原子性 - 一个操作要么所有的节点都执行要么所有的节点都不执行(也是原子广播控制的)
4、可靠性 - 具有崩溃恢复机制,有效的避免单点故障
5、实时性 - 可以利用代码或者工具实时监控Zookeeper的变化,实时的监控节点的变化
6、顺序性 - leader会将请求放到队列中发送给follower,这就保证所有follower收到请求的顺序是一致的(不会存在一个follower上先执行a再执行b,而另外一个节点先执行b再执行a的情况);另外一个顺序性的体现是事务id和epochid全局递增的