1.为什么需要有Zookeeper


   学习框架:    1.Zookeeper 是什么?                         2.Zookeeper干什么用的?                         3. 重要框架的源码 ?          先说一个概念:分布式协调技术 ---- 那么什么是分布式协调技术?我来告诉大家,其实分布式协调技术 主要用来​解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种临界资源,防止造成

"脏数据"的后果。

        ​为了防止分布式系统中的多个进程之间相互干扰,我们需要一种分布式协调技术来对这些进程进行调度。而这个分布式协调技术的核心就是来实现这个分布式锁。

        ​Zookeeper是一个开源的分布式协调服务框架,主要用来解决分布式集群中应用系统的一致性问题和数据管理问题。具体就是它提供了一项基本服务:分布式锁服务。由于ZooKeeper的开源特性,后来我们的开发者在分布式锁的基础上,摸索了出了其他的使用方法:配置维护、组服务、分布式消息队列、分布式通知/协调等。

Zookeeper系列1::zookeeper的作用与原理详解_为什么需要zookeeper



zookeeper 是一个 java 应用框架,主要是起到分布式协调作用。​

hadoop中主要的运用是HA机制,即:HDFS HA机制和yarn HA机制的实现。

HDFS HA 功能通过配置 Active/Standby 两个 nameNodes 实现在集群中对 NameNode 的热备来份解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将 NameNode 很快的切换到另外一台机器。其次 resourcemanager HA 机制。 HA 机制最重要的一点是:状态同步。 具体怎么讲 zookeeper 和 hadoop 联系起来 。看 HA 机制。


2​ . Zookeeper的原理与​概述

2.1 从不同角度看Zookeeper

      Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。

      Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应,从而实现集群中类似Master/Slave管理模式。

      ZooKeeper是一个​​分布式​​​的,开放源码的协调服务,是​​Google​​​的Chubby一个​​开源​​的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

       简单来看Zookeeper=文件系统+通知机制。 Zookeeper本质上是一个分布式文件系统,适合存放小文件,也可以理解为一个数据库。主要提供两个功能:


  1.  管理(存储,读取)用户程序提交的数据;(不是业务数据,而是程序状态数据,很小,负载小)
  2. 并为用户程序提供数据节点监听服务;

Zookeeper系列1::zookeeper的作用与原理详解_为什么需要zookeeper_02


  1.  上图左侧, Zookeeper中存储的其实是一个又一个Znode.​ 
  2. Znode是Zookeeper中的节点​。Znode是有路径的,例如/data/host1,/data/host2,这个路径也可以理解为是Znode的Name。Znode也可以携带数据,例如说某个Znode的路径是/data/host1,其值是一个字符串"192.168.0.1"
  3. 正因为Znode的特性,所以Zookeeper可以对外提供出一个类似于文件系统的试图​,可以通过操作文件系统的方式操作Zookeeper.
           1.使用路径获取Znode
           2.获取Znode携带的数据
           3.修改Znode携带的数据
           4.删除Znode
           5.添加Znode

3.Zookeeper的应用场景

3.1数据发布/订阅

数据发布/订阅系统:

       ​需要发布者将数据发布到Zookeeper的节点上,供订阅者进行数据订阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和数据的动态更新。

发布/订阅一般有两种设计模式​:

       推模式和拉模式,服务端主动将数据更新发送给所有订阅的客户端称为推模式;客户端主动请求获取最新数据称为拉模式.

Zookeeper采用了推拉相结合的模式,客户端向服务端注册自己需要关注的节点,一旦该节点数据发生变更,那么服务端就会向相应的客户端推送Watcher事件通知,客户端接收到此通知后,主动到服务端获取最新的数据。Zookeeper系列1::zookeeper的作用与原理详解_zookeeper_03



3.2命名服务

     命名服务是分步实现系统中较为常见的一类场景,分布式系统中,被命名的实体通常可以是集群中的机器、提供的服务地址或远程对象等,通过命名服务,客户端可以根据指定名字来获取资源的实体,在分布式环境中,上层应用仅仅需要一个全局唯一的名字。Zookeeper可以实现一套分布式全局唯一ID的分配机制。Zookeeper系列1::zookeeper的作用与原理详解_为什么需要zookeeper_04


  1. 通过调用Zookeeper节点创建的API接口就可以创建一个顺序节点,并且在API返回值中会返回这个节点的完整名字,利用此特性,可以生成全局ID,其步骤如下
  2. 户端根据任务类型,在指定类型的任务下通过调用接口创建一个顺序节点,如"job-"。
  3. 建完成后,会返回一个完整的节点名,如"job-00000001"。
  4. 户端拼接type类型和返回值后,就可以作为全局唯一ID了,如"type2-job-00000001"

