Zookeeper中的基础知识

来源:互联网 发布:python 爬虫多进程 编辑:程序博客网 时间:2024/06/05 14:35

1.Zookeeper是什么

为了解决分布式系统中不同进程之间相互同步互斥的问题,Zookeeper被开发出来解决互斥同步的问题。在单台机器上,基于共享内存的进程/线程调度,主要依赖于系统内部的信号量/锁来实现。在分布式系统中将会比单机中更加的复杂。基本的思路是选用一台机器作为最终的决策的机器负责调度,这时引入了新的问题是单点问题,解决单点问题可以引入冗余机器,来保证系统的高可用,但是应该选择哪一台机器来接替当前的机器呢?于是有了paxos/zab算法来帮助解决单点问题,当当前复制调度的机器出现问题的时候,系统能够自动的确定一台机器来完成复杂调度的工作。同时Zookeeper提供了watcher的功能,当在Zookeeper中节点发生了变化,会通知到客户端。
Zookeeper提供了良好的一致性可靠性容错性

2.zookeeper中的数据

Zookeeper中的数据模式是Znode。Znode和目录结构类似,Znode可以拥有子Znode。表示方法如/temp/music/liudehua

2.1zookeeper中的数据模型

2.1.1Znode引用方式

Znode和Linux中的文件目录类似,必须是绝对路径,必须以/开头。同时Znode的路径必须是唯一的,Znode的路径不能改变。Znode应用中有些是系统默认保留的 ,例如/zookeeper

2.1.2Znode的结构

Znode既可以类似于一个文件,当中包括了数据、元信息、ACL等数据;也可能类似于一个文件夹,其中包括了一些子Znode的信息。
Znode包括的数据:
stat:此为状态信息,当中包括Znode的版本,权限等信息
data:与当前Znode相关的数据。Zookeeper中可以关联一些数据,但不能将Zookeeper当成是数据存储,数据的大小有严格限制,上限是1M。
children:子节点的信息

2.1.3Znode的数据访问

Zookeeper中的每个节点的访问都是原子性的操作。每个Znode都有ACL表来控制客户端的访问权限。

2.1.4Znode的类型

Znode的类型分为临时的和永久的。
临时节点:临时节点的生命周期和创建他的会话是绑定的,当连接断开,会话失效的时候,这个临时节点就会被删除,也可以程序中手动删除。临时节点不允许有子节点。临时节点和会话绑定,所有的客户端都可以看见临时节点。
永久节点:永久节点只有用户删除的时候才能删除。

2.1.5顺序节点

当创建节点的时候,可以为当前节点设置一个递增的数。这个数对于父节点是唯一的。这个数用一个单精度的非负数来表示。

2.1.6 watch

可以在节点上创建一个watch,当Znode出现变化(增,删,改)的时候,Zookeeper会给watch的客户端发送一条消息,且只会发布一条。

2.2zookeeper中节点的创建的先后

在调度的过程中,哪个节点是先来的,按个节点是后来的。在单机中可以使用时钟来确定。在zookeeper中主要使用一下两种方式:

2.2.1zxid

zxid是一个全局唯一有序的标记,如果zxid1 > zxid2那么 zxid1代表的事件发生在zxid2代表的事件。
zxid主要有三种:
czxid:表示创建的zxid。
mzxid:表示修改的zxid。
pzxid:表示子节点最后变更zxid。
zxid由一种算法生成来表示全局唯一和有序。

2.2.2version

对于当前znode的每一个操作都会对当前节点的某一个version增加。
version包括以下:
version:表示数据的版本号
cversion:表示子节点的版本号
aversion:表示acl数据的版本号。

版本号的作用//todo mvcc?

2.3 znode中包括的属性

czixd :节点被创建的zxid
mzxid:节点被修改的zxid
pzxid:表示子节点变更的zixd
version:节点被修改的version
cversion:表示子节点被修改的版本号
aversion:acl表被修改的版本号
dataLength:数据长度
ephermalOwner:临时节点属于的sessionId

2.4 znode对应的操作

zookeeper中对于znode操作的元语:
create : 创建一个znode,如果父节点不存在就会报错
delete:删除一个znode
exist:判断zone是否存在,如果存在获取对应的元数据
getACL/setACL:获取/设置ACL数据
getChildren:获取所有的子节点数据
getData/setData: 获取/设置数据
sync:同步数据,把服务器端的数据同步到客户端
znode中组要包括元数据,ACL信息,子节点。然后包括本省的一些数据信息。所以元语主要是这些数据信息的获取,以及对于节点本身进行创建。
zookeeper中对于节点的操作是有限制的,更新的时候必须更新版本号,如果版本号非法,就会更新失败。这个类似于CAS,保证更新的原子性能。?
zookeeper的更新是非阻塞的,如果更新失败了,可以尝试重新更新,或者是去完成其他操作。
zookeeper中虽然是一个文件系统,但是功能比较简单,所以提供的元语也比较简单。

3Watcher监听器

3.1简介

Watcher,zookeeper提供了一个对于数据读取的监听器,其中数据读取包括 getData,exist,getChiledren这几种方法。
当设置了watcher之后,当对应的数据发生了变更的时候,会异步的通知客户端。
客户端收到wather的时间是早于客户端看见对应的数据变更的时间点的。

3.2watcher的类型

watchet主要有两种:

  • getData,exist:这两种是数据类型的watcher
  • getChildren:子节点类型的watcher

watcher触发的机制:

  • 数据类型:setData
  • 子节点类型:createNode

3.3 watcher触发的类型

watcher触发的类型主要分为两种,三种方式:

  • exist:
    绑定的watcher主要是节点的创建,删除,数据更新是被触发。
  • getData:
    绑定的watcher主要是节点的删除,数据变更的时候被触发。创建时无法被监控。
  • getChildren:
    绑定的watcher主要是子节点的创建删除以及节点本身的删除。其中节点删除可以通过事件类型来区分,DataDelete表示节点删除,DataDeleteChanged表示子节点删除。
    watcher监听的信息被维护在连接的服务器上.当连接断开的时候,这些watcher事件将不会被被通知。当连接重新连接到服务器上的时候,之前注册过的watcher能够重新被注册。

3.4注意点

系统中watcher事件主要分为两种:

  • 连接状态事件
    这种事件不需要被被注册,会自动被触发。
  • 子节点事件
    子节点事件需要单独注册,注册玩成功后 事件发生以后,只会被触发一次,然后后需要被重新注册。同时在Watcher方法中实现process(Event event)来处理异步通知事件。

4小结

这里主要是对zookeeper中关于功能性部分的描述。后期将会对非功能性进行描述,以及通过一些简单的功能如何实现分布式系统中复杂的功能的。

原创粉丝点击