动物园的铲屎官Zookeeper——原理篇
目录
前言
hadoop生态圈中的动物有点点多,所以我们的zookeeper光荣的担任了铲屎官这一工作,鼓掌~~~~。
一、Zookeeper是什么
Zookeeper是一个开源的,分布式的,为分布式应用提供协调服务的Apache项目。
两大功能:Zookeeper = 文件系统(存储数据) + 通知机制。
举例解释:当微信公众号推送文章的时候,微信服务器做了两件事。第一,将公众号发布的文章保存下来,这实现了文件系统,保存了文件。第二,将文章推送给订阅了该公众号的用户,这实现了通知功能。如下图中腾讯服务器集群也就是zookeeper集群。
二、Zookeeper集群特点
通常我们会搭建zookeeper集群,在Zookeeper集群中有一个领导者(leader)多个跟随者(f跟随者(follower),他们共同组成了Zookeeper集群,具有以下特点。
1、leader负责发起投票和决议,更新整集群的状态。
2、follower用于接收客户请求并向客户端返回结果,在选举leader过程中参与投票。
3、集群中只要有半数以上的节点存活,Zookeeper集群就可以正常服务。
4、全局数据一致性:每个server保存一份相同的数据副本,client不管连接哪个server,获取的数据都是相同的。
5、更新请求顺序进行,同一个client的更新请求,按照其发送顺序依次执行。
6、数据更新一致性:一次数据更新,要么成功更新,要么失败。
7、实时性:在一定时间范围内,client能实时更新。
三、Zookeeper的数据结构
Zookeeper 数据模型的结构和 Unix 很像,都有一个根节点 / 。在根节点下面是一个个子节点,称之为 Znode ,Znode 是Zookeeper 中最小的数据单位。每个 Znode 下面还可以再挂 Znode ,这样一层层下去就形成了一个层次化命名空间 Znode 树,我们称之为 Znode Tree。
Zookeeper 中每一个数据节点都是一个 Znode 。如下图根节点下有两个节点,分别是:znode1、znode2,znode1下又有两个子节点 leaf1 和 leaf2 ,znode2 下 有 leaf 节点。我们可以在这五个节点下存储信息。
Zookeeper 将数据存储在 Znode 上,每个 Znode 默认可以存储 1MB 的数据,每个节点可以通过其路径唯一标识。
1. Znode类型
(1)临时节点(客户端和服务器断开连接后,创建的节点会被删除)
1) 临时普通节点 :客户端与 Zookeeper 断开后,该节点被删除。
2)临时带序号节点:Zookeeper给该节点名称进行顺序编号,客户端与 Zookeeper 断开后,该节点被删除。
(2)永久节点(客户端和服务器断开连接后,创建的节点不会删除)
1)永久普通节点:客户端与 Zookeeper 断开后,该节点依旧存在。
2)永久带序号节点:Zookeeper给该节点名称进行顺序编号,客户端与 Zookeeper 断开后,该节点依旧存在。
2. stat结构体
1)czxid- create 引起这个znode创建的zxid,创建节点的事务的zxid
每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。
事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。
2)ctime - create znode被创建的毫秒数(从1970年开始)
3)mzxid - modify znode最后更新的zxid
4)mtime - modify znode最后修改的毫秒数(从1970年开始)
5)pZxid-znode最后更新的子节点zxid
6)cversion - znode子节点变化号,znode子节点修改次数
7)dataversion - znode数据变化号
8)aclVersion - znode访问控制列表的变化号
9)ephemeralOwner- 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0。
10)dataLength- znode的数据长度
11)numChildren - znode子节点数量
三、Zookeeper内部原理
1. 监听器原理
监听原理详解,如上图
(1)首先要有一个main() 线程。
(2)在 main() 线程中创建一个客户端(zkClient),这时就会创建两个线程,一个负责网络连接通信(connect),一个负责监听(listener)。
(3)通过 connect 线程,将注册的监听事件发送给Zookeeper。
(4)Zookeeper会进行记录,将注册的监听事件添加到zookeeper的注册监听器列表中。
(5)Zookeeper监听到有数据或者路径变化,就会将这个消息发送给listener线程。
(6)listener 线程内部调用了 process() 方法。
2. 写数据流程
Zookeeper写数据的流程主要分为以下几步,如上图所示:
(1)Client 向 Zookeeper 中的 Server1上面写数据,发送一个写请求。
(2)每个 Zookeeper 中只有一个Leader,如果Server1不是Leader,将会把接收到的请求转发给Leader。Leader将会把这个写请求广播给各个Server,各个Server写成功后会通知Leader。
(3)当Leader收到半数以上的Server写成功的通知后,就说明数据写成功了。写成功之后Leader会告诉Server1数据写成功了。
(4)Server1接收到数据写成功的通知后会告诉Client,数据写入成功。整个写操作完成