ZooKeeper概述
什么是 ZooKeeper?
zookeeper译名为“动物园管理员”。它是用来管理大象(Hadoop) 、蜜蜂(Hive) 、小猪(Pig) 的管理员, Apache HBase 和 Apache Solr 等项目中都用到了 ZooKeeper。
ZooKeeper 是一个开源的分布式协调服务,就是为用户的分布式应用程序提供协调服务。
ZooKeeper 功能
-
(1)ZooKeeper 是为别的分布式程序服务的
-
(2)ZooKeeper 本身就是一个分布式程序(只要有半数以上节点存活,ZooKeeper 就能正常服务)
-
(3)ZooKeeper 所提供的服务涵盖:主从协调、服务器节点动态上下线、统一配置管理、分布式共享锁、统一名称服务等
-
(4)虽然说可以提供各种服务,但是 ZooKeeper 在底层其实只提供了两个功能:
- 1)管理(存储,读取)用户程序提交的数据;
- 2)并为用户程序提供数据节点监听服务。
-
zookeeper的目的是为了减轻分布式应用程序所承担的协调任务。
ZooKeeper 特点 (一个leader,多个 follower 组成的集群)
- (1)最终一致性: Client 不论连接到哪个 Server,展示给它都是同一个视图,这是 ZooKeeper 最重要的性能;
- (2)顺序一致性:来自同一个 Client 的更新请求按其发送顺序依次执行;
- (3)原子性:更新只能成功或者失败,不会出现部分更新;
- (4)可靠性:一旦更新操作被执行,它将被持久化保存,直到被下次更新操作所覆盖;
- (5)及时性:在一定时间范围内,client 能读到最新数据。
ZooKeeper 数据结构
1,层次化的目录结构
- ZooKeeper 拥有一个层次的命名空间,也就是 ZooKeeper 应用的文件系统
- 和 Linux 的文件系统很像,也是树状
- 这样就可以确定每个路径都是唯一,对于命名空间的操作都是绝对路径操作
- 数据模型
- ZooKeeper数据模型
- 文件系统目录树
- ZooKeeper数据模型
2,ZNode
1,简介
- 与 Linux 文件系统不同的是,Linux 文件系统有目录和文件的区别,而 ZooKeeper 统一叫做 ZNode。
- 一个 ZNode 节点可以包含子 ZNode,同时也可以包含数据。
- 所以总结说来, ZNode 即是文件夹又是文件的概念,每个 ZNode 有唯一的路径标识,既能存储数据,也能创建子 ZNode。
- ZNode 只适合存储非常小量的数据,不能超过 1M,最好小于 1K
2, ZNode的两种类型
- 1,短暂(ephemeral)(断开连接自己删除)
- 2,持久(persistent)(断开连接不删除)
3,ZNode 的目录节点(默认是 persistent)
- 1,persistent
持久化ZNode节点,一旦创建,这个 ZNode 节点存储的数据不会主动消失,除非是客户端主动的 delete - 2,persistent_sequential
自动增加顺序编号的 ZNode节点, 比如 ClientA 去 ZK Service 上建立一个 ZNode名字叫做/zk/conf,指定了这种类型的节点后 ZK 会创建 /zk/conf0000000000 , ClientB 再去创建就是创建/zk/conf0000000001, ClientC 是创建/zk/conf0000000002,以后任意 Client 来创建这个 ZNode都会得到一个比当前 ZK 命名空间最大 ZNode 编号+1 的 ZNode。
也就说任意一个 Client 去创建 ZNode 都是保证得到的 ZNode 是递增的,而且是唯一的。 - 3,ephemeral
临时 ZNode 节点,这个类型的 ZNode 的生命周期是和 Client 建立的连接一样。
比如 ClientA 创建了一个 EPHEMERAL 的 /zk/conf0000000011 的 ZNode 节点,一旦 ClientA 的 ZK 连接关闭,这个 ZNode 节点就会消失。整个 ZK Service 命名空间里就会删除这个 ZNode 节点。 - 4,ephemeral_sequential
临时自动编号节点, ZNode 节点编号会自动增加,但是会随 Session 消失而消失。
Session是指当 Client 创建一个同 ZK Server 的连接时产生的会话
4,补充知识
- 1,创建 ZNode 时设置顺序标识, ZNode 名称后会附加一个值,序号是一个单调递增的计数器,由父节点维护;
- 2,在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序;
- 3,EPHEMERAL 类型的节点不能有子节点;
- 4,客户端可以在 ZNode 上设置监听器。
3,监听机制(Watcher)
- 客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加或者删除)时, ZooKeeper 会通知客户端。 监听机制保证 ZooKeeper 保存的任何的数据的任何改变都能快速的响应到监听了该节点的应用程序。
- 监听器的工作机制,其实是在客户端专门创建一个监听线程,在本机的一个端口上等待 ZooKeeper 集群发送过来事件。
- 注意:监听只生效一次。
4, ZooKeeper 典型应用场景
-
(1)命名服务:每个 ZNode 都可以由其路径唯一标识。树形的名称结构
-
(2)配置管理:
程序总是需要配置的,如果程序分散部署在多台机器上,要逐个改变配置就变得困难。现在把这些配置全部放到 ZooKeeper上去,保存在 ZooKeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 ZooKeeper 的通知,然后从 ZooKeeper 获取新的配置信息应用到系统中就好。
-
(3)集群管理:
-
1)是否有机器退出和加入;
所有机器约定在父目录GroupMembers下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 ZooKeeper 的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于是,所有人都知道:它挂了。新机器加入也是类似,所有机器收到通知:新兄弟目录加入了。
-
2)选举 Master。
我们稍微改变一下,所有机器创建临时顺序编号目录节点,每次选取编号最小的机器作为 Master 就好。 如果最小编号的 Server 死去,由于是临时节点,死去的 Server 对应的节点也被删除,所以当前的节点列表中又出现一个最小编号的节点,我们就选择这个节点为当前 Master。这样就实现了动态选择 Master,避免了传统意义上单 Master 容易出现单点故障的问题。
-
-
(4)分布式锁:锁服务可以分为两类,一个是保持独占,另一个是控制时序。
保持独占:将ZooKeeper上的一个 znode 看作是一把锁,通过 create znode 的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的 /distribute_lock 节点就释放出锁。
控制时序: /distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选 Master 一样,编号最小的获得锁,用完删除,依次方便。
-
(5)队列管理:
-
1)同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达;
可以在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。
-
2)队列按照 FIFO 方式进行入队和出队操作。
和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。
-