zookeeper 原理

来源:互联网 发布:sql server建立数据库 编辑:程序博客网 时间:2024/04/28 17:47

zookeeper 开源的hadoop 分布式协调服务,分布式服务可以基于他实现同步服务,配置维护和命名服务等。
为什么使用zookeeper:
大部分分布式应用需要一个主控,协调器或控制器来管理分布式的子进程(如资源,任务等)
协调程序的反复便携浪费,切难以形成通用,伸缩性好的协调器
提供分布式锁服务,用以协调分布式应用
优点:
实现最终一致性
可靠性:如果消息被一台服务器接受,那么它将被所有的服务器接受
实时性:不能保证两个客户端能同时得到刚更新的数据,如果需要最新发数据,应该在读数据之前调用sync()接口
独立性:各个client之间互不干预
原子性:更行只能成功或者失败,没有中间状态
顺序性:所有server,统一消息发布顺序一致
原理:
1.每个server 在内存中存储了一份数据
2.zk启动时,将从实例中选举一个leader(pasox 协议/算法)
3.leader 负责处理数据更新等操作
4.一个更新操作成功,当且仅当大多数erver在内存中成功修改数据
具体内容:
a. Zookeeper的核心是原子广播,这个机制保证了各个server之间的同步。实现这个机制的协议叫做Zab协议。
Zab协议有两种模式,它们分别是恢复模式和广播模式。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,
当领导者被选举出来,且大多数server的完成了和leader的状态同步以后,恢复模式就结束了。
状态同步保证了leader和server具有相同的系统状态。
b. 一旦leader已经和多数的follower进行了状态同步后,他就可以开始广播消息了,即进入广播状态。这时
候当一个server加入zookeeper服务中,它会在恢复模式下启动,发现leader ,并和leader进行状态同步。
待到同步结束,它也参与消息广播。Zookeeper服务一直维持在Broadcast状态,直到leader崩溃了或者leader失去了大部分的followers支持。
c.广播模式需要保证proposal被按顺序处理,因此zk采用了递增的事务id号(zxid)来保证。所有的提议(proposal)都在被提出的时候加上了zxid。
实现中zxid是一个64为的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch。低32位是个递增计数。
d.当leader崩溃或者leader失去大多数的follower ,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的leader ,让所有的server都恢复到一个正确的状态。
每个Server启动以后都询问其它的Server它要投票给谁。

    e.  对于其他server的询问,server每次根据自己的状态都回复自己推荐的leader的id和上一次处理事务的        zxid (系统启动时每个server都会推荐自己)     f.  收到所有Server回复以后,就计算出zxid最大的哪个Server ,并将这个Server相关信息设置成下一次要投票的Server。     g.  计算这过程中获得票数最多的的sever为获胜者,如果获胜者的票数超过半数,则改server被选为leader 。否则,继续这个过程,直到leader被选举出来。    h.  leader就会开始等待server连接Follower连接leader,将最大的zxid发送给leader, Leader根据follower的zxid确定同步点 ,        完成同步后通知follower 已经成为uptodate状态 , Follower收到uptodate消息后,又可以重新接受client的请求进行服务了

数据一致性与paxos算法

据说Paxos算法的难理解与算法的知名度一样令人敬仰,所以我们先看如何保持数据的一致性,这里有个原则就是 : 在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点都执行相同的操作序列,那么他们最后能得到一个一致 的状态。     Paxos算法解决的什么问题呢,解决的就是保证每个节点执行相同的操作序列。好吧,这还不简单,master维护一个 全局写队列,所有写操作都必须 放入这个队列编号,那么无论我们写多少个节点,只要写操作是按编号来的,就能保证一 致性。没错,就是这样,可是如果master挂了呢。     Paxos算法通过投票来对写操作进行全局编号,同一时刻,只有一个写操作被批准,同时并发的写操作要去争取选票, 只有获得过半数选票的写操作才会被 批准(所以永远只会有一个写操作得到批准),其他的写操作竞争失败只好再发起一 轮投票,就这样,在日复一日年复一年的投票中,所有写操作都被严格编号排 序。编号严格递增,当一个节点接受了一个 编号为100的写操作,之后又接受到编号为99的写操作(因为网络延迟等很多不可预见原因),它马上能意识到自己 数据 不一致了,自动停止对外服务并重启同步过程。任何一个节点挂掉都不会影响整个集群的数据一致性(总2n+1台,除非挂 掉大于n台)。 总结    Zookeeper 作为 Hadoop 项目中的一个子项目,是 Hadoop 集群管理的一个必不可少的模块,它主要用来控制集群 中的数据,如它管理 Hadoop 集群中的 NameNode ,还有Hbase 中Master Election、Server 之间状态同步等。 

为什么zookeeper集群的数目,一般为奇数个?

