1.zookeeper介绍


    zookeeper是一个为分布式应用提供一致性服务的软件,它包含一个简单的原语集,分布式应用程序可以根据它实现同步服务,


    配置维护和命名服务等。


    基本架构图:


    


zookeeper集群serversid配置 zookeeper集群作用_zookeeper应用场景zookeep



2.为什么要使用zookeeper


    2.1) 大部分分布式应用需要一个主控、协调器或控制器来管理物理分布的子进程(如资源、任务分配等)


    2.2) 目前,大部分应用需要开发私有的协调程序,缺乏一个通用的机制


    2.3)协调程序的反复编写浪费,且难以形成通用、伸缩性好的协调器


    2.4)ZooKeeper:提供通用的分布式锁服务,用以协调分布式应用



3.zookeeper与haoop框架的结合


    3.1) Hadoop2.0,使用Zookeeper的事件处理确保整个集群只有一个活跃的NameNode,存储配置信息等.


    3.2)HBase,使用Zookeeper的事件处理确保整个集群只有一个HMaster,察觉HRegionServer联机和宕机,存储访问控制列表等.



4.zoookeeper的特性


      4.1)简易


          ZooKeeper的最重要核心就是一个精简文件系统,提供一些简单的操作以及附加的抽象(例如排序和通知)。


    4.2) 易表达


          ZooKeeper的原型是一个丰富的集合,它们是一些已建好的块,可以用来构建大型的协作数据结构和协议,例如:分布式队列、分布式锁以及一组对等体的选举。


    4.3)  高可用性


          ZooKeeper运行在一些集群上,被设计成可用性较高的,因此应用程序可以依赖它。ZooKeeper可以帮助你的系统避免单点故障,从而建立一个可靠的应用程序。


 


    4.4) 松散耦合


          ZooKeeper的交互支持参与者之间并不了解对方。例如:ZooKeeper可以被当做一种公共的机制,使得进程彼此不知道对方的存在也可以相互发现并且交互,对等方可能甚至不是同步的。


    4.5)ZooKeeper是一个库


          ZooKeeper提供了一个开源的、共享的执行存储,以及通用协作的方法,分担了每个程序员写通用协议的负担。随着时间的推移,人们可以增加和改进这个库来满足自己的需求。




     5.1)下载ZooKeeper:http://labs.renren.com/apache-mirror/zookeeper/zookeeper-3.4.3/zookeeper-3.4.3.tar.gz


    5.2) 解压:tar xzf zookeeper-3.4.3.tar.gz


    5.3) 在conf目录下创建一个配置文件zoo.cfg,或者zookeeper的默认配置文件为zookeeper/conf/zoo_sample.cfg,需要将其修改为zoo.cfg。


tickTime=2000 
 
ataDir=/Users/zdandljb/zookeeper/data 
 
dataLogDir=/Users/zdandljb/zookeeper/dataLog         
 
clientPort=2181



配置解释:


1.tickTime:CS通信心跳时间


Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。


tickTime=2000  




2.initLimit:LF初始通信时限


集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。


initLimit=5  




3.syncLimit:LF同步通信时限


集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)。


syncLimit=2  


 


4.dataDir:数据文件目录


Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。


ataDir=/home/michael/opt/zookeeper/data




5.clientPort:客户端连接端口


客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。


clientPort=2181


       5.4) 启动ZooKeeper的Server:sh bin/zkServer.sh start, 如果想要关闭,输入:zkServer.sh stop



zookeeper的安装与配置(集群模式)


         6.1) 在conf目录下创建一个配置文件zoo.cfg,或者修改原有的模板配置文件


tickTime=2000
 
dataDir=/Users/zdandljb/zookeeper/data
 
dataLogDir=/Users/zdandljb/zookeeper/dataLog         
 
clientPort=2181   
 
initLimit=5  
 
syncLimit=2       
 
server.1=server1:2888:3888                
 
server.2=server2:2888:3888                 
 
server.3=server3:2888:3888



解释:server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与


集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,


选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,


所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。




6.2)除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面就有一个数据就是 A 的值,


Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个 server。


server1机器的内容为:1,server2机器的内容为:2,server3机器的内容为:3



zookeeper的安装与配置(伪集群模式)


    6.1)建了3个文件夹,server1 server2 server3,然后每个文件夹里面解压一个zookeeper的下载包


    6.2) 进入data目录,创建一个myid的文件,里面写入一个数字,server1,就写一个1,server2对应myid文件就写入2,server3对应myid文件就写个3


     6.3)在conf目录下创建一个配置文件zoo.cfg,


tickTime=2000
 
dataDir=/Users/zdandljb/zookeeper/data
 
dataLogDir=xxx/zookeeper/server1/
 
clientPort=2181
 
initLimit=5 
 
syncLimit=2 
 
server.1=server1:2888:3888  
 
server.2=server2:2888:3888  
 
server.3=server3:2888:3888


    6.4) 注意点:


在一台机器上部署了3个server;需要注意的是clientPort这个端口如果在1台机器上部署多个server,那么每台机器都要不同clientPort,


比如 server1是2181,server2是2182,server3是2183,dataDir和dataLogDir也需要区分下;最后几行唯一需要注意的地方就是 server.X 


          这个数字就是对应 data/myid中的数字。 你在3个server的myid文件中分别写入了1,2,3,那么每个server中的zoo.cfg都配      


          server.1,server.2,server.3就OK了。因为在同一台机器上, 后面连着的2个端口3个server都不要一样,否则端口冲突,其 中第一个端口


          用来集群成员的信息交换,第二个端口是在leader挂掉时专门用来进行选举leader所用。 进入zookeeper-3.3.2/bin 目录中,.


          /zkServer.sh start启动一个server,这时会报大量错误?其实没什么关系,因为现在集群只起了1台server,


