ZooKeeper原理

来源:互联网 发布:visio mac版 编辑:程序博客网 时间:2024/06/18 16:26

Question 1—————-什么是Zookeeper?
Zookeeper是一个分布式的,开源的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop、Hbase、Spark等的重要组件。

Question 2:————–Zookeeper的功能
为分布式应用提供一致性服务(协调统一)的软件。同时间接做到高可用(HA),提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

Question 3—————Zookeeper的队列管理
1、当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达,这种是同步队列。
2、队列按照 FIFO 方式进行入队和出队操作,例如实现生产者和消费者模型。

这里写图片描述

Question 4————————–Zookeeper的Paxos算法

Zookeeper有三个属性:leader、follower、observer
在Zookeeper中,提议称之为proposal
当client发送请求的时候,如果是get(就是查询)的话,直接返回由leader或者follower返回给client,
但是如果是增加、删除、修改的请求,则必须通过Paxos算法来决定,也就是所谓的投票机制,client发送请求给follower,然后follower将请求发送给leader,leader开始发送proposal,进行投票,投票的原理就是,每个follower自身都有一个投票标号,比如一共有4个follower,1、2、3的投片标号都是1,4号follower的投票编号是2,然后leader发起2号proposal,然后每个follower将proposal的编号和自己的投票编号进行比较,如果是proposal的编号大于follower自己的投票编号的话就通过,小于等于的话,就拒绝这次的proposal,也就是说,1、2、3follower会通过proposal,而4号则拒绝,当超过半数或者半数以上的时候,这个proposal通过,然后开始实施

observer(观察者)在里面是不参与投票的,它的最大作用就是加快proposal的传递速度,增加读取速度,follower 投票阶段延迟增大,影响性能

Question 5—————————-Zookeeper搭建奇数台服务器
1、如果有三台服务器,那么如果要挂掉一台,也就只能挂掉一台,否则不构成集群,如果两台服务器的时候,那么不能挂掉,否则不构成集群,所以最后是三台服务器构成集群也就是奇数台
2、如果是偶数台的话,容易发生脑死亡,也就是说分成两个leader,然后开始分家,而如果是奇数台的话,比如5台,那么如果选举的话,可以脑裂成3、2,有半数以上可以通过proposal

Question 6 ————————如果Zookeeper中leader挂掉的话,怎么办?
如果leader挂掉,重新选举新的leader,因为follower要时刻的通过心跳机制向leader发送消息谁的相应速度最快谁就是leader,也就是说,谁最先发现leader挂掉了,那么谁就先成为leader,然后如果原来挂掉的leader活过来了,那么自动成为follower

Question 7————————–Zookeeper的术语
Zookeeper的节点叫znode
tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
clientPort:客户端连接服务端的端口

Question 8————–Zookeeper的死锁以及发生的原因
当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功
这里写图片描述

Question 9————–Zookeeper的特点

1.Zookeeper是一个精简的文件系统,相比于Hadoop,Zookeeper管理小文件,而hadoop管理超大文件。
2.Zookeeper提供了丰富的“构件”,可以实现很多协调数据结构和协议的操作。例如:分布式队列、分布式锁以及一组同级节点的“领导者选举”算法。
3.Zookeeper是高可用的,稳定性相当之好,分布式集群完全可以依赖zookeeper集群的管理,利用zookeeper避免分布式系统的单点故障的问题。
4.Zookeeper采用了松耦合的交互模式,主要体现在分布式锁上,Zookeeper可以被用作一个约会机制,让参入的进程不在了解其他进程的(或网络)的情况下能够彼此发现并进行交互,参入的各方甚至不必同时存在,只要在Zookeeper留下一条消息,在该进程结束后,另外一个进程还可以读取这条信息,从而解耦了各个节点之间的关系。
5.Zookeeper为集群提供了一个共享存储库,集群可以从这里集中读写共享的信息,避免了每个节点的共享操作编程,减轻了分布式系统的开发难度。
6.Zookeeper的设计采用的是观察者的设计模式,Zookeeper主要是负责存储和管理大家关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在 Zookeeper 上注册的那些观察者做出相应的反应,从而实现集群中类似 Master/Slave 管理模式。