3.3分布式协调/通知

           Zookeeper中特有的Watcher注册于异步通知机制,能够很好地实现分布式环境下不同机器,甚至不同系统之间的协调与通知,从而实现对数据变更的实时处理。通常的做法是不同的客户端都对Zookeeper上的同一个数据节点进行Watcher注册,监听数据节点的变化(包括节点本身和子节点),若数据节点发生变化,那么所有订阅的客户端都能够接收到相应的Watcher通知,并作出相应处理。

在绝大多数分布式系统中,系统机器间的通信无外乎心跳检测、工作进度汇报和系统调度。


  • 心跳检测:​不同机器间需要检测到彼此是否在正常运行,可以使用Zookeeper实现机器间的心跳检测,基于其临时节点特性(临时节点的生存周期是客户端会话,客户端若当即后,其临时节点自然不再存在),可以让不同机器都在Zookeeper的一个指定节点下创建临时子节点,不同的机器之间可以根据这个临时子节点来判断对应的客户端机器是否存活。通过Zookeeper可以大大减少系统耦合。 
  • 工作进度汇报:​通常任务被分发到不同机器后,需要实时地将自己的任务执行进度汇报给分发系统,可以在Zookeeper上选择一个节点,每个任务客户端都在这个节点下面创建临时子节点,这样不仅可以判断机器是否存活,同时各个机器可以将自己的任务执行进度写到该临时节点中去,以便中心系统能够实时获取任务的执行进度。
  • 系统调度:​Zookeeper能够实现如下系统调度模式:分布式系统由控制台和一些客户端系统两部分构成,控制台的职责就是需要将一些指令信息发送给所有的客户端,以控制他们进行相应的业务逻辑,后台管理人员在控制台上做一些操作,实际上就是修改Zookeeper上某些节点的数据,Zookeeper可以把数据变更以时间通知的形式发送给订阅客户端。

3.4分布式锁分布式锁

     用于控制分布式系统之间同步访问共享资源的一种方式,可以保证不同系统访问一个或一组资源时的一致性,主要分为排它锁和共享锁。

排它锁又称为写锁或独占锁,若事务T1对数据对象O1加上了排它锁,那么在整个加锁期间,只允许事务T1对O1进行读取和更新操作,其他任何事务都不能再对这个数据对象进行任何类型的操作,直到T1释放了排它锁。

Zookeeper系列1::zookeeper的作用与原理详解_zookeeper_05

Zookeeper系列1::zookeeper的作用与原理详解_大数据_06


  • 获取锁,在需要获取排它锁时,所有客户端通过调用接口,在/exclusive_lock节点下创建临时子节点/exclusive_lock/lock。Zookeeper可以保证只有一个客户端能够创建成功,没有成功的客户端需要注册/exclusive_lock节点监听。
  • 释放锁,当获取锁的客户端宕机或者正常完成业务逻辑都会导致临时节点的删除,此时,所有在/exclusive_lock节点上注册监听的客户端都会收到通知,可以重新发起分布式锁获取。
  • 共享锁又称为读锁,若事务T1对数据对象O1加上共享锁,那么当前事务只能对O1进行读取操作,其他事务也只能对这个数据对象加共享锁,直到该数据对象上的所有共享锁都被释放。在需要获取共享锁时,所有客户端都会到/shared_lock下面创建一个临时顺序节点

3.5分布式队列

        有一些时候,多个团队需要共同完成一个任务,比如,A团队将Hadoop集群计算的结果交给B团队继续计算,B完成了自己任务再交给C团队继续做。这就有点像业务系统的工作流一样,一环一环地传下去.

分布式环境下,我们同样需要一个类似单进程队列的组件,用来实现跨进程、跨主机、跨网络的数据共享和数据传递,这就是我们的分布式队列。