zookeeper(相关问题)
1. zookeeper是什么(概括)?
Zookeeper是一个分布式协调服务的开源概架,主要用来解决分布式集群中应用系统的一致性问题,例如怎样避免同时操作同一数据造成脏读的问题,
ZooKeeper本质上是一个分布式的小文件存储系统,提供基于类似于文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效管理,从而用来维护和监控你存储的数据的状态变化,通过监控这些数据状态的变化,从而可以达到基于数据的集群管理,诸如:统一命名服务、分布式配置管理、负载均衡、分布式锁、分布式协调等功能。
2.zookeeper特点?
1)Zookeeper:一个领导者,多个跟随者组成的集群。
2)集群中只要有半数以上节点存活,Zookeeper集群就能正常服务
3)全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。
4)可靠性:如果消息被其中一台服务器接受,那么将被所有服务器接受。
5)顺序性:更新请求顺序进行,来自同一个Client的更新请求按其发送顺序依次执行。
6)数据更新原子性:一次数据更新要么成功,要么失败,不存在中间状态。
7)实时性:Zookeeper保证客户端再一定事件间隔范围内获取服务器的更新信息,或则服务器失效的信息。
3.zookeeper分布式环境如何搭建,步骤?
1.集群规划
在hadoop102、hadoop103和hadoop104三个节点上部署Zookeeper。
2.解压安装
(1)解压Zookeeper安装包到/opt/module/目录下
[jinghang@hadoop102 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
3.配置服务器编号
(1)在/opt/module/zookeeper-3.4.10/这个目录下创建zkData
[jinghang@hadoop102 zookeeper-3.4.10]$ mkdir -p zkData
(2)在/opt/module/zookeeper-3.4.10/zkData目录下创建一个myid的文件
[jinghang@hadoop102 zkData]$ touch myid
添加myid文件,注意一定要在linux里面创建,在notepad++里面很可能乱码
(3)编辑myid文件
[jinghang@hadoop102 zkData]$ vi myid
在文件中添加与server对应的编号:
2
(4)拷贝配置好的zookeeper到其他机器上
[jinghang@hadoop102 zkData]$ xsync myid
并分别在hadoop103、hadoop104上修改myid文件中内容为3、4
4.配置zoo.cfg文件
(1)重命名/opt/module/zookeeper-3.4.10/conf这个目录下的zoo_sample.cfg为zoo.cfg
[jinghang@hadoop102 conf]$ mv zoo_sample.cfg zoo.cfg
(2)打开zoo.cfg文件
[jinghang@hadoop102 conf]$ vim zoo.cfg
修改数据存储路径配置
dataDir=/opt/module/zookeeper-3.4.10/zkData
增加如下配置
#######################cluster##########################
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
(3)同步zoo.cfg配置文件
[jinghang@hadoop102 conf]$ rsync -av zoo.cfg jinghang@hadoop04:/opt/module/zookeeper-3.4.10/conf/
(4)配置参数解读
server.A=B:C:D。
A是一个数字,表示这个是第几号服务器;
集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
B是这个服务器的地址;
C是这个服务器Follower与集群中的Leader服务器交换信息的端口;
D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
4.集群操作
(1)分别启动Zookeeper
[jinghang@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh start
[jinghang@hadoop103 zookeeper-3.4.10]$ bin/zkServer.sh start
[jinghang@hadoop104 zookeeper-3.4.10]$ bin/zkServer.sh start
(2)查看状态
[jinghang@hadoop102 zookeeper-3.4.10]# bin/zkServer.sh status
JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
[jinghang@hadoop103 zookeeper-3.4.10]# bin/zkServer.sh status
JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: leader
[jinghang@hadoop104 zookeeper-3.4.5]# bin/zkServer.sh status
JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
4.zookeeper的常用命令(增、删、改、查、观察者、其他命令)
ls path [watch] 使用 ls 命令来查看当前znode中所包含的内容
ls2 path [watch] 查看当前节点数据并能看到更新次数等数据
create 普通创建
-s 含有序列
-e 临时(重启或者超时消失)
get path [watch] 获得节点的值
set 设置节点的具体值
stat 查看节点状态
delete 删除节点
rmr 递归删除节点
history 查看历史命令
redo 该命令可以重新执行指定命令编号的历史命令,命令编号可以通过history查看
5.zookeeper集群的角色和作用,observer的使用场景以及如何配置?
https://zhuanlan.zhihu.com/p/42067231
Leader:
Zookeeper 集群工作的核心
事务请求 (写操作) 的唯一调度和处理者,保证集群事务处理的顺序性
集群内部各个服务器的调度者。
对于 create, setData, delete 等有写操作的请求,则需要统一转发给leader 处理.leader 需要决定编号、执行操作,这个过程称为一个事务。
Follower:
处理客户端非事务(读操作)请求,转发事务请求给 Leader
参与集群Leader 选举投票。
Observer:(对于访问量比较大的集群,可以新增观察者角色)
观察者角色,观察Zookeeper集群的最新状态变化并将这些状态同步过来,对于非事务请求可以进行独立处理,对于事务请求,则会转发给 Leader服务器进行处理。
使用场景
1, 作为一个数据中心桥梁(datacenterbridge):为两个数据中心构建同一套zookeeper集群是会费很大劲的,因为数据中心之间网络延迟的高度变化可能会导致故障检测的误报和集群分区。但是如果集群完全部署到一个数据中心,另一个数据中心用Observers,则分区问题不会出现了。Client依然可以看到和发布提案。
2,作为消息总线的链接:一些公司表示有兴趣将ZK用作持久可靠消息总线的组件。 观察者将为这项工作提供一个自然的集成点:插件机制可用于将观察者看到的提案流附加到发布 - 订阅系统,同样不加载核心集群。
在zookeeper集群中使用观察者是非常简单的,仅仅需要修改配置文件里的两个配置即可。
在所有将会配置为zookeeper观察者的节点,添加下面一行:
peerType=observer
这行配置告诉zookeeper这台服务器将会成为一个Observers。
其次,在所有的服务器节点,在server定义处需要在末尾增加:observer。例如:
server.1:localhost:2181:3181:observer
这会告诉其它服务server.1是一个observer,不会参与投票。
运行下面的命令即可链接到集群:
bin/zkCli.sh -server localhost:2181
6.zookeeper节点类型有哪些?
1)持久化目录节点
2)持久化顺序编号目录节点
3)临时目录节点
4)临时顺序编号目录节点
7.Stat 结构体相关参数?
1)czxid-创建节点的事务zxid
每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。
事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。
2)ctime - znode被创建的毫秒数(从1970年开始)
3)mzxid - znode最后更新的事务zxid
4)mtime - znode最后修改的毫秒数(从1970年开始)
5)pZxid-znode最后更新的子节点zxid
6)cversion - znode子节点变化号,znode子节点修改次数
7)dataversion - znode数据变化号(修改一次会加一)
8)ephemeralOwner- 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0。
9)dataLength- znode的数据长度
10)numChildren - znode子节点数量
8.请简述ZooKeeper的选举机制
(1)服务器1启动,发起一次选举。服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1状态保持为LOOKING;
(2)服务器2启动,再发起一次选举。服务器1和2分别投自己一票并交换选票信息:此时服务器1发现服务器2的ID比自己目前投票推举的(服务器1)大,更改选票为推举服务器2。此时服务器1票数0票,服务器2票数2票,没有半数以上结果,选举无法完成,服务器1,2状态保持LOOKING
(3)服务器3启动,发起一次选举。此时服务器1和2都会更改选票为服务器3。此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数,服务器3当选Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING;
(4)服务器4启动,发起一次选举。此时服务器1,2,3已经不是LOOKING状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3,并更改状态为FOLLOWING;
(5)服务器5启动,同4一样当小弟。
9.请简述zookeeper监听原理是什么?
1)首先要有一个main()线程。
2)在main线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信connect,一个负责监听listener。
3)通过connect线程将注册的监听事件发送给Zookeeper.
4)在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中。
5)Zookeeper监听到有数据或路经变化,就会将这个消息发送给listener线程。
6)listener线程内部调用了process()方法。
常见的监听
1)监听节点数据变化
2)监听子节点增减的变化
10.请简述zookeeper数据的写流程?
1)Client向Zookeeper的Server上写数据,发送一个写请求。
2)如果Server不是Leader,那么Server1会把接受到的请求进一步转发给Leader,因为每个Zookeeper的Server里面有一个是Leader。这个Leader会将写请求广播给各个Server,比如Server1和Server2,各个Server写成功后,会向Leader发送成功信息。
3)当Leader收到半数以上(大多数)Server数据写成功的信息,说明该数据成功了。Leader会告诉Server1数据写成功了。
11.ZooKeeper的部署方式有哪几种?集群中的角色有哪些?集群最少需要几台机器?
(1)部署方式有两种 单机模式、集群模式
(2)角色:Leader和Follower
(3)集群最少需要机器数:3