文章目录
1. 引言
Hadoop 集群当中 N 多的配置信息如何做到全局一致并且单点修改迅速响应到整个集群?
— 配置管理
Hadoop 集群中的 namonode 和 resourcemanager 的单点故障怎么解决?
— 集群的主节点的单点故障
ZooKeeper 的学习要点:
ZooKeeper 是什么? What
ZooKeeper 干什么用? Where
ZooKeeper 怎么用? How
ZooKeeper 底层实现原理是什么? Why
2. ZooKeeper 是什么
ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现。它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比 如 分布式同步,配置管理,集群管理,命名管理,队列管理。它被设计为易于编程,使用文 件系统目录树作为数据模型。服务端跑在 java 上,提供 java 和 C 的客户端 API
众所周知,协调服务非常容易出错,但是却很难恢复正常,例如,协调服务很容易处于 竞态以至于出现死锁。我们设计 ZooKeeper 的目的是为了减轻分布式应用程序所承担的协调任务
ZooKeeper 是集群的管理者,监视着集群中各节点的状态,根据节点提交的反馈进行下 一步合理的操作。最终,将简单易用的接口和功能稳定,性能高效的系统提供给用户。
3. Zookeeper 核心概念
3.1 文件系统
ZooKeeper 的命名空间就是 ZooKeeper 应用的文件系统,它和 linux 的文件系统很像,也是树 状,这样就可以确定每个路径都是唯一的,对于命名空间的操作必须都是绝对路径操作。
与 linux 文件系统不同的是,linux 文件系统有目录和文件的区别,而 ZooKeeper 统一叫做 znode, 一个 znode 节点可以包含子 znode,同时也可以包含数据。
所以总结说来,znode 即是文件夹又是文件的概念,所以在 ZooKeeper 这里面就不叫文件文 件也不叫文件夹,叫 znode,每个 znode 有唯一的路径标识,既能存储数据,也能创建子 znode。 但是 znode 只适合存储非常小量的数据,不能超过 1M,最好小于 1K。
下面是关于 Znode 的介绍(非常重要):
-
Znode 有两种类型:
短暂(ephemeral)(断开连接自己删除)
持久(persistent)(断开连接不删除) -
Znode 有四种形式的目录节点(默认是 persistent )
型 介绍 PERSISTENT 持久化 znode 节点,
一旦创建这个 znode 点存储的数据不会主动消失,
除非是客户端主动的deletePERSISTENT_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 是递增的,
而且是唯一的EPHEMERAL 临时 znode 节点,
Client 连接到 zk service 的时候会建立一个 session,
之后用这个 zk 连接实例创建该类型的 znode,
一旦 Client 关闭了 zk 的连接,
服务器就会清除 session,
然后这个 session 建立的 znode 节点都会从命名空间消失。
总结就是,这个类型的 znode 的生命周期是和 Client 建立的连接一样的。
比如 ClientA 创建了一个 EPHEMERAL 的/zk/conf0000000011 的 znode 节点,
一旦 ClientA 的 zk 连接关闭,这个 znode 节点就会消失。
整个 zk service 命名空间里就会删除这个 znode 节点 临时自动编号节点,
znode 节点编号会自动增加,但是会随 session 消失而消失EPHEMERAL_SEQUENTIAL 临时自动编号节点,znode 节点编号会自动增加,但是会随 session 消失而消失 -
创建 znode 时设置顺序标识,znode 名称后会附加一个值,顺序号是一个单调递增的计 数器,由父节点维护
-
在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过 顺序号推断事件的顺序
-
EPHEMERAL 类型的节点不能有子节点
-
zk中的znode存储的数据的存储备份数量是zk的节点数
3个节点
每一个znode的数据都是被存储了3份的
zk来说 各个节点存储的内容是一样的 -
客户端可以在 znode 上设置监听器
-
每一个znode被创建时都会带一个ACL列表,用于决定谁可以对它执行何种操作
[zk: localhost:2181(CONNECTED) 51] getAcl /zk 'world,'anyone : cdrwa
权限:
ACL权限 允许的操作 CREATE create(子节点) READ getChildren
getDataWRITE setData DELETE delete(子节点) ADMIN setACL ACL身份验证模式:
模式 描述 world id 为anyone,也就是全世界所有人都可以登录且有所有权限 digest 摘要,单身加密,id是username:BASE64(SHA1(password)), 用户名密码验证 ip id是客户端ip,通过ip难,设置的时候可以设置一个ip段,比如:ip: 192.168.1.0/16,表示匹配前16个bit的IP段 auth 不需要ID,需要通过验证(zookeeper支持通过kerberos来进行authencation,也支持username/password形式的authentication) super 在这种scheme情况下,对应的id拥有超级权限,可以做任何事情(cdrwa),超级用户开启需要特殊方法
3.2 监听机制
客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、节点删除、子目录节 点增加删除)时,ZooKeeper 会通知客户端。监听机制保证 ZooKeeper 保存的任何的数据的 任何改变都能快速的响应到监听了该节点的应用程序
监听器的工作机制,其实是在客户端会专门创建一个监听线程,在本机的一个端口上等待 zk 集群发送过来事件
监听的znode事件:
- 节点创建 nodecreated
- 节点删除事件 nodedeleted
- 节点的内容变化事件 nodedatachanged
- 节点的子节点变化事件 nodechildrenchanged
可以设置观察的操作:
- exists
- getChildren
- getData
可以触发观察的操作:
- create
- delete
- setData
注意:监听只生效一次
So,怎么做到循环监听?
具体请看 ZooKeeper Shell 和 API 应用时的使用
3.3 监听机制原理
ZooKeeper 的 Watcher 机制主要包括客户端线程、客户端 WatcherManager、Zookeeper 服务 器三部分。客户端在向 ZooKeeper 服务器注册的同时,会将 Watcher 对象存储在客户端的 WatcherManager 当中。当 ZooKeeper 服务器触发 Watcher 事件后,会向客户端发送通知, 客户端线程从 WatcherManager 中取出对应的 Watcher 对象来执行回调逻辑
4. Zookeeper 典型应用场景
4.1 命名服务
命名服务是分布式系统中较为常见的一类场景,分布式系统中,被命名的实体通常可以是集 群中的机器、提供的服务地址或远程对象等,通过命名服务&