zookeeper是一个开源的分布式协调服务.是典型的分布式数据一致性的解决方案.

zookeeper可以保证以下分布式一致性的特性

1. 顺序性:同一客户端发起的事务请求,最终会严格的按照发出顺序应用到zookeeper上

2. 原子性:事务请求的执行结果在集群机器上要么全部成功,要么全部失败,不存在部分成功,部分失败的结果.

3. 单一视图:客户端无论连接到哪个zookeeper服务端,所看到的服务端数据模型都是一致的.

4. 可靠性:一旦服务端成功的应用了一条事务,而且完成了对客户端的响应.那么这个事务对服务端的状态变更就会被持久化.

5. 实时性:一旦一个事务被成功的应用了,那么客户端能从服务端上读取事务变更后的最新的数据状态.这里需要注意的是,zookeeper仅保证在一段时间内,客户端最终一定能够从服务端上读取到最新的数据状态.

zookeeper基本概念

zookeeper架构

系统模型如下图所示

  1. 客户端随机连接集群中任何一台server
  2. 集群内所有server基于Zab(ZooKeeper Atomic Broadcast)协议进 行通信
  3. 集群内部根据算法自动选举出一个leader,负责向follower(其他 server)广播所有变化消息
  4. 集群中每个follower都和leader通信

    • Follower接收来自leader的所有变化消息,保存在自己内存

    • Follower转发来自客户端的写请求给leader

    • 客户端的读请求会在follower端直接服务,无需转发给leader

集群角色

Leader

Leader服务器是zookeeper集群工作机制的核心.

事务请求的唯一调度者和处理者,保证集群事务请求处理的顺序性.

Follower

Follower服务器是zookeeper集群状态的跟随者.

处理非事务请求,转发事务请求给Leader服务器

参与事务请求的proposal投票

参与Leader选举投票

Observer

Observer服务器只提供非事务服务.通常用于不影响集群事务处理能力的前提下提升集群的非事务的处理能力

zookeeper数据模型

  1. 基于树形结构的命名空间,与文件系统类似
  2. 节点(znode)都可以存数据,可以有子节点
  3. 节点不支持重命名
  4. 数据大小不超过1MB(可配置)
  5. 数据读写要保证完整性

ZooKeeper基本API

string create(path, data, acl, flags)

delete(path, expected_version)

stat setData(path, data, expected_version)

(data, stat) getData(path, watch)

stat exists(path, watch)

string[] getChildren(path, watch)

数据节点

Zookeeper把所有的数据保存到内存中,数据模型就是一颗树(znode tree).由斜杠(/)进行分割路径,就是一个znode,如/foo/path1.每个znode上都会保存自己的数据内容,同时还会保存一系列的属性.

节点信息

[zk: localhost:2181(CONNECTED) 4]

get /YINSHI.MONITOR.ALIVE.CHECK

?t 10.232.102.191:21811353595654255

cZxid = 0x300000002

ctime = Thu Dec 08 23:29:53 CST 2011

mZxid = 0xe00008bbf

mtime = Thu Jul 28 07:17:34 CST 2012

pZxid = 0x300000002

cversion = 0

dataVersion = 2164293

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 39

numChildren = 0

上面这个信息,是在ZK命令行的一个输出信息,从这个输出内容中可以清楚的看到,ZK的一个节点包含了哪些信息。其中比较重要的信息包括节点的数据内容,节点创建/修改的事务ID,节点/修改创建时间,当前的数据版本号,数据内容长度,子节点个数等。

版本

zookeeper的每个znode都会存储数据.zookeeper都会为每个znode维护一个叫stat的数据结构.stat记录了znode的三个数据版本.分别是cversion ,aversion,dataVersion.

dataVersion:当前数据节点数据内容的版本.注意这里关注的是节点数据内容的变更次数,强调的是变更次数,即使两次变更的数据内容的值没有发生变化,dataVersion的值仍然会发生变化.

cVersion:当前数据节点子节点变更版本号.

aVersion:当前数据节点acl变更版本号

Znode节点类型

  1. Sequential节点和non-sequential节点
  2. Ephemeral节点和persistent节点

Sequential/non-sequential节点类型

  1. Non-sequential节点不能有重名
  2. Sequential节点

    • 创建时可重名

    • 实际生成节点名末尾自动添加一个10位长度、左边以0填充的单调递增数字

