1.zookeeper介绍
zookeeper是一个为分布式应用提供一致性服务的软件,它包含一个简单的原语集,分布式应用程序可以根据它实现同步服务,
配置维护和命名服务等。
基本架构图:
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) 图解
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的应用场景