这是我参与更文挑战的第7天 ,活动详情查看更文挑战
Zookeeper定义
Zookeeper 是 Google 的 Chubby一个开源的实现,是 Hadoop 的分布式协调服务;它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等;
Zookeeper能帮我们做什么
Failover故障切换:主机有故障时如何自动切换?
- Hadoop,使用Zookeeper的事件处理确保整个集群只有一个(active)NameNode,存储配置信息等。
- 实现(standby)NameNode自动切换为active
- HBase,使用Zookeeper的事件处理确保整个集群只有一个(active)HMaster,察觉HRegionServer联机和宕机,存储访问控制列表等。
- 实现Hmaster自动切换
Zookeeper的运行模式
- ZooKeeper,单节点模式(单个ZK进程)
- Zookeepers, 伪分布式, 一台机启动多个ZK 进程;
- Zookeepers, 完全分布式,多台机器各自启动ZK,组成ZK 集群;
zookeeper 模型
• 层次化的目录结构,命名符合常规文件系统规范; • 每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识; • 节点Znode可以包含数据和子节点,但是EPHEMERAL类型的节点不能有子节点; • Znode中的数据可以有多个版本,比如某一个路径下存有多个数据版本,那么查询这个路径下的数据就需要带上版本; • 客户端应用可以在节点上设置监视器; • 节点不支持部分读写,而是一次性完整读写;
znode
- Znode有两种类型,短暂的(ephemeral)和持久的(persistent);
- Znode的类型在创建时确定并且之后不能再修改;
- 短暂znode的客户端会话结束时,zookeeper会将该短暂znode删除,短暂znode不可以有子节点;
- 持久znode不依赖于客户端会话,只有当客户端明确要删除该持久znode时才会被删除;
- Znode有四种形式的目录节点,PERSISTENT、PERSISTENT_SEQUENTIAL、EPHEMERAL、EPHEMERAL_SEQUENTIAL;
Zookeeper的角色
- 领导者(leader),负责进行投票的发起和决议,更新系统状态;
- 学习者(learner),包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并向客户端返回结果,在选举过程中参与投票;
- Observer可以接受客户端连接,将写请求转发给leader,但observer不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度;
- 客户端(client),请求发起方;
Zookeeper的读写机制
- Zookeeper是一个由多个server组成的集群;
- 一个leader,多个follower;
- 每个server保存一份数据副本;
- 全局数据一致;
- 分布式读写;
- 更新请求转发,由leader实施
Zookeeper的保证
- 更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行;
- 数据更新原子性,一次数据更新要么成功,要么失败;
- 全局唯一数据视图,client无论连接到哪个server,数据视图都是一致的;
- 实时性,在一定事件范围内,client能读到最新数据
应用场景
统一命名服务
分布式应用中,通常需要有一套完整的命名规则,既 能够产生唯一的名称又便于人识别和记住,通常情况 下用树形的名称结构是一个理想的选择,树形的名称 结构是一个有层次的目录结构,既对人友好又不会重 复。
Name Service 是 Zookeeper 内置的功能,只要调用 Zookeeper 的 API 就能实现。
配置管理
• 配置管理在分布式应用环境中很常见,例如同一个应 用系统需要多台 PC Server 运行,但是它们运行的应 用系统的某些配置项是相同的,如果要修改这些相同 的配置项,那么就必须同时修改每台运行这个应用系 统的 PC Server。
• 将配置信息保存在 Zookeeper 的某个目录节点中, 然后将所有需要修改的应用机器监控配置信息的状态 ,一旦配置信息发生变化,每台应用机器就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配 置信息应用到系统中。
集群管理
Zookeeper 能够很容易的实现集群管理的功能,如有 多台 Server 组成一个服务集群,那么必须要一个“ 总管”知道当前集群中每台机器的服务状态,一旦有 机器不能提供服务,集群中其它机器必须知道,从而 做出调整重新分配服务策略。同样当增加集群的服务 能力时,就会增加一台或多台 Server,同样也必须 让“总管”知道
• Zookeeper 不仅能够维护当前的集群中机器的服务状 态,而且能够选出一个“总管”,让这个总管来管理 集群,这就是 Zookeeper 的另一个功能 Leader Election。
共享锁
共享锁在同一个进程中很容易实现,但是在跨进程或 者在不同 Server 之间就不好实现了。Zookeeper 实 现方式:需要获得锁的 Server 创建一个 EPHEMERAL_SEQUENTIAL 目录节点,然后调用 getChildren方法获取当前的目录节点列表中最小的目 录节点是不是就是自己创建的目录节点,如果正是自 己创建的,那么它就获得了这个锁,如果不是那么它 就调用 exists(String path, boolean watch) 方法并监 控 Zookeeper 上目录节点列表的变化,一直到自己 创建的节点是列表中最小编号的目录节点,从而获得 锁;释放锁时,只要删除前面它自己所创建的目录节 点即可。
队列管理
• Zookeeper 可以处理两种类型的队列:当一个队列的 成员都聚齐时,这个队列才可用,否则一直等待所有 成员到达,这种是同步队列;队列按照 FIFO 方式进 行入队和出队操作,例如实现生产者和消费者模型
• 创建一个父目录 /synchronizing,每个成员都监控目 录 /synchronizing/start 是否存在,然后每个成员都 加入这个队列(创建 /synchronizing/member_i 的临 时目录节点),然后每个成员获取 / synchronizing 目录的所有目录节点,判断 i 的值是否已经是成员的 个数,如果小于成员个数等待 /synchronizing/start 的出现,如果已经相等就创建 /synchronizing/start
Zookeeper的使用
- 服务器的数量,奇数(3、5、7);
- 最大允许宕机的个数,一半以下,即一半以上可以工作时,ZK集群才算正常。