Ephemeral/Persistent节点类型

  1. Ephemeral节点在客户端session结束或超时后自动删除
  2. Persistent节点生命周期和session无关,只能显式删除

正常连接时节点情况:

断开客户端连接时节点情况:

ZooKeeper Session

  1. 客户端和server间采用长连接
  2. 连接建立后,server产生session ID(64位)返还 给客户端
  3. 客户端定期发送ping包来检查和保持和server的 连接
  4. 一旦session结束或超时,所有ephemeral节点会 被删除
  5. 客户端可根据情况设置合适的session超时时间
  6. 客户端能够异步接收来自服务端的Watcher事件通知

Session指的是客户端会话.一个客户端连接指的是客户端跟服务端之间建立起的一个TCP长连接.默认端口为2181.从第一次创建连接开始,session的会话周期就开始了,sessionTimeout是用于设置客户端会话超时时间,当由于服务器压力太大,网络故障或客户端主动断开连接等各种原因导致的客户端连接断开时,只要在sessionTimeout规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话仍然有效.

ZooKeeper Watches

  1. Watch是客户端安装在server的事件侦听方法
  2. 当侦听的变化发生时,server发消息给客户端进行通知
  3. 客户端使用单线程对所有事件按顺序同步回调
  4. 触发回调条件:

    客户端连接、断开连接

    节点数据发生改变

    节点本身发生变化(包括自身节点的删除或者子节点列表变化)
  5. Watch是单发的,每次触发后会被自动删除
  6. 如果需要再次侦听事件,必须重新安装 watch
  7. 无法保证跟踪到每一个变化
  8. 避免安装大量watches侦听在同一个节点

Watch的创建和触发规则

zooKeeper中所有的读操作—getData(), getChildren(), exists()—都有一个选项:设置一个监视器,作为附带的功能。ZooKeeper监视器的定义如下:一个监视器事件是一个一次性触发事件,它被发送到设置它的客户端,它发生的条件是它监视的数据发生变化了。关于监视器的定义,这里有3个关键点需要考虑:

1:一次触发

当数据发生变化时,监视器事件被发送到客户端。例如,如果客户端执行getData(“/znode1”, true),而后来/znode1的数据变化了或删除了,客户端就会得到一个/znode1变化的监视器事件,如果/znode1又发生了变化,不会发送监视器事件,除非该客户端再次执行读操作而设置了一个新的监视器。

2:通知发送给客户端

Zookeeper 客户端和服务端是通过 socket 进行通信的,由于网络存在故障,所以监视事件很有可能不会成功地到达客户端,监视事件是异步发送至监视者的,Zookeeper 本身提供了保序性(ordering guarantee):即客户端只有首先看到了监视事件后,才会感知到它所设置监视的 znode 发生了变化(a client will never see a change for which it has set a watch until it first sees the watch event). 网络延迟或者其他因素可能导致不同的客户端在不同的时刻感知某一监视事件,但是不同的客户端所看到的一切具有一致的顺序。

3:被设置 watch 的数据

这意味着 znode 节点本身具有不同的改变方式。

你也可以想象 Zookeeper 维护了两条监视链表:数据监视和子节点监视(data watches and child watches) getData() and exists() 设置数据监视,getChildren() 设置子节点监视。

ACL(Access control list)

为有效的保障zookeeper中数据的安全,从而避免误操作导致分布式系统运行异常.

ZooKeeper有一套完善的ACL权限控制机制来保证数据的安全

用权限模式(schema):授权对象(ID):权限(permission)来标识一条有效的ACL信息.

ZooKeeper支持以下权限:

•CREATE: 能创建子节点

•READ: 能获取节点数据及列出它的子节点

•WRITE: 能设置节点数据

•DELETE: 能删除子节点

•ADMIN: 能设置权限

CREATE和DELETE权限从写权限中分离出来,为的是获得更好的访问控制。运用CREATE和DELETE的场合如下:你想让A用户能够设置节点数据,但不允许创建或删除子节点。

一条ACL只针对一个znode,即它不适用于子节点.例如,如果/app只对ip:172.16.16.1可读,而/app/status对任何人可读,ACL不是递归的。

