Zookeeper原理及架构深入

一.zookeeper介绍

1.什么是zookeeper?

Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目,多用作为集群提供服务的中间件!官网也对此做了介绍:
在这里插入图片描述
zookeeper这个词语翻译过来就是"动物园管理员",主要是为hadoop体系集群提供服务的中间件,之所以叫zookeeper,是因为hadoop体系的框架大多是以动物作为logo,所以zookeeper就是用来管理hadoop体系集群的,同时,zookeeper本身也可以组成集群。

2.zookeeper结构

ZooKeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode。每个Znode可以类似看作是一个目录,其下可以创建子目录。 很显然zookeeper集群自身维护了一套数据结构。这个存储结构是一个树形结构,其上的每一个节点,我们称之为"znode",每一个znode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识
在这里插入图片描述
总结:zookeeper与linux文件系统类型,都是从根节点开始,zookeeper每个节点可以保存最多1MB的数据,以及无数的子节点。

二、安装zookeeper集群

1.下载zookeeper

zookeeper官网:http://zookeeper.apache.org/
这里以zookeeper-3.4.10.tar.gz为例演示,使用zookeeper需要有JAVA_HOME环境变量

2.目录介绍

解压tar包

lib:zookeeper启动时需要加载的jar包
conf:配置文件目录
bin:常用命令,例如启动服务端和客户端
contrib:其他的工具

3.安装与启动

进入conf文件夹,并将zoo_sample.cfg重命名为zoo.cfg,编辑zoo.cfg文件,配置文件属性介绍:

tickTime =2000:通信心跳数,Zookeeper服务器心跳时间,单位毫秒
initLimit =10:主从机器初始通信时限,单位tickTime,10代表10*tickTime=20s
syncLimit =5:LF同步通信时限,单位tickTime
dataDir:数据文件目录+数据持久化路径,建议修改至zk目录下datas下
clientPort =2181:客户端连接端口
dataLogDir:日志存放目录,如果不配置,则和数据存放在一起,建议修改至zk目录下logs下

在配置文件末尾添加:
server.101=hadoop101:2888:3888
server.102=hadoop102:2888:3888
server.103=hadoop103:2888:3888
在zookeeper根目录的datas文件夹下:创建myid文件,在文件中添加与server对应的编号:如102
然后分发到这3台机器上,建议将zookeeper配置到PATH环境变量下,依次启动各个机器的zookeeper

启动命令:zkServer.sh start
启动后,通过jps命令,可以看到一个名为QuorumPeerMain的进程,就代表启动成功!

三、Zookeeper的使用

1.启动客户端

1.执行zkCli.sh即可,默认是连接localhost的2181端口
2.可以使用zkServer.sh -server hostname:port 来连接不同的服务端
3.使用quit或者ctrl+c可以退出客户端

2.常用命令

help	显示所有操作命令
ls path [watch]	使用 ls 命令来查看当前znode中所包含的内容
stat	查看节点状态
ls2 path [watch]	查看当前节点数据及状态信息,相当于ls+stat
get path [watch]	获得节点的值
Create [-s] [-e] path data acl :创建一个节点
    -s  创建一个带sequnence(递增序号)的目录
    -e  临时(session关闭后消失)
set path data [dataVersion]	设置节点的具体值
delete 目录:删除一个非空节点
rmr	递归删除节点

四、zookeeper特点

1.Zookeeper:一个领导者(leader),多个跟随者(follower)组成的集群
2.Leader负责进行投票的发起和决议,更新系统状态
3.Follower用于接收客户请求并向客户端返回结果,在选举Leader过程中参与投票
4.集群中只要有半数以上节点存活,Zookeeper集群就能正常服务
5.Zookeeper的集群可以主从复制,但是没用读写分离。
6.Follower在掉线后,重新上线可以同步数据

五、zookeeper核心

1.leader选举机制

1.半数(Paxous)机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。
2.Zookeeper虽然在配置文件中并没有指定Master和Slave。但是,Zookeeper工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部的选举机制临时产生的。

2.选举流程

	1.例如一个集群有5台机器,事先已经在配置文件需要配置好集群数量,所以整个集群已经知道有几台机器
    2.服务器1启动,此时只有它一台服务器启动了,它发出去的报没有任何响应,所以它的选举状态一直是LOOKING状态。
    3.服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以id值较大的服务器2胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1、2还是继续保持LOOKING状态。
    4.服务器3启动,根据前面的理论分析,服务器3成为服务器1、2、3中的老大,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的leader。
    5.服务器5启动,同4一样当小弟。

3.zookeeper写数据流程

	1.比如 Client 向 ZooKeeper 的 Server1 上写数据,发送一个写请求。
	2.如果Server1不是Leader,那么Server1 会把接受到的请求进一步转发给Leader,因为每个ZooKeeper集群的Server里面有一个是Leader。这个Leader 会将写请求广播给各个Server,比如Server1和Server2, 各个Server写成功后就会通知Leader。
	3.当Leader收到大多数 Server 数据写成功了,那么就说明数据写成功了。如果这里三个节点的话,只要有两个节点数据写成功了,那么就认为数据写成功了。写成功之后,Leader会告诉Server1数据写成功了。
	4.Server1会进一步通知 Client 数据写成功了,这时就认为整个写操作成功。ZooKeeper 整个写数据流程就是这样的。
	注意:如果在都有数据的情况下启动,数据最全的才可成为leader(如果某台机器数据不全,也无法成为leader)

4.zookeeper读流程

zookeeper集群有单一视图的特点,客户点不管连接哪个服务器,服务端都可以返回数据,因为每台server中数据一致性都一样,所以随便访问哪台server读数据就行;

5.zookeeper监视器

1.首先要有一个main()线程
2.在main线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connet),一个负责监听(listener)
3.通过connect线程将注册的监听事件发送给Zookeeper。
4.在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中。
5.Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程。
6.listener线程内部调用了process()方法。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值