Zookeeper是什么?
Zookeeper = 文件系统 + 通知机制
是一个 分布式协调服务 的开源框架,主要用来解决分布式集群中应用系统的一致性问题。【同时操作数据导致脏读】
是一个基于观察者模式设计的分布式服务管理框架①负责存储和管理大家都关心的数据
②接收观察者的注册,观察节点的数据状态的变化
③负责通知已经在Zookeeper上注册的那些观察者做出相应的反应
Zookeeper特点
①Zookeeper:一个领导者(Leader)、多个跟随者(Follower)组成的集群 one King more soldiers
②半数机制:集群中只有半数以上节点存活,Zookeeper集群就能正常服务。 1/2Alive=Success
③全局数据一致:每个Server保存一份相同的数据副本,Client连接到哪一个Server,数据都是一致的。
④可靠性:如果消息被其中一台服务器接收,那么将被所有服务器接收。
⑤顺序性:更新请求顺序进行,来自同一个Client的更新请求按其发送顺序依次执行
⑥数据更新原子性:一次数据更新要么成功,要么失败,不存在中间状态
⑦实时性:Zookeeper保证客户端在一定事件内间隔范围内获取服务器的更新信息,或者服务器失效的信息。
Zookeeper分布式环境如何搭建,步骤?
Ⅰ、【解压安装】:
①在已经配置好的完全分布式的集群中随机选择一个节点,例如:【hadoop01】
②将下载好的Zookeeper的tar包通过sftp协议放在节点【hadoop01】的【/opt/software】目录下
③进入到【/opt/software】目录下,通过【tar -zxvf Zookeeper-x.x.x.tar.gz -C /opt/module】将tar包解压至【/opt/module下】
④进入【/opt/module/Zookeeper-x.x.x】目录下
⑤进入conf目录下,将zoo_sample.cfg改为zoo.cfg【非必须的操作】
[用户名@主机名 conf]$ mv zoo_sample.cfg zoo.cfg
⑥在【/opt/module/zookeeper-x.x.x】目录下创建一个zkData目录
⑦在⑤中的【zoo.cfg】中配置zkData,【key:dataDir value:zkData目录的绝对路径】
Ⅱ、【配置服务器编号】:
①在【/opt/module/zookeeper-x.x.x/zkData】目录下创建一个myid的文件,文件内容为主机编号
例如:【Hadoop01】的myid文件中:1
【Hadoop02】的myid文件中:2
【Hadoop03】的myid文件中:3
Ⅲ、配置【zoo.cfg】文件
①在【zoo.cfg】文件中添加
#######################cluster########################## server.1=hadoop01:2888:3888 server.2=hadoop02:2888:3888 server.3=hadoop03:2888:3888
②将zoo.cfg分发至集群中其他节点
Zookeeper的常用命令(增、删、改、查、观察者、其他命令)
创建
create -s | -e path [version]
-s:有序添加节点,自增 -e:添加临时节点,临时节点不能添加子节点,并且会话结束,临时节点会消失。 默认情况【不添加-s|-e】下,为创建永久节点
修改:修改节点的数据
set path data [version] 修改节点的数据
path:节点的路径 data:即将覆盖节点原有数据的新数据 [version]:每一次操作都会使得指定节点的【dataVersion】+1,即版本号+1
删除
delete path:删除空节点
rmr path:递归删除非空节点
path:节点的绝对路径
查询+Observer观察者
ls path [watch]:获取当前节点下的子节点列表
ls:list的简写 path:指定节点的绝对路径 watch:是观察者模式,添加有watch,则会监控该节点的状态变化
ls2 path [watch]:查看当前节点数据及更新次数,子节点数量,创建时间等数据
path:指定节点的绝对路径 watch:是观察者模式,添加有watch,则会监控该节点的状态变化
get path [watch]:获取节点的数据
path:指定节点的绝对路径 watch:是观察者模式,添加有watch,则会监控该节点的状态变化
stat path [watch]:查看节点状态
path:指定节点的绝对路径 watch:是观察者模式,添加有watch,则会监控该节点的状态变化
其他命令
help:显示所有操作命令
history:查看历史命令
redo + 命令序号:重新执行指定命令编号的历史命令。【需要先使用history查看命令的编号】
附:
启动Zookeeper服务:[用户名@主机名 zookeeper-x.x.x]$ bin/zkServer.sh start 停止Zookeeper服务:bin/zkServer.sh stop 重启Zookeeper服务:bin/zkServer.sh restart 查看Zookeeper服务状态:bin/zkServer.sh status 启动Zookeeper客户端:[用户名@主机名 zookeeper-x.x.x]$ bin/zkCli.sh ……
Zookeeper集群的角色和作用,observer的使用场景以及如何配置?
集群的角色分别为:Leader【领导者】、Follower【跟随者】、Observer【观察者】
Leader:
事务【写操作】的唯一调度者和处理者,保证集群处理事务有条不紊 是集群内部各个Server的调度者 对【create】创建、【setData】修改、【delete】删除等有写操作的请求决定编号、执行操作,即一个事务。
Follower:
处理客户端非事务【读操作】请求,将写操作【事务】的请求转发给Leader处理。 参与集群Leader选举投票。
Observer:适用于访问量较大的集群
观察Zookeeper集群的状态变化,并同步状态,对于读操作【非事务】请求可以进行独立处理,将写操作【事务】请求转发给 Leader处理。 不参与任何形式的投票只提供读操作【非事务】服务,通常用于不影响集群事务处理能力的前提下提升集群的非事务处理能力。
Zookeeper节点类型有哪些?
持久:客户端和服务器断开连接后,创建的节点不会删除
短暂:客户端和服务器断开连接后,创建的节点自己删除
①持久化目录节点:【create 节点路径】
②持久化顺序编号目录节点:【create -s 节点路径】
③临时目录节点:【create -e 节点路径】
④临时顺序编号目录节点:【create -s -e 节点路径】
Stat 结构体相关参数?
创建节点的事务ID:czxid
节点的创建时间【时间戳,从1970开始的毫秒数】:ctime
最后一次更新操作的事务ID:mzxid
最后一次更新操作的时间【时间戳,从1970年开始的毫秒数】:mtime
最后一次更新的子节点ID:pZxid
子节点变化号(更新的次数):cversion
数据变化号:dataversion
是否为临时节点的标记:ephemeralOwer
节点的数据长度:dataLength
子节点的数量:numChildren
请简述Zookeeper的选举机制
LOOKING可以投票,非LOOKING状态不能进行投票。
①Server1启动,发起一次选举,自投一票,票数不足半数以上,选举失败,Server1为观望状态:LOOKING
②Server2启动,第二次选举,Server1和Server2各自自投一票,并交换投票结果。
Server1的ID<Server2的ID,所以,Server1改投Server2,票数不足半数,选举失败,同为LOOKING
③Server3启动,第三次选举,Server3高于Server1和Server2,Server1和Server2改投Server3,Server3自投一票,
所以投票结果为:Server1:0,Server2:0,Server3:3。Server3票数过半,Server3为Leader,Server1、2为Follower。
④Server4启动,第四次选举,Server1、2、3不是LOOKING,不会更改选票信息,Server3:3,Server4:1。
Server4少数服从多数,改投Server3,并成为Follower。
⑤Server5启动,与Server4一样。
请简述Zookeeper监听原理是什么?
①首先有一个main()线程
②主线程下创建Zookeeper客户端,同时创建两个线程:Listener【监听】、Connect【网络连接通信】
③Connect将注册的【Watch】监听事件发送给【Zookeeper】。
④Zookeeper将注册的【Watch】添加到监听事件的列表中。
⑤Zookeeper监听到数据或路径的变化,就会给Listener线程发信息
⑥Listener线程内部调用process()方法
附:
常见的监听
(1)监听节点数据的变化
(2)监听子节点增减的变化
请简述Zookeeper数据的写流程?
①客户端向Zookeeper随机Server发送写操作【事务】请求,
②Server处理请求,如果该Server不是Leader,就会将来自客户端的写操作【事务】请求转发给Leader服务器
③Leader接收到来自客户端的写操作的请求,广播到各个Server,各个Server进行写操作,成功后,给Leader发送成功的信息。
④当Leader收到半数以上Server数据写成功的信息,说明写操作执行成功,Leader会告诉接收客户端请求的Server写操作执行成功。
⑤接收客户端请求的Server通知客户端写操作执行成功。
Zookeeper的部署方式有哪几种?集群中的角色有哪些?集群最少需要几台机器?
Zookeeper的部署方式:本地模式安装部署、分布式安装部署
集群中的角色有:一个领导者【Leader】、多个跟随者【Follower】、观察者【Observer】
Zookeeper集群搭建指的是Zookeeper分布式模式安装,通常由2n+1台Servers组成,所以集群最少需要3台机器。