Zookeeper总概的更多相关文章

  1. Sprint 3 回顾与总结 和团队贡献分 以及Sprint 1、2、3 总概

    团队情况: 团队名称:Heaven Fire 团队博客地址:https://home.cnblogs.com/u/gjpg/                         团队Github地址:ht ...

  2. STL笔记之【map之总概】

    1.map和multimap内部数据结构: 红黑树(平衡二叉树的一种)2.在往map和multimap中插入元素时,会自动进行排序3.map和multimap的所有元素的key都被视为常数,其元素的实 ...

  3. Python爬取CSDN博客文章

    0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.win ...

  4. 查找树ADT——二叉搜索树

    在以下讨论中,虽然任意复杂的关键字都是允许的,但为了简单起见,假设它们都是整数,并且所有的关键字是互异的. 总概   使二叉树成为二叉查找树的性质是,对于树中的每个节点X,它的左子树中所有关键字值小于 ...

  5. atitit.事件驱动的总结attilax

    atitit.事件驱动的总结attilax Keyboard 基于的的ed 与  mouse 基础的ed Kb  base on focus ....   Mouse base on mouse mo ...

  6. Oracle RAC 并发与架构

    10g RAC进程总概 一. RAC 并发 RAC 的本质是一个数据库,运行在多台计算机上的数据库,它的主要任务是数据库就是事务处理,它通过 Distributed Lock Management(D ...

  7. github添加ssh认证

    总概:在使用git的时候,和目标仓库建立关系有两种方式https,ssh.一般用的是https认证(这样简单方便),但有个缺点,pull,push等操作需要频繁输入用户验证.虽然可以把用户验证账号密码 ...

  8. Hbase深入学习(一) 什么是hbase

    Hbase深入学习(一) 什么是hbase 一.hbase是什么?      首先hbase是一个在Hadoop的HDFS分布式存储系统上介于映射(key/value)的nosql的分布式数据库:它通 ...

  9. 【cocos2d-js公文】十七、事件分发机制

    简单介绍 游戏开发中一个非常重要的功能就是交互,假设没有与用户的交互.那么游戏将变成动画,而处理用户交互就须要使用事件监听器了. 总概: 事件监听器(cc.EventListener) 封装用户的事件 ...

随机推荐

  1. hdu 3948 后缀数组

    The Number of Palindromes Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (J ...

  2. Luogu1613 跑路

    题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的空间跑路器,每秒钟 ...

  3. 音频自动增益 与 静音检测 算法 附完整C代码

    前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用于评估一定长度音频的音量强度, 而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法. ...

  4. python flask 基础入门

    1. Flask 中的Hello World! 在使用pycharm创建一个Flask项目后,将会默认创建一个flask的app,这里来讲下每行代码表示的意义,代码入下 from flask impo ...

  5. 修改SQL数据库中表字段类型时,报“一个或多个对象访问此列”错误的解决方法

    在SQL数据库中使用SQL语句(格式:alter table [tablename] alter column [colname] [newDataType])修改某表的字段类型时,报一下错误:由于一 ...

  6. K-means聚类 的 Python 实现

    K-means聚类 的 Python 实现 K-means聚类是一个聚类算法用来将 n 个点分成 k 个集群. 算法有3步: 1.初始化– K 个初始质心会被随机生成 2.分配 – K 集群通过关联到 ...

  7. Java web 前端面试知识点总结

    经过几家大厂面试,目前成功拿到唯品会offer,分享一下我的面试知识点总结: 耦合性:也称块间联系.指软件系统结构中各模块间相互联系紧密程度的一种度量.模块之间联系越紧密,其耦合性就越强,模块的独立性 ...

  8. 解决nodejs中json序列化时Date类型为UTC格式

    在nodejs中,json序列化时Date类型时,默认转为UTC格式. 如下图 zhupengfei@DESKTOP-HJASOE3 MINGW64 /d/MyProject/exp2 $ node ...

  9. Redis从入门到精通:初级篇

    原文链接:http://www.cnblogs.com/xrq730/p/8890896.html,转载请注明出处,谢谢 Redis从入门到精通:初级篇 平时陆陆续续看了不少Redis的文章了,工作中 ...

  10. Uncaught (in promise) TypeError:的错误

    1.错误 创建一个vue实例,在data定义一些变量,如activityTime. 在methods里面用了axios发送请求. 在then的回调里使用this.activityTime 报错! 2. ...