Question 10————————–Zookeeper的应用场景

场景一:有一组服务器向客户端提供某种服务(例如:我前面做的分布式网站的服务端,就是由四台服务器组成的集群,向前端集群提供服务),我们希望客户端每次请求服务端都可以找到服务端集群中某一台服务器,这样服务端就可以向客户端提供客户端所需的服务。对于这种场景,我们的程序中一定有一份这组服务器的列表,每次客户端请求时候,都是从这份列表里读取这份服务器列表。那么这分列表显然不能存储在一台单节点的服务器上,否则这个节点挂掉了,整个集群都会发生故障,我们希望这份列表时高可用的。高可用的解决方案是:这份列表是分布式存储的,它是由存储这份列表的服务器共同管理的,如果存储列表里的某台服务器坏掉了,其他服务器马上可以替代坏掉的服务器,并且可以把坏掉的服务器从列表里删除掉,让故障服务器退出整个集群的运行,而这一切的操作又不会由故障的服务器来操作,而是集群里正常的服务器来完成。这是一种主动的分布式数据结构,能够在外部情况发生变化时候主动修改数据项状态的数据机构。Zookeeper框架提供了这种服务。这种服务名字就是:统一命名服务,它和javaEE里的JNDI服务很像。

场景二:分布式锁服务。当分布式系统操作数据,例如:读取数据、分析数据、最后修改数据。在分布式系统里这些操作可能会分散到集群里不同的节点上,那么这时候就存在数据操作过程中一致性的问题,如果不一致,我们将会得到一个错误的运算结果,在单一进程的程序里,一致性的问题很好解决,但是到了分布式系统就比较困难,因为分布式系统里不同服务器的运算都是在独立的进程里,运算的中间结果和过程还要通过网络进行传递,那么想做到数据操作一致性要困难的多。Zookeeper提供了一个锁服务解决了这样的问题,能让我们在做分布式数据运算时候,保证数据操作的一致性。

场景三:配置管理。在分布式系统里,我们会把一个服务应用分别部署到n台服务器上,这些服务器的配置文件是相同的(例如:我设计的分布式网站框架里,服务端就有4台服务器,4台服务器上的程序都是一样,配置文件都是一样),如果配置文件的配置选项发生变化,那么我们就得一个个去改这些配置文件,如果我们需要改的服务器比较少,这些操作还不是太麻烦,如果我们分布式的服务器特别多,比如某些大型互联网公司的hadoop集群有数千台服务器,那么更改配置选项就是一件麻烦而且危险的事情。这时候zookeeper就可以派上用场了,我们可以把zookeeper当成一个高可用的配置存储器,把这样的事情交给zookeeper进行管理,我们将集群的配置文件拷贝到zookeeper的文件系统的某个节点上,然后用zookeeper监控所有分布式系统里配置文件的状态,一旦发现有配置文件发生了变化,每台服务器都会收到zookeeper的通知,让每台服务器同步zookeeper里的配置文件,zookeeper服务也会保证同步操作原子性,确保每个服务器的配置文件都能被正确的更新。
  场景四:为分布式系统提供故障修复的功能。集群管理是很困难的,在分布式系统里加入了zookeeper服务,能让我们很容易的对集群进行管理。集群管理最麻烦的事情就是节点故障管理,zookeeper可以让集群选出一个健康的节点作为master,master节点会知道当前集群的每台服务器的运行状况,一旦某个节点发生故障,master会把这个情况通知给集群其他服务器,从而重新分配不同节点的计算任务。Zookeeper不仅可以发现故障,也会对有故障的服务器进行甄别,看故障服务器是什么样的故障,如果该故障可以修复,zookeeper可以自动修复或者告诉系统管理员错误的原因让管理员迅速定位问题,修复节点的故障。大家也许还会有个疑问,master故障了,那怎么办了?zookeeper也考虑到了这点,zookeeper内部有一个“选举领导者的算法”,master可以动态选择,当master故障时候,zookeeper能马上选出新的master对集群进行管理。

0 0
原创粉丝点击