zookeeper服务器端起来会根据 zoo.cfg的服务器列表发起选举leader的请求,因为连不上其他机器而报错,那么当我们起第二个     


          zookeeper实例后, leader将会被选 出,从而一致性服务开始可以使用,这是因为3台机器只要有2台可用就可以选出leader并且对外提


          供服务(2n+1台机器,可以容n台机器挂掉)。




7.zookeeper的数据模型


    7.1)概念:zookeeper会维护一个具有层析关系的数据结构,它非常类似于一个标准的文件系统


    7.2)     图解


    

         

zookeeper集群serversid配置 zookeeper集群作用_服务器_02


    7.3)数据模型的基本概念


Zookeeper 这种数据结构有如下这些特点:

每个子目录项如 NameService 都被称作为 znode,这个 znode 是被它所在的路径唯一标识,如 Server1 这个 znode 的标识为 /NameService/Server1znode 可以有子节点目录,并且每个 znode 可以存储数据,注意 EPHEMERAL 类型的目录节点不能有子节点目录znode 是有版本的,每个 znode 中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据znode 可以是临时节点,一旦创建这个 znode 的客户端与服务器失去联系,这个 znode 也将自动删除,Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态称为 session,如果 znode 是临时节点,这个 session 失效,znode 也就删除了znode 的目录名可以自动编号,如 App1 已经存在,再创建的话,将会自动命名为 App2znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是 Zookeeper 的核心特性,Zookeeper 的很多功能都是基于这个特性实现的.        通过这个特性可以实现的功能包括配置的集中管理,集群管理,分布式锁等等。


8.zookeeper的节点:


Znode有两种类型,短暂的(ephemeral)和持久的(persistent)


    8.2) Znode的类型在创建时确定并且之后不能再修改


    8.3) 短暂znode的客户端会话结束时,zookeeper会将该短暂znode删除,短暂znode不可以有子节点


     8.4)持久znode不依赖于客户端会话,只有当客户端明确要删除该持久znode时才会被删除


          Znode有四种形式的目录节点,PERSISTENT、PERSISTENT_SEQUENTIAL、EPHEMERAL、EPHEMERAL_SEQUENTIAL




9.zookeeper的角色:


领导者(leader),负责进行投票的发起和决议,更新系统状态


    9.2)  学习者(learner),包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并想客户端返回结果,在选主过程


               中参与投票.


     9.3)Observer可以接受客户端连接,将写请求转发给leader,但observer不参加投票过程,只同步leader的状态,observer的目的是为了扩


               展系统,提高读取速度.


     9.4)客户端(client),请求发起方




10.zookeeper的顺序号:


    10.1) 创建znode时设置顺序标识,znode名称后会附加一个值


      10.2)  顺序号是一个单调递增的计数器,由父节点维护


    10.3)在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序



11.zookeeper的读写机制


    1) Zookeeper是一个由多个server组成的集群


    2)一个leader,多个follower


    3)每个server保存一份数据副本


    4)全局数据一致


    5)分布式读写


   6) 更新请求转发,由leader实施



12.zookeeper的保证


    1) 更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行


    2)数据更新原子性,一次数据更新要么成功,要么失败


    3)全局唯一数据视图,client无论连接到哪个server,数据视图都是一致的


    4)实时性,在一定事件范围内,client能读到最新数据



13)zookeeper的原理


   1)  Zookeeper的核心是原子广播,这个机制保证了各个server之间的同步。实现这个机制的协议叫做Zab协议。


          Zab协议有两种模式,它们分别是恢复模式和广播模式。当服务启动或者在领导者崩溃后,


          Zab就进入了恢复模式,当领导者被选举出来,且大多数server的完成了和leader的状态同步以后,


          恢复模式就结束了。状态同步保证了leader和server具有相同的系统状态。


    2) 一旦leader已经和多数的follower进行了状态同步后,他就可以开始广播消息了,即进入广播状态。


          这时候当一个server加入zookeeper服务中,它会在恢复模式下启动,发现leader,并和leader进行状态同步。


          待到同步结束,它也参与消息广播。Zookeeper服务一直维持在Broadcast状态,


          直到leader崩溃了或者leader失去了大部分的followers支持。


    3)广播模式需要保证proposal被按顺序处理,因此zk采用了递增的事务id号(zxid)来保证。所有的提议(proposal)都在被提出的时候加上zxid。


          实现中zxid是一个64为的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch。低32       


          位是个递增计数。


      4)  当leader崩溃或者leader失去大多数的follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的server都恢复


               到一个正确的状态 。




14.zookeeper中的leader选举


   1)  每个Server启动以后都询问其它的Server它要投票给谁。


   2)对于其他server的询问,server每次根据自己的状态都回复自己推荐的leader的id和上一次处理事务的zxid(系统启动时每个server都会   


               推荐自己)


    3)收到所有Server回复以后,就计算出zxid最大的哪个Server,并将这个Server相关信息设置成下一次要投票的Server。


     4) 计算这过程中获得票数最多的的sever为获胜者,如果获胜者的票数超过半数,则改server被选为leader。否则,继续这个过程,直到    


          leader被选举出来。


    


    步骤:


        1)   leader就会开始等待server连接


         2) Follower连接leader,将最大的zxid发送给leader


         3) Leader根据follower的zxid确定同步点


         4) 完成同步后通知follower 已经成为uptodate状态


         5) Follower收到uptodate消息后,又可以重新接受client的请求进行服务了




15)zookeeper的api介绍


 


16)zookeeper的应用场景