zookeeper官网:
什么是Zookeeper ?
Zookeeper是Google的chubby一个开源的实现,是hadoop的分布式协调服务。
它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。
zookeeper首先是一个集群,它成立的意义主要为其他分布式应用提供底层的协调服务,它自己也是个集群。
还没有zookeeper的时候
关于Zookeeper
若要保证数据的一致性,还有对文件的读写操作都是由leader来操作的。
leader:是个主节点,所有数据的写操作都是由leader来实现的,leader把数据更新了,然后再去通知Server去更新数据,而且leader会觉得,如果这里面有超过一半数据更新成功了,那么数据就是更新成功了。
它还有一个特点,leader与Server不是在集群启动之前决定谁是leader,谁是follower的,它没有事先去分配的,那么怎么决定?–-选举
启动的时候,大家的地位是同等的,大家都是普通的ZookeeperServer ,但是在启动的过程中,他们会通过一个特定的选举机制,去进行投票,谁来当选为leader,一旦选举出leader,那么其他的就是follwer,
为什么使用Zookeeper?
1.大部分分布式应用需要一个主控(如果是写死,一旦当即宕机就不能用了)、协调器或者控制器来管理物理分布的子进程(如资源、任务分配等)
2.目前,大部分应用需要开发私有的协调程序,缺乏一个通用的机制
3.协调程序的反复编写浪费,且难以形成通用 、伸缩性好的协调器
4.Zookeeper:提供通用的分布式锁服务,用以协调分布式应用。
zookeeper的安装和配置
1.创建myid文件
server1的内容为1
server2的内容为2
server3的内容为3
2.在conf目录下创建一个配置文件zoo.cfg
1)dataDir=写的是在本地的工作目录,因为要存数据
2)clientPort=2181 客户端去连接这个集群的时候,要连接的端口
3)initLimit=5
4)syncLimit=2
5)指定zookeeper集群
server.1=server1:2888:3888
server.2=server2:2888:3888
server.3=server3:2888:3888
配置完成后 用scp命令将解压的东西发送到各个zookeeper集群
具体的zookeeper搭建操作可以查询:
https://blog.csdn.net/qq_35078688/article/details/82845918
下面这个就是zookeeper的进程:
可以通过命令行的客户端访问集群:zkCli.sh,用它可以连接到集群上面去,访问里面的数据。
这样就连接到本节点的2181上面去了。
在本节点上写任意一个数据,在其他两台上都能看得到
zookeeper对数据的管理:它是采用什么格式来管理数据呢?
它把数据像文件一样的管理起来,类似于文件树的结构,文件树有一个根节点,叫作数据节点,树上的每一个节点叫作一个node ,你的客户端程序可以在这个 根下创建一个数据节点。
比如说你有一个分布式应用叫订单什么分析的
那么这个地方可能需要做一些分布式协调,建一个:
/order-analyze/:你的分布式应用里面的每一个其他节点可以在这个节点下建子节点,每一个节点也可以 保存你的一部分数据,数据最好是小于1M----存放的是信息数据
那么这个节点的子节点也可以存放自己信息的一些数据—就是你要保存的数据–也最好小于1 M.
写数据:
你可以在hadoop2下面修改值,然后在hadoop3下面查,你会发现这数据同步用不到两秒钟,两秒只是节点和节点之间一种状态的感知,
Zookeeper集群最后要想维持正常工作,要存活的节点数量大于集群配置数量的一半,才能够正常存活,因为它的选举机制,即多数票得票者称为leader,至少得两票,只剩下一台就不行
Zookeeper的节点:
Znode有两种类型,短暂的(cphemeral)和持久的(persistent)
短暂的Znode的客户端会话结束 时,zookeeper会将该短暂的Znode删除,短暂的不可以有子节点
持久的Znode不依赖于客户端会话,只有客户端明确要删除该持久Znode时,才会被删除
Znode 有四种形式的目录节点:
- PERSISTENT、
- PERSISTENT_SEQUENTIAL、
- EPHEMERAL、
- EPHEMERAL_SEQUENTIAL
Zookeeper的角色
领导者(leader): 负责进行投票的发起和决议,更新系统状态
学习者(learner):包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并向客户端返回结果,在选主过程中参与投票.
Observer可以接受用户客户端连接,将写请求转发给leader,但是Observer不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度。
客户端(client):请求发起者
Zookeeper的顺序号
1)创建Znode时设置顺序标识,Znode名称后面会附加一个值
2)顺序号是一个递增的计数器,由父节点维护
3)在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序
Zookeeper的读写机制
1)Zookeeper是一个由多个Server组成的集群
2)一个leader,多个follower
3)每个server保存一份数据副本
4)全局数据一致
5)分布式读写
6)更新请求转发,由leader实施
Zookeeper的保证
1)更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行
2)数据更新原子性,一次数据更新要么成功,要么失败
3)全局唯一数据视图,client无论连接到哪个server,数据视图都是一致的
4)实时性,在一定事件范围内,client能读到最新数据。
观察(watcher)
Watcher在Zookeeper是一个核心功能,Watcher可以监控目录节点的数据变化以及子目录的变化,一旦这些状态发生变化,服务器就会通知所有审核制在这个目录节点上的Watcher,从而每个客户端都很快知道它锁关注的目录节点的状态发生变化,从而做出相应的反应。
- 可以设置观察的操作:exists,getChildren,getData
- 可以出发观察的操作:create,delete,setData
Zookeeper的工作原理
1)Zookeeper的核心是原子广播,这个机制保证了各个server之间的同步。实现这个机制的协议叫作Zab协议。Zab协议有两种模式,它们分别是恢复模式和广播模式。当服务启动或者在领导崩溃之后,Zab就进入了恢复模式,当领导被选举出来,且大多数server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和server具有相同的系统状态。
2)广播模式需要保证proposal被按顺序处理,因此zk采用了递增的事物id号(zid)来保证。所有的提议(proposal)都在被提出的时候加上zid.实现中zid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch。低32位是递增计数器。
3)当leader崩溃或者leader失去了大多数的follower,这个时候,zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的server恢复到一个正确的状态。
Leader的选举
1)每个server启动以后都询问其他的server它要投票给谁,
2)对于其它server的 询问,server每次根据自己的状态都回复自己推荐的leader的id,和上一次处理事务的zid(系统启动时每个server都会推荐自己)
3)收到所有server的回复以后,就计算出zid最大的那一个server,并将那个server的相关信息设置成下一个要投票的server
计算这个过程中获得票数最多的server为获胜者,如果获胜者的票数超过半数,则改server被选为leader,否则继续这个过程,知道leader被选出来。
4)leader就会开始等待server
5)Follower连接leader,将最大的zid发送给leader
6)leader根据follower的zid确定同步点
7)完成同步后通知follower已经成为update状态
8)Follower收到update消息之后,又可以重新接受client的请求进行服务了。
应用场景1-------命名服务
分布式应用中通常需要有一套完整的命名规则,既能够出产生唯一的名称又便于识别和记住,通常情况下用树形的名称结构是一个理想的选择,树形的名称结构是一个理想的选择,树形的名称结构是一个有层次的目录,既对人友好又不会重复。
Name Service 是zookeeper内置的功能,只要调用Zookeeper的API就能 实现
应用场景2—配置管理
1)配置的管理在分布式应用环境中很常见,例如同一个应用系统需要多台PC server运行,但是它们运行的应用系统的某些配置项是相同的,如果要修改这些相同的配置项,那么就必须同时修改每台运行这个应用系统的PC server,这样fei非常麻烦,而且容易出错
2)将配置信息保存在Zookeeper的某个目录节点中,然后将所有需要修改的应用机器监控配置信息的状态,一旦配置信息发生变化,每台应用机器就会收到Zookeeper的通知,然后从Zookeeper获取新的配置信息应用到系统中。
应用场景3----集群管理
1)Zookeeper能够很容易的实现集群 管理的功能,如有多台server组成一个服务集群,那么必须要一个“总管”,知道当前集群中每台机器的服务状态,一旦有机器不能够提供服务,集群中其他集群必须知道,从而做出调整分配服务的策略。同样当增加集群的服务能力时,就会增加集群的服务能力,就会增加一台或者多台server,同样也必须让“总管”知道.
2)zookeeper不仅能够维护 当前的集群中机器的服务状态,而且能够选出一个“总管”,让这个总管来管理集群,这就是Zookeeper的另一个功能Leader Election。
应用场景4—共享锁
共享锁在同一个进程中很容易实现,但是跨进程或者在不同的sever之间就不好实现了。zookeeper却很容易实现这个功能,实现方式也是需要获得锁的。
server创建一个PERSISTENT_SEQUENTIAL目录节点,然后调用getChildren方法获取当前目录节点列表中最小的节点是不是就是自己创建的目录节点,如果正是自己创建的,那么它就获得了这个锁,如果不是,那么它就调用了exists(String path,boolean watch)方法监控zookeeper上目录节点列表的变化,一直到字节创建的节点就是列表中最小编号的目录节点,从而获得锁,释放锁很简单,只要删除前面它自己所创建的目录节点就行了 。
总结
1)zookeeper作为hadoop项目中一个子项目,是hadoop集群管理中的一个必不可少的模块,它主要用于控制集群中的数据,如它管理Hadoop集群中的NameNode,还有HBASE中,Master Election、server之间状态同步等等。
2)zookeeper提供了一套很好的分布式集群管理的机制,就是它这种基于层次的目录树的数据结构,并对树中的节点进行有效管理,从而可以设计出多种多样的分布式数据管理模型。