Unlike a typical file system, which is designed for storage, ZooKeeper data is kept in-memory, which means ZooKeeper can achieve high throughput and low latency numbers.
与其他文件系统不同,zookeeper的数据存储于内存中,也就意味着zookper可以实现较高吞吐与低延时。
The ZooKeeper implementation puts a premium on high performance, highly available, strictly ordered access.
The servers that make up the ZooKeeper service must all know about each other. They maintain an in-memory image of state, along with a transaction logs and snapshots in a persistent store.
本文链接地址:http://quentinXXZ.iteye.com/blog/2117157
以下是对《Hadoop 权威指南》第二版 zookeeper一章的笔记:
Znode
Zookeeper 被设计用来实现协调服务(通常使用小数据文件),而不是用于大容量数据存储,一个znode能存储的数据被限制在1MB以内。
原子性:读取一个znode,要么读到全部数据,要么失败,不会只读到部份数据。
写操作不成功就失败,不会出现部份写的情况。
Znode路径必须是绝对路径。
Znode 分两种:短暂的和持久的,类型在创建后不可修改。创建短暂znode的客户端会话结束时,zookeeper会将短暂znode删除。持久znode不依赖于客户端,只有当客户端(不一定是创建者)明确删除时,才会删除。短暂znode不可以有子节点。
Sequal znode是指名称中包含zookeeper指定顺序号的znode。顺序号可以用于为所有的事件进行全局排序,这样客户端就可以通过顺序号来推断事件的顺序。
Zookeeper基本操作
Create、delete、exists、getACL、setACL、getChildren、getData、setData、sync更新操作是有条件的,delete/setACL时,必须提供,被更新znode的版本号(可通过exists获得)。
API
客户端语言:java和C。每种绑定,执行操作时,可选择同步或异步执行。
观察触发器
可以在读操作exists、getChilden、getData上设置观察(watcher)。
Exists被触发时机:znode创建、删除、数据更新
getChilden被触发时机:被观察znode子节点被创建或删除,该znode自己被删除。
getData被触发时机: 被观察znode被删除或数据更新。
ACL
三种身份验证机制:
1、 digest 用户名+密码 2、host 主机名 3、ip 客户端IP
exists 操作不受ACL 权限的限制。
OPEN_ACL_UNSAFE是一种预定义的ACL, 它将所有的权限(除ADMIN限制)授予每个人。
Zookeeper运行模式
1、 standalone mode,不能保证HA。
2、 replicated mode。组成集群,作为一个“集合体”(ensemble),通过复制实现高可用,只要集群中有半数以上的机器处于可用状诚,便可提供服务。 所以一个ensemble里面通常包奇数台机器。
Zookeeper所做的是,确保对znode树的每一个修改都会被复制到集合体中超过半数的机器上。如果少于半数,也至少有一台处于最新状态,其实副本最终也会被更新。
具体实现: Zab协议。
阶段1:leader选举
Ensemble中 选举出一个leader,其余为follower。一旦有半数以上(或指定数量)的follower与leader同步,则表明阶段已完成。
阶段2:原子广播(AB)
写请求都发给leader, 由leader将更新广播给follower。 半数以上的follwer将修改持久化后,leader才提交更新,客户端才会收到一个更新成功的响应。
一致性
每一个对znode树的更校报都被赋予了一个全局唯一的ID,称zxid(zookeeper transaction ID)。更新顺序严格按换zxid排列。
读操作不参与写操作的全局排序。客户端以Zookeeper服务器以处的机制进行通信,则可能靠成不一致。例如,客户端A将znode z的值修改,然后A告诉B去读取z值 ,B可能读到之前的值 ,这是 “跨客户端视图的同时一致性”。 为避免,B在取之前,要对z调用sync操作。
会话
空闲时间超过一定时间,客户端发ping,保持会话不过期,并检测服务器是否故障,使其能在会话超时的时间内重连到新的服务器。
客户端断开连接时,观察通知将无法发送,恢复连接后,这些延迟的通知会被发送。如果客户端重新连接至另一服务器过程中,应用程序试图执行一个操作,这个操作将会失败。
时间
Tick time 基本时间周期
Session timeout 范围 [2* tick Time , 20* tick Time]
服务器为每个会话分配一个唯一的ID和密码,如果在建立的过程中将它们传递给zookeeper,可以用于恢复一个会话(只要该会话没有过期)。
Zookeeper状态
1、Connecting 2、connected 3、closed
利用Zookeeper构建应用代码
1、 配置与获得最新配置
注意,在收到一次观察事件,发现znode有被修改,然后去进行一次读之间,znode可能在其间被更新过多,如果客户端在其间没有任何其他注册的话。
2、 可复原的zookeeper应用
InterruptedException异常,操作中断,不代表故障,而是操作被取消。
KeeperException:服务器发出错误信号或服务器存在通信。例如KeeperException.NoNodeException 不存在Node
一、状态异常: 例如版本号不匹配
二、可恢复异常: KeepException.ConnectionLossException。连接丢失,重连。需对幂等(idempotent)与非幂等(Nonidempotent)操作进行区分。幂等操作可重试。
三、不可恢复异常:会话已失效。 只能重连了。
3、锁服务
分布式锁在一组进程进程之间提供一种互斥机制。任何时间,只有一个进程可以持锁。分布式锁可以用于大型分布式系统中的实现领导的选举。
注意:不要将zookeeper自己的领导者选举和使用zookeeper基本操作的一般领导者选举服务混为一谈.
思路:一个znode作为锁 ,/leader; 为希望获得锁的客户端创建一些短暂顺序znode,作为znode的子节点。任何时间点内,顺序号最小的客户端将持有锁,例如,两个客户端,分别创建/leader/lock-1和/leader/lock-2,那创建/leader/lock-1的客户端便持有锁。删除/leader/lock-1即可释放锁;另外,如果客户端进程死亡,短暂znode自动被删除。通过创建一个znode删 除的watcher,可以在获得锁的时候得到通知。
问题1 : 羊群效应。大量的客户端,每个客户端都在锁znode上设置一个watcher,用于捕捉子节点的变化。每次锁被释放或另一个进程开始获取锁时,watcher都会被触发,并且每个客户端都会收到一个通知。羊群效应,指大量客户端收到同一事件的通知。这样会产生流量峰值,但是只有一个客户端需要处理该事件。
解决方法:只有在前一个顺序号子节点消失时,才需要通知下一个客户端。
问题2:不能处理因连接丢失而导致的create操作失败。创建一个顺序znode是非幂等操作,不能简间重试,重试会多出一个远法删掉的孤儿znode(除非客户端会话结束)。不幸的结果是将会出现死锁。
解决方法:znode名称中嵌入一个ID, 根据ID可以得知创建操作是否已成功。
不可恢复异常: 如果会话过期,短暂znode会自动删除,这个过程中,锁是不能预知应用程序需要如何清理自清的状态的。
Zookeeper带有一个java实现的生产级别的锁实现,WriteLock.
分布式数据结构和协议: 屏障(barrier)、队列、两阶段提交协议。
相关推荐
ZooKeeper 学习笔记 ZooKeeper 是一个开源的分布式协调服务,由 Hadoop 的创始人 Doug Cutting 等人开发。它为分布式应用提供了一个高效、可靠的协调机制,帮助开发者快速构建高可用、可扩展的分布式系统。 ...
【Zookeeper学习笔记】 Zookeeper是一个分布式协调服务,它的核心目标是简化分布式环境下的数据管理与系统协调。作为Apache Hadoop和HBase的重要组件,Zookeeper提供了简单的原语集,支持分布式应用程序之间的通信...
该项目为基于Java语言的Zookeeper学习笔记设计源码,总计包含20个文件,具体构成包括15个Java源文件、3个PNG图片文件以及1个Markdown文件。此外,项目还包含1个XML配置文件,适用于学习和实践Zookeeper相关知识。
Zookeeper是一种重要的分布式协调服务,尤其在处理高可用性、高性能的应用场景中。它最初设计的核心功能是提供分布式锁服务,但随着社区的发展,Zookeeper的功能得到了扩展,现在还用于配置维护、组服务、分布式消息...
### ZooKeeper概述 ZooKeeper,如同其名字所暗示的那样,扮演着“动物园管理员”的角色,主要负责管理和协调各种分布式应用程序(如Hadoop、Hive、Pig等)。它是一个开源的分布式协调服务框架,旨在帮助开发者解决...
本文适合但不限于软件开发人员阅读。本文档能够使阅读者对zookeeper有一个宏观且全面的了解,内容主要包含zookeeper架构、数据模型、读写及工作原理、典型应用场景、指令汇总等,
总的来说,尚硅谷2021年的ZooKeeper笔记提供了一套全面的学习资源,帮助开发者深入了解ZooKeeper的工作原理及其在分布式系统中的关键作用。通过深入学习和实践,可以提升在分布式协调领域的技术水平。
“zookeeper学习笔记.vsdx”可能是一个Visio图表,用于可视化Zookeeper的数据结构、工作流程或架构;而“zookeeper-trunk”可能是一个源码仓库,包含Zookeeper的源代码,适合深入理解其内部机制和进行二次开发。 ...
Zookeeper是Apache Hadoop项目下的一个子项目,它是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现。...通过深入学习和实践,可以更好地应对分布式环境中的各种挑战。
【Zookeeper概述】 Apache ZooKeeper 是一款开源的分布式协调服务,设计用于管理和简化分布式环境中的数据协调任务。它提供了一种简单、高可用且容错的机制,使得开发者可以专注于核心业务逻辑,而不是复杂的分布式...
### Zookeeper概述 Zookeeper是一种分布式协调服务框架,它的核心任务是为用户的分布式应用程序提供一系列的协调...无论是从其提供的服务还是从其内部的机制来看,Zookeeper都是值得深入学习和掌握的重要技术之一。
本篇笔记主要围绕这两个技术进行深入探讨,结合尚硅谷的视频教程资源,旨在帮助读者全面理解并掌握这两者的核心知识。 一、Zookeeper:分布式协调服务 Zookeeper是由Apache开发的一款开源分布式协调服务,它提供了...
【Zookeeper概述】 Zookeeper是Apache Hadoop的一个子项目,主要设计用于解决分布式环境中的数据管理问题,如统一命名服务、状态同步、集群管理和配置管理等。作为一个分布式服务框架,Zookeeper采用Java编写,同时...
《Zookeeper一站式学习资料》是一份全面覆盖Zookeeper基础到高级知识的学习资源包,旨在帮助初学者快速入门并深入理解Zookeeper。这份资料包含了丰富的文本资料、视频教程以及相关的实践代码,是学习分布式协调服务...
而“尚硅谷大数据技术之Zookeeper.xmind”思维导图,则是将整个Zookeeper的知识体系以图形化的形式展现出来,帮助学习者梳理知识点,形成全面的认知框架。 总的来说,这个教程提供了从理论到实践的全面学习材料,...
【描述】"dubbo+zookeeper入门资源,可直接使用,适合新手练习使用"意味着这个压缩包包含了学习和实践这两个技术的基础材料。通过这个资源,初学者可以了解如何配置和使用Dubbo与Zookeeper来实现服务间的通信和管理...
Zookeeper作为分布式协调服务,其设计初衷就是为了帮助分布式系统维护数据的一致性。Zookeeper的实现基于一种被称为Paxos的算法,Paxos算法是解决分布式系统中一致性问题的一种经典算法。 Paxos算法的核心思想是...