hadoop框架之zookeeper
-
zookeeper介绍
zookeeper是一个分布式协调服务系统,为用户的分布式应用程序提供协调服务,所提供的服务有多个,比如主从协调,服务器节点动态上下线,同步服务等。从设计模式来讲,这其实是一个基于监听者模式的设计。
zookeeper=文件系统+通知机制(配置数据存储在系统中,当该数据发生变化时,触发监听机制)
zookeeper的主要作用是:减轻为分布式应用开发协调服务的负担
zookeeper的底层其实只实现了两个功能:
1)管理用户程序提交的状态信息
2)为用户程序提供数据节点监听服务
对外来说,没有主从之分,对外提供高可靠的、稳定的同步服务
对于zookeeper内部来说,是由主从之分的,主是leader,其他都是follower,leader负责具体的操作,follower只负责接收从外界传来的数据。leader处理完成后,把结果返回给follower,follower再返回给客户端。至于leader是如何产生的,下面我们会详细讲解。 -
zookeeper的特点
是由一个leader和多个follower组成的集群
在zookeeper启动时或者leader挂掉时,会重新投票产生leader
集群中只要有半数以上的节点存活,集群就能正常服务,这只是针对集群刚开启时,如果集群开启,只要leader不挂,就算follower只剩一个,集群仍然是可以正常服务的。
全局数据一致性,每个server都保存一份相同的数据副本,因此,无论client连接到那个server,数据都是一致的
更新请求顺序执行,来自同一个client的更新请求按照其发送的顺序依次执行
实时性,因为数据量小,加上存储在内存中,所以同步是非常快的,一定时间范围内,client能读到更新的数据 -
数据结构
类似于unix,整体可以看做一棵树,每一个节点称之为Znode,但不同的是,unix中的目录是不可以存放数据的,但zookeeper中的节点(目录)是可以存放数据少量数据的,每个Znode默认存储1M数据,每个Znode可以通过路径唯一标识。这里举个例子:在zookeeper的client中创建一个节点(目录)是这样:create /test “测试”,如果不进行赋值,则会创建失败。 -
本地模式部署
这里我们只做本地的zookeeper部署,之后在搭建高可用集群时,会演示集群上的zookeeper部署。
安装jdk
将zookeeper安装包拷贝到指定目录下(目录自定义)
解压到指定目录
在zookeeper的解压目录下的conf目录下,将zoo_sample.cfg修改为zoo.cfg
编辑zoo.cfg文件,将dataDir修改为自定义目录
启动zookeeper,如果配置了环境变量,在哪里启动都可以,如果没有配置,只能在bin下启动,命令是zkServer.sh start
jps查看进程是否启动,进程名字是QuorumPeerMain
启动客户端的命令是:zkCli.sh
退出客户端是:quit
停止服务是:zkServer.sh stop -
zookeeper的内部原理
leader的选举机制:
半数机制:集群中半数以上的机器存活,机器就是可用的,所以zookeeper适合装在奇数台机器上
投票选举机制:我们以5台机器为例,他们的id分别是1-5(是自定义的),启动的顺序,默认从1-5,那么投票的具体过程如下:
1)id为1的server1启动,这时他给自己投一票
2)id为2的server2启动,这时他也给自己一票,但server2的id大于server1,所以server1把自己的票给server2(是默认给id大的)
3)因为是半数以上机制,所以需要3票才可以,这时id为3的server3启动,按上述规则,票都给到server3,这时server3已经有3票了,符合了半数机制,leader产生就是id为的server3
4)因为leader已经产生,所以后面的server4和server5,只能作为follower,他们的票作废。
注:以上都是按照顺序启动的,如果不按照顺序,leader也是不确定的,但确定的是leader是尽量给到id比较大的,比如,如果id为5的先启动,那么leader肯定就是server5了 -
节点类型
Znode有两种类型:
1)短暂的:客户端与服务器端断开连接后,创建的节点自己删除
2)持久的:客户端与服务器端断开连接后,创建的节点自己不删除
Znode有四种形式的目录节点(编写程序会用到):
1)PERSISTENT(持久化目录节点)
2)PERSISTENT_SEQUENTIAL(持久化顺序编号目录节点)
3)EPHEMERAL(临时目录节点)
4) EPHEMERAL-SEQUENTIAL(临时顺序目录节点) -
监听器原理
1)在main线程中创建zookeeper客户端,这时会创建两个线程(很重要),一个负责网络连接通信,一个负责监听。
2)通过connect线程将注册的监听事件发送给zookeeper
3)在zookeeper的注册监听器列表中将注册的监听事件添加到列表中
4)zookeeper监听到有数据或者路径变化,就会将这个消息发送给listener线程
5)线程内部调用了process方法
代码操作:进行监听是通过watch,比如:ls / watch,这就是监听/目录下的路径,一旦路径有所改变,则就会触发监听事件 -
写数据流程(important)
1)client向zookeeper的server1上写数据,发送一个写的请求
2)如果server1不是leader,那么server1会把请求转发给leader。leader会把写的请求广播给每个server,各个server写成功后会通知leader
3)当leader收到大多数server数据写成功后,就说明数据写成功了。
4)server会进一步通知client数据写成功,这时就认为整个写数据流程成功。 -
客户端命令行的操作
help 显示所有操作命令
ls path [watch]查看当前znode中包含的内容(watch代表是否监听)
ls2 path [watch] 查看当前节点数据,可以看到更新次数等数据
create path “值” 普通创建(-s创建有序列的节点;-e创建临时节点),没有值是创建不成功的
get path [watch] 获得节点的值(watch表示监听,一旦值被改变,会触发监听器)
set path “值” 设置节点具体的值
delete path 只能删除空节点,如果节点下还有节点不能删除
rmr path 可以删除非空节点
stat path 查看节点状态 -
简单说明
关于zookeeper的介绍,我们先就介绍这么多,之后我们会就一些具体的实例,来给大家做更细致的讲解,欢迎大家指出错误或提出建议,刚开始结束这个csdn,对一些格式、使用还是不够熟悉,谢谢大家的耐心查看。