1.Watches通知是一次性的,必须重复注册. 2.同一个ZK客户端,反复对同一个ZK节点(znode)注册相同的watcher,是无效的,最终只会有一个生效。 3.发生CONNECTIONLOSS之后,只要在session_timeout之内再次连接上(即不发生SESSIONEXPIRED),那么这个连接注册的watches依然在。 4.客户端会话失效之后,所有这个会话中创建的Watcher都会被移除。 5.节点数据的版本变化会触发NodeDataChanged,注意,这里特意说明了是版本变化。存在这样的情况,只要成功执行了setData()方法,无论内容是否和之前一致,都会触发NodeDataChanged事件。 6.对某个节点注册了watcher,但是节点被删除了,那么注册在这个节点上的watcher都会被移除。
再说说几点个人认为比较重要的:
Client与ZooKeeper之间的通信,需要创建一个Session,这个Session会有一个超时时间。因为ZooKeeper集群会把Client的Session信息持久化,所以在Session没超时之前,Client与ZooKeeper Server的连接可以在各个ZooKeeper Server之间透明地移动。
在ZooKeeper集群中,读可以从任意一个ZooKeeper Server读,这一点是保证ZooKeeper比较好的读性能的关键;写的请求会先Forwarder到Leader,然后由Leader来通过ZooKeeper中的原子广播协议,将请求广播给所有的Follower,Leader收到一半以上的写成功的Ack后,就认为该写成功了,就会将该写进行持久化,并告诉客户端写成功了。(有点像Paxos的ZAB协议)
对于每个更新操作,ZK都会在确保事务日志已经落盘后,才会返回客户端响应。因此事务日志的输出性能在很大程度上影响ZK的整体吞吐性能。强烈建议是给事务日志的输出分配一个单独的磁盘。
zookeeper客户端对server的操作都是不可回退的,意思是说,zk的客户端每次和server进行通信的时候,会记住server上最新的zxid。如果某个时刻,客户端和server断开了连接,那么等到下次重新连接到集群中的机器上时,会检查当前连接上的那个server是否和client有相同的zxid,或者已经是更新的zxid了。一旦客户端发现server的zxid比自己小,那么客户端会断开和这个server的连接,并且重新连接集群中的其它server~
ephemeral节点是临时性的, 如果创建该节点的session结束了, 该节点就会被自动删除. ephemeral节点不能拥有子节点. 虽然ephemeral节点与创建它的session绑定, 但只要该该节点没有被删除, 其他session就可以读写该节点中关联的数据. 使用-e参数指定创建ephemeral节点.
如果想对ZK的简单原理有兴趣,可以参见这篇博客:
http://www.wuzesheng.com/?p=2609#more-2609
最后说一下ACL,ACL就是(Access Control)即控制访问znode的权限的。我查了一些资料,分享一下:
建议看原博客,向原博客作者致敬。
***************************************ACL***********************************
以下转自;http://www.wuzesheng.com/?p=2438
传统的文件系统中,ACL分为两个维度,一个是属组,一个是权限,子目录/文件默认继承父目录的ACL。而在Zookeeper中,node的ACL是没有继承关系的,是独立控制的。Zookeeper的ACL,可以从三个维度来理解:一是scheme; 二是user; 三是permission,通常表示为scheme:id:permissions, 下面从这三个方面分别来介绍:
(1)scheme: scheme对应于采用哪种方案来进行权限管理,zookeeper实现了一个pluggable的ACL方案,可以通过扩展scheme,来扩展ACL的机制。zookeeper-3.4.4缺省支持下面几种scheme:
world: 它下面只有一个id, 叫anyone, world:anyone代表任何人,zookeeper中对所有人有权限的结点就是属于world:anyone的
auth: 它不需要id, 只要是通过authentication的user都有权限(zookeeper支持通过kerberos来进行authencation, 也支持username/password形式的authentication)
digest: 它对应的id为username:BASE64(SHA1(password)),它需要先通过username:password形式的authentication
ip: 它对应的id为客户机的IP地址,设置的时候可以设置一个ip段,比如ip:192.168.1.0/16, 表示匹配前16个bit的IP段
super: 在这种scheme情况下,对应的id拥有超级权限,可以做任何事情(cdrwa)
另外,zookeeper-3.4.4的代码中还提供了对sasl的支持,不过缺省是没有开启的,需要配置才能启用,具体怎么配置在下文中介绍。
sasl: sasl的对应的id,是一个通过sasl authentication用户的id,zookeeper-3.4.4中的sasl authentication是通过kerberos来实现的,也就是说用户只有通过了kerberos认证,才能访问它有权限的node.
(2)id: id与scheme是紧密相关的,具体的情况在上面介绍scheme的过程都已介绍,这里不再赘述。
(3)permission: zookeeper目前支持下面一些权限:
CREATE(c): 创建权限,可以在在当前node下创建child node
DELETE(d): 删除权限,可以删除当前的node
READ(r): 读权限,可以获取当前node的数据,可以list当前node所有的child nodes
WRITE(w): 写权限,可以向当前node写数据
ADMIN(a): 管理权限,可以设置当前node的permission
如前所述,在zookeeper中提供了一种pluggable的ACL机制。具体来说就是每种scheme对应于一种ACL机制,可以通过扩展scheme来扩展ACL的机制。在具体的实现中,每种scheme对应一种AuthenticationProvider。每种AuthenticationProvider实现了当前机制下authentication的检查,通过了authentication的检查,然后再进行统一的permission检查,如此便实现了ACL。所有的AuthenticationProvider都注册在ProviderRegistry中,新扩展的AuthenticationProvider可以通过配置注册到ProviderRegistry中去。下面是实施检查的具体实现:
void checkACL(ZooKeeperServer zks, List<acl> acl, int perm, List<id> ids) throws KeeperException.NoAuthException { if (skipACL) { return; } if (acl == null || acl.size() == 0) { return; } for (Id authId : ids) { if (authId.getScheme().equals("super")) { return; } } for (ACL a : acl) { Id id = a.getId(); if ((a.getPerms() & perm) != 0) { if (id.getScheme().equals("world") && id.getId().equals("anyone")) { return; } AuthenticationProvider ap = ProviderRegistry.getProvider(id .getScheme()); if (ap != null) { for (Id authId : ids) { if (authId.getScheme().equals(id.getScheme()) && ap.matches(authId.getId(), id.getId())) { return; } } } } } throw new KeeperException.NoAuthException(); }
相关推荐
《Zookeeper学习资料 中篇》 Zookeeper,作为Apache Hadoop的一个子项目,是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作...
### Zookeeper 学习入门知识点 #### 一、Zookeeper 概述与核心价值 - **定义**: Zookeeper 是一个高度可靠的关键值存储系统,它主要用于解决分布式环境中的一致性问题,例如配置管理、命名服务、分布式同步以及...
1. 友好的用户界面:相比于命令行操作,图形化界面提供了更加直观的操作方式,减少了学习成本,使非专业技术人员也能轻松上手。 2. 实时监控:图形化界面可以实时展示Zookeeper集群的状态,包括节点信息、会话信息、...
#### 五、Zookeeper 配置文件详解 配置文件对于Zookeeper的正确运行至关重要,主要包括以下几个关键参数: - `tickTime`:定义了每个时间单位(tick)的毫秒数,默认为2000毫秒。 - `initLimit`:初始化连接阶段...
ZooKeeper集群通常由三个或五个节点组成,以确保高可用性和容错性。配置文件中需要指定集群中的所有节点地址,并通过选举算法确定领导者节点。每个节点都需要启动ZooKeeper服务,节点间通过 zab 协议进行通信和数据...
五、Zookeeper的运维与优化 1. 安全性:Zookeeper支持认证和授权,可以通过ACL(Access Control List)设置权限,保护数据安全。 2. 性能调优:包括调整数据存储路径、优化网络参数、合理设置session超时时间、...
在开始学习之前,读者需要具备良好的Java基础,因为Zookeeper服务器运行于Java虚拟机(JVM)之上,同时还需要对分布式处理和Linux环境有一定的了解。 #### 五、版权与免责声明 本教程版权归TutorialsPoint(I)Pvt.Ltd...
五、ZooKeeper的架构与复制原理 ZooKeeper采用Paxos算法的变种ZAB(ZooKeeper Atomic Broadcast)协议来保证数据的一致性和完整性。系统由多个服务器节点构成,形成一个集群,每个节点既是客户端的服务器,也是其他...
《深入剖析Zookeeper 3.4.8源码》 Zookeeper作为一个分布式协调服务,是Apache Hadoop项目的重要组成部分,广泛应用于...通过学习源码,开发者可以更好地利用Zookeeper解决实际问题,并为未来的系统设计提供灵感。
#### 五、Zookeeper 安装与配置 下面是 Zookeeper 的安装步骤: 1. **环境准备**:在三台虚拟机上分别安装 JDK,并上传 Zookeeper 安装包。 2. **解压缩**:使用命令 `tar -zxvf zookeeper-3.4.5.tar.gz` 解压...
《Zookeeper入门到精通》教学视频及文档涵盖了分布式协调...通过学习《Zookeeper入门到精通》的教学视频和文档,你将全面掌握Zookeeper的基础知识,并能灵活运用到实际的分布式系统开发和运维中,提升你的IT技能水平。
### Zookeeper 入门到精通 #### 一、Zookeeper 概述 ##### 1.1 什么是 ...通过本文档的学习,读者应该已经了解了 Zookeeper 的基本概念、核心特性和使用方法,这对于构建高效稳定的分布式系统是非常有帮助的。
因此,本书将基于该书籍的部分内容进行翻译和解读,旨在为读者提供一份详尽的Zookeeper学习指南。 ##### 概述 Zookeeper是一种用于协调分布式应用的软件框架。它的核心价值在于简化了开发者在构建分布式应用时面临...
通过以上步骤,我们可以理解到自动化安装脚本对于Zookeeper部署的重要性,同时,也学习了shell脚本的基础知识和Zookeeper的安装配置要点。在实际应用中,可以根据具体需求对脚本进行调整,以适应不同的环境和场景。
五、实战应用与学习资源 在实际项目中,Zookeeper被广泛应用于Hadoop、HBase、Kafka等大数据框架中,以实现分布式环境下的协调和管理。关于Zookeeper-3.3.6的深入学习,可以参考博客《Zookeeper详解》...
**Zookeeper:分布式协调服务详解** Zookeeper是一个高性能、分布式、...同时,对于Java开发者来说,学习如何在代码中使用Zookeeper的API是至关重要的,这将有助于你在实际项目中更好地利用Zookeeper解决分布式问题。
通过对Zookeeper的学习和掌握,可以更好地理解其在Hadoop生态系统中的应用,同时也能为解决实际项目中的问题提供有效的解决方案。无论是对于开发人员还是运维人员来说,掌握Zookeeper都是非常有价值的。希望通过对...
**五、Zookeeper的相关组件** 1. **Kafka**:分布式消息系统,使用Zookeeper进行集群协调,保证主题分区的分配和选举。 2. **HBase**:分布式列式数据库,利用Zookeeper进行区域服务器的发现和故障恢复。 3. **...
在`/tmp/zookeeper`目录下创建五个文件夹,分别为`server001`至`server005`。然后,在每个文件夹中再创建两个子文件夹:`data`和`logs`。 4. **配置文件修改**:Zookeeper的主要配置文件位于`conf`目录下,主要包括...