Leader选举算法采用了Paxos协议;
Paxos核心思想:当多数Server写成功,则任务数据写成功
如果有3个Server ,则两个写成功即可;
如果有4或5个Server ,则三个写成功即可。
Server数目一般为奇数(3、5、7 )
如果有3个Server ,则最多允许1个Server挂掉;
如果有4个Server ,则同样最多允许1个Server挂掉
由此,我们看出3台服务器和4台服务器的的容灾能力是一样
的,所以
为了节省服务器资源,一般我们采用奇数个数,作为服务器部
署个数。
Zookeeper的数据模型
层次化的目录结构,命名符合常规文件系统规范
每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识
节点Znode可以包含数据和子节点,但是EPHEMERAL类型的节点不能有子节点
Znode中的数据可以有多个版本,比如某一个路径下存有多个数据版本,那么查询这个路径下的数据就需要带上版本
客户端应用可以在节点上设置监视器
节点不支持部分读写,而是一次性完整读写
Zookeeper的节点
Znode有两种类型,短暂的(ephemeral )和持久的(persistent )
Znode的类型在创建时确定并且之后不能再修改
短暂znode的客户端会话结束时,zookeeper会将该短暂znode删除,短暂znode不可以有子节点
持久znode不依赖于客户端会话,只有当客户端明确要删除该持久znode时才会被删除
Znode有四种形式的目录节点 :PERSISTENT、EPHEMERAL、 PERSISTENT_SEQUENTIAL、EPHEMERAL_SEQUENTIAL

zk 中的角色
leader:负责进行投票的发起和决议,更行系统状态
learner(学习者)
followr:用于接收客户端请求并响应客户端返回结果,在选举过程中参与投票
oberver:接收客户端连接,并将请求转发给leader但observer不v参加投票,只同步leader状态,目的是为了扩展系统提高读取熟读
client:请求发起方
ZK 核心:
zookeeper核心是原子广播,这个机制保证各个server之间的同步,实现这个机制额协议叫ZAB(zookeeper atomic brocast)协议
zab协议有两种模式:
恢复模式(选主):当服务器启动或者在leader宕机后zab进入恢复模式,
当leader选举后,且大多数server和leader状态同步后,则恢复模式结束。
广播模式(同步):状态同步保证leader和server具有相同的系统状态
Zookeeper的保证
更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行
数据更新原子性,一次数据更新要么成功,要么失败
全局唯一数据视图,client无论连接到哪个server,数据视图都是一致的
实时性,在一定事件范围内,client能读到最新数据

Follower主要有四个功能:
1. 向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
2 .接收Leader消息并进行处理;
3 .接收Client的请求,如果为写请求,发送给Leader进行投票;
4 .返回Client结果。
Follower的消息循环处理如下几种来自Leader的消息:
1 .PING消息:心跳消息;
2 .PROPOSAL消息:Leader发起的提案,要求Follower投票;
3 .COMMIT消息:服务器端最新一次提案的信息;
4 .UPTODATE消息:表明同步完成;
5 .REVALIDATE消息:根据Leader的REVALIDATE结果,关闭待revalidate的 session还是允许其接受消息;
6 .SYNC消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新。
zxid
znode节点的状态信息中包含czxid, 那么什么是zxid呢?
ZooKeeper状态的每一次改变, 都对应着一个递增的Transaction id, 该id称为zxid. 由于zxid的递增性质,
如果zxid1小于zxid2, 那么zxid1肯定先于zxid2发生. 创建任意节点, 或者更新任意节点的数据,
或者删除任意节点, 都会导致Zookeeper状态发生改变, 从而导致zxid的值增加.
watcher:
Watcher 在zookeeper是一个核心功能,watcher可以监控目录节点的数据变化即子目录的变化,一旦
这些状态发生变化,服务器就会通知所有设置在这个目录及诶单上的watcher,从而每个客户都很快知道他
所关注的目录节点的状态发生变化,而做出相应的反应
可设置观察的操作:exists,getChildren,fetData
可设置出发观察的操作:create ,delete,setData

配置:
1.解压并创建data,log目录
2.在data目录中创建myid文件,内容为当前机器编号,如server1 中myid 内容为1
3.conf目录下配置 zoo.cfg
dataDir={ZK_HOME}/data    ##数据保存目录  
        dataLogDir=
{ZK_HOME}/log ##日志目录
tickTime=2000 ##心跳检查间隔时间
syncLimit=2 ## leader与follow 之间发送消息请求和应答时间长度,最长不能超过多少个tickTIme 的商都 2*2000=4秒
clientPort=2181 ## 客户端连接zk服务器的端口,zk会见厅这个端口并接受客户端的访问请求
server.1=node1:2888:3888 ##1,2,3表示zk 服务器编号
server.2=node2:2888:3888 ## node* 表示zk服务器地址
server.3=node3:2888:3888 ## 2888表示 zk服务器与leader服务器交换信息的端口
server.4=node3:2888:3888:observer ##3888表示 当leader zk服务器宕机后,通过该端口来执行选举leader时,服务器互相通信的端口

0 0