【ZooKeeper Notes 28】ZooKeeper典型应用场景一览
Zookeeper原理及应用
![Zookeeper原理及应用](https://img.taocdn.com/s3/m/f5980e5503d8ce2f0066236d.png)
一:名称Zookeeper -- 分布式服务框架二:描述分布式协调服务框架是Apache Hadoop 的一个子项目是一个针对分布式应用的可靠协调系统。
可以解决分布式环境中经常遇到的一些数据管理问题:如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理提供分布式环境中的管理数据服务和协调数据服务实例:动物园管理员职责管理动物和协调游客去哪观看动物,(做一些动物标识,引导游客)三:Zookeeper结构1:文件系统2:通知机制Zookeeper服务端watch watch watch watch客户端Zookeeper 的客户端和服务器通信采用长连接方式,客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,每个客户端和服务器通过心跳来保持连接,zookeeper会通知客户端。
3:总结存储数据watch watch watch watch watch watch watch watch watch注:Zoopkeeper 提供了一套很好的分布式集群管理的机制,从而可以设计出多种多样的分布式的数据管理模型,而不仅仅局限于下面提到的几个常用应用场景。
四:Zookeeper应用场景1:配置数据的管理场景描述:数据发布与订阅模型(配置中心)发布者将数据发布到某节点上,供订阅者动态获取数据实现:应用配置集中到节点上,应用启动时主动获取,并在节点上注册一个watcher,每次配置更新都会通知到应用,达到获取最新配置信息的目的。
好处:实现配置信息的集中式管理和动态更新,实时同步。
注:在上面提到的应用场景中,有个默认前提是:数据量很小,但是数据更新可能会比较快的场景。
例:资源平台数据字典电销CRM行业CRM渠道CRM全局配制2:软负载均衡场景描述:随着业务量的提高,访问量和数据流量的快速增长,其处理能力和计算强度也相应地增大,使得单一的服务根本无法承担。
将负载(工作任务)进行平衡、分摊到多个操作单元上进行执行,在分布式环境中,为了保证高可用性,通常同一个应用或同一个服务的提供方都会部署多份,达到对等服务。
zookeeper应用场景以及实现原理
![zookeeper应用场景以及实现原理](https://img.taocdn.com/s3/m/a3f7da18814d2b160b4e767f5acfa1c7ab008276.png)
Zookeeper是一个分布式的、开源的协调服务,主要用于分布式系统中的数据管理与协调,典型的应用场景包括配置信息维护、命名服务、分布式同步以及组服务等。
在分布式系统应用中,Zookeeper被广泛应用,主流的大数据组件如HDFS、HBase、Kafka等也依靠Zookeeper 做协调服务。
其具体的应用场景包括:
1. 发布订阅(配置中心):可用于动态配置信息的发布和订阅。
2. 注册中心:服务可以向Zookeeper注册自己的信息,同时可以从Zookeeper获取其他服务的信息。
3. 分布式锁:可帮助分布式系统解决并发问题。
4. Master选举:在分布式系统中,有时需要选举出一个Master进行统一调度,在这个过程中Zookeeper可以提供帮助。
5. 分布式队列:实现多个服务器之间的协同工作。
6. 分布式ID生成:在分布式系统中,生成唯一ID是一项重要任务,Zookeeper可以提供此类服务。
Zookeeper的实现原理主要包括以下几个方面:
1. 集群架构:Zookeeper运行于一个由多个服务器组成的集群之中。
2. ZNode数据模型:Zookeeper中的所有数据都存储在节点(ZNode)上,并且每个节点都可以存储数据、元数据和ACL(访问控制列表)。
3. Watcher监听机制:Zookeeper允许用户在指定节点上设置监听器,当该节点发生变化时,Zookeeper将通知所有已设置的监听器。
4. 一致性协议之ZAB:ZAB是Zookeeper的一种原子广播协议,用于确保在分布式环境中数据的一致性。
28道ZooKeeper面试题
![28道ZooKeeper面试题](https://img.taocdn.com/s3/m/7cbe48276d85ec3a87c24028915f804d2b1687eb.png)
目录1.ZooKeeper 是什么? (2)2.ZooKeeper 提供了什么? (2)3.Zookeeper 文件系统 (2)4.ZAB 协议? (2)5.四种类型的数据节点Znode (3)6.Zookeeper Watcher 机制-- 数据变更通知 (3)7.客户端注册Watcher 实现 (4)8.服务端处理Watcher 实现 (4)9.客户端回调Watcher (5)10.ACL 权限控制机制 (5)11.Chroot 特性 (5)12.会话管理 (6)13.服务器角色 (6)14.Zookeeper 下Server 工作状态 (6)15.数据同步 (7)16.zookeeper 是如何保证事务的顺序一致性的? (7)17.分布式集群中为什么会有Master? (8)18.zk 节点宕机如何处理? (8)19.zookeeper 负载均衡和nginx 负载均衡区别 (8)20.Zookeeper 有哪几种几种部署模式? (8)21.集群最少要几台机器,集群规则是怎样的? (8)22.集群支持动态添加机器吗? (8)23.Zookeeper 对节点的watch 监听通知是永久的吗?为什么不是永久的? (9)24.Zookeeper 的java 客户端都有哪些? (9)25.chubby 是什么,和zookeeper 比你怎么看? (9)26.说几个zookeeper 常用的命令。
(9)27.ZAB 和Paxos 算法的联系与区别? (9)28.Zookeeper 的典型应用场景 (10)1.ZooKeeper 是什么?ZooKeeper 是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。
最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
分布式应用程序可以基于Zookeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
请阐述zookeeper的应用场合
![请阐述zookeeper的应用场合](https://img.taocdn.com/s3/m/d087edc6d5d8d15abe23482fb4daa58da0111c9a.png)
请阐述zookeeper的应用场合ZooKeeper 是一个开源的分布式协调服务框架,主要用于解决分布式应用中一致性、可靠性和可伸缩性等问题。
它提供了一种简单而高效的方式来管理分布式应用程序中的数据、状态和配置信息。
以下是 ZooKeeper 的一些常见应用场合:1. 分布式锁:在分布式系统中,多个进程可能需要竞争访问共享资源。
ZooKeeper 可以通过创建临时节点来实现分布式锁,确保只有一个进程能够获得锁并访问共享资源。
2. 服务注册与发现:在微服务架构中,服务可以动态地注册到 ZooKeeper 节点上,并通过节点信息来发现其他服务。
这有助于实现服务的自动发现和负载均衡。
3. 配置管理:ZooKeeper 可以用于存储和管理应用程序的配置信息,如配置文件、参数等。
通过监听 ZooKeeper 节点的变化,应用程序可以及时获取最新的配置。
4. 命名服务:ZooKeeper 可以提供全局唯一的名称服务,用于给分布式系统中的资源或服务分配唯一的标识符。
5. 分布式队列:ZooKeeper 可以用于实现简单的分布式队列。
通过创建顺序节点,可以模拟队列的行为,实现任务的排队和处理。
6. leader 选举:在分布式系统中,需要选举一个主节点来负责协调和管理其他节点。
ZooKeeper 可以通过创建临时顺序节点来实现 leader 选举。
7. 数据发布/订阅:ZooKeeper 支持数据的发布/订阅模型。
客户端可以订阅感兴趣的数据节点,当数据发生变化时,ZooKeeper 会通知订阅者。
总之,ZooKeeper 在分布式系统中扮演着重要的角色,可以用于实现各种分布式协调任务,提高系统的可靠性、一致性和可伸缩性。
Zookeeper最典型的应用场景(理论+实战)
![Zookeeper最典型的应用场景(理论+实战)](https://img.taocdn.com/s3/m/9980f51c6d85ec3a87c24028915f804d2b168792.png)
Zookeeper最典型的应⽤场景(理论+实战)1.前⾔之前⾃⼰写了⼀些关于Zookeeper的基础知识,Zookeeper作为⼀种协调分布式应⽤⾼性能的调度服务,实际的应⽤场景也⾮常的⼴泛,这⾥主要通过⼏个例⼦来具体的说明Zookeeper在特定场景下的使⽤⽅式(下⾯的这些功能估计consul和etcd也能实现,以后学到了再说吧)。
2.具体应⽤2.1.⼀致性配置管理我们在开发的时候,有时候需要获取⼀些公共的配置,⽐如数据库连接信息等,并且偶然可能需要更新配置。
如果我们的服务器有N多台的话,那修改起来会特别的⿇烦,并且还需要重新启动。
这⾥Zookeeper就可以很⽅便的实现类似的功能。
2.1.1.思路将公共的配置存放在Zookeeper的节点中应⽤程序可以连接到Zookeeper中并对Zookeeper中配置节点进⾏读取或者修改(对于写操作可以进⾏权限验证设置),下⾯是具体的流程图:2.1.2.事例数据库配置信息⼀致性的维护配置类:public class CommonConfig implements Serializable{// 数据库连接配置private String dbUrl;private String username;private String password;private String driverClass;public CommonConfig() {}public CommonConfig(String dbUrl, String username, String password, String driverClass) {super();this.dbUrl = dbUrl;ername = username;this.password = password;this.driverClass = driverClass;}public String getDbUrl() {return dbUrl;}public void setDbUrl(String dbUrl) {this.dbUrl = dbUrl;}public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getDriverClass() {return driverClass;}public void setDriverClass(String driverClass) {this.driverClass = driverClass;}@Overridepublic String toString() {return "CommonConfig:{dbUrl:" + this.dbUrl +", username:" + ername +", password:" + this.password +", driverClass:" + this.driverClass + "}";}}配置管理中⼼获取本地配置信息修改配置,并同步同步配置信息到Zookeeper服务器public class ZkConfigMng {private String nodePath = "/commConfig";private CommonConfig commonConfig;private ZkClient zkClient;public CommonConfig initConfig(CommonConfig commonConfig) {if(commonConfig == null) {monConfig = new CommonConfig("jdbc:mysql://127.0.0.1:3306/mydata?useUnicode=true&characterEncoding=utf-8", "root", "root", "com.mysql.jdbc.Driver");} else {monConfig = commonConfig;}return monConfig;}/*** 更新配置** @param commonConfig* @return*/public CommonConfig update(CommonConfig commonConfig) {if(commonConfig != null) {monConfig = commonConfig;}syncConfigToZookeeper();return monConfig;}public void syncConfigToZookeeper() {if(zkClient == null) {zkClient = new ZkClient("127.0.0.1:2181");}if(!zkClient.exists(nodePath)) {zkClient.createPersistent(nodePath);}zkClient.writeData(nodePath, commonConfig);}}以上是提供者,下⾯我们需要⼀个客户端获取这些配置public class ZkConfigClient implements Runnable {private String nodePath = "/commConfig";private CommonConfig commonConfig;@Overridepublic void run() {ZkClient zkClient = new ZkClient(new ZkConnection("127.0.0.1:2181", 5000));while (!zkClient.exists(nodePath)) {System.out.println("配置节点不存在!");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}// 获取节点commonConfig = (CommonConfig)zkClient.readData(nodePath);System.out.println(commonConfig.toString());zkClient.subscribeDataChanges(nodePath, new IZkDataListener() {@Overridepublic void handleDataDeleted(String dataPath) throws Exception {if(dataPath.equals(nodePath)) {System.out.println("节点:" + dataPath + "被删除了!");}}@Overridepublic void handleDataChange(String dataPath, Object data) throws Exception {if(dataPath.equals(nodePath)) {System.out.println("节点:" + dataPath + ", 数据:" + data + " - 更新");commonConfig = (CommonConfig) data;}}});}}下⾯启动Main函数配置管理服务启动public static void main(String[] args) throws InterruptedException {SpringApplication.run(ZookeeperApiDemoApplication.class, args);ZkConfigMng zkConfigMng = new ZkConfigMng();zkConfigMng.initConfig(null);zkConfigMng.syncConfigToZookeeper();TimeUnit.SECONDS.sleep(10);// 修改值zkConfigMng.update(new CommonConfig("jdbc:mysql://192.168.1.122:3306/mydata?useUnicode=true&characterEncoding=utf-8","root", "wxh", "com.mysql.jdbc.Driver"));}}客户端启动:public static void main(String[] args) throws InterruptedException {SpringApplication.run(ZookeeperApiDemoApplication.class, args);ExecutorService executorService = Executors.newFixedThreadPool(3);// 模拟多个客户端获取配置executorService.submit(new ZkConfigClient());executorService.submit(new ZkConfigClient());executorService.submit(new ZkConfigClient());}}2.2.分布式锁在我们⽇常的开发中,如果是单个进程中对共享资源的访问,我们只需要⽤synchronized或者lock就能实现互斥操作。
5、ZooKeeper 典型的应用场景详解
![5、ZooKeeper 典型的应用场景详解](https://img.taocdn.com/s3/m/d7a7e1f95ef7ba0d4a733b4f.png)
ZooKeeper 典型的应用场景Zookeeper 从设计模式角度来看,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在 Zookeeper 上注册的那些观察者做出相应的反应,从而实现集群中类似 Master/Slave 管理模式,关于Zookeeper 的详细架构等内部细节可以阅读 Zookeeper 的源码下面详细介绍这些典型的应用场景,也就是 Zookeeper 到底能帮我们解决那些问题?下面将给出答案。
统一命名服务(Name Service)分布式应用中,通常需要有一套完整的命名规则,既能够产生唯一的名称又便于人识别和记住,通常情况下用树形的名称结构是一个理想的选择,树形的名称结构是一个有层次的目录结构,既对人友好又不会重复。
说到这里你可能想到了 JNDI,没错 Zookeeper 的 Name Service 与 JNDI 能够完成的功能是差不多的,它们都是将有层次的目录结构关联到一定资源上,但是 Zookeeper 的 Name Service 更加是广泛意义上的关联,也许你并不需要将名称关联到特定资源上,你可能只需要一个不会重复名称,就像数据库中产生一个唯一的数字主键一样。
Name Service 已经是 Zookeeper 内置的功能,你只要调用 Zookeeper 的 API 就能实现。
如调用 create 接口就可以很容易创建一个目录节点。
配置管理(Configuration Management)配置的管理在分布式应用环境中很常见,例如同一个应用系统需要多台 PC Server 运行,但是它们运行的应用系统的某些配置项是相同的,如果要修改这些相同的配置项,那么就必须同时修改每台运行这个应用系统的 PC Server,这样非常麻烦而且容易出错。
像这样的配置信息完全可以交给 Zookeeper 来管理,将配置信息保存在Zookeeper 的某个目录节点中,然后将所有需要修改的应用机器监控配置信息的状态,一旦配置信息发生变化,每台应用机器就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中。
zookeeper 使用场景
![zookeeper 使用场景](https://img.taocdn.com/s3/m/0a438a1c3868011ca300a6c30c2259010202f3f0.png)
zookeeper 使用场景
Zookeeper 是一个针对分布式应用程序的开源协调服务。
它提供了分布式应用程序的协作服务,包括配置维护、命名服务、分布式同步和分布式锁等功能。
Zookeeper 主要用于:
1. 分布式的配置管理,例如,多个节点需要共享配置文件时,可以使用 Zookeeper 实现配置文件的管理和更新,保证多个节点共享一份数据,并可快速更新和同步。
2. 命名服务,例如,多个节点需要根据名称访问同一资源时,可以使用 Zookeeper 实现统一的命名服务,使得每个节点都能够使用相同的名称访问该资源。
3. 分布式同步,例如,多个节点需要实现数据更新同步时,可以使用 Zookeeper 实现分布式的同步控制,以保证节点间数据的一致性。
4. 分布式锁,例如,多个节点需要对同一资源进行加锁时,可以使用 Zookeeper 实现分布式的锁控制,以保证节点之间对该资源的访问不会产生冲突。
综上所述,Zookeeper 可以帮助开发人员轻松实现分布式应用程序的一些关键功能,例如配置管理、同步和锁定等,从而提升应用程序的可靠性和可扩展性。
Zookeeper的应用场景
![Zookeeper的应用场景](https://img.taocdn.com/s3/m/ef78ec092379168884868762caaedd3383c4b5e3.png)
Zookeeper的应用场景Zookeeper是一个高可用的分布式数据管理和协调框架,并且能够很好的保证分布式环境中数据的一致性。
在越来越多的分布式系统(Hadoop、HBase、Kafka)中,Zookeeper都作为核心组件使用。
1.数据发布/订阅数据发布/订阅系统,即配置中心。
需要发布者将数据发布到Zookeeper的节点上,供订阅者进行数据订阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和数据的动态更新。
发布/订阅一般有两种设计模式:推模式和拉模式,服务端主动将数据更新发送给所有订阅的客户端称为推模式;客户端主动请求获取最新数据称为拉模式,Zookeeper采用了推拉相结合的模式,客户端向服务端注册自己需要关注的节点,一旦该节点数据发生变更,那么服务端就会向相应的客户端推送Watcher事件通知,客户端接收到此通知后,主动到服务端获取最新的数据。
若将配置信息存放到Zookeeper上进行集中管理,在通常情况下,应用在启动时会主动到Zookeeper服务端上进行一次配置信息的获取,同时,在指定节点上注册一个Watcher监听,这样在配置信息发生变更,服务端都会实时通知所有订阅的客户端,从而达到实时获取最新配置的目的。
2.负载均衡负载均衡是一种相当常见的计算机网络技术,用来对多个计算机、网络连接、CPU、磁盘驱动或其他资源进行分配负载,以达到优化资源使用、最大化吞吐率、最小化响应时间和避免过载的目的。
使用Zookeeper实现动态DNS服务域名配置:首先在Zookeeper上创建一个节点来进行域名配置,如DDNS/app1/server.app1。
域名解析:应用首先从域名节点中获取IP地址和端口的配置,进行自行解析。
同时,应用程序还会在域名节点上注册一个数据变更Watcher监听,以便及时收到域名变更的通知。
域名变更:若发生IP或端口号变更,此时需要进行域名变更操作,此时,只需要对指定的域名节点进行更新操作,Zookeeper就会向订阅的客户端发送这个事件通知,客户端之后就再次进行域名配置的获取。
ZooKeeper的三种典型应用场景
![ZooKeeper的三种典型应用场景](https://img.taocdn.com/s3/m/43ae8cf0760bf78a6529647d27284b73f24236c7.png)
ZooKeeper的三种典型应⽤场景引⾔ ZooKeeper是中典型的pub/sub模式的分布式数据管理与协调框架,开发⼈员可以使⽤它进⾏分布式数据的发布与订阅。
另外,其丰富的数据节点类型可以交叉使⽤,配合Watcher事件通知机制,可以应⽤于分布式都会涉及的⼀些核⼼功能:数据发布/订阅、Master选举、命名服务、分布式协调/通知、集群管理、分布式锁、分布式队列等。
本博⽂主要介绍:发布/订阅、分布式锁、Master选举三种最常⽤的场景 本⽂中的代码⽰例均是由Curator客户端编写的,已经对ZooKeeper原⽣API做好很多封装。
参考资料《从Paxos到Zookeeper 分布式⼀致性原理与实践》(有需要电⼦PDF的朋友,可以评论私信我)⼀、数据发布/订阅1、基本概念(1)数据发布/订阅系统即所谓的配置中⼼,也就是发布者将数据发布到ZooKeeper的⼀个节点或者⼀系列节点上,提供订阅者进⾏数据订阅,从⽽实现动态更新数据的⽬的,实现配置信息的集中式管理和数据的动态更新。
ZooKeeper采⽤的是推拉相结合的⽅式:客户端向服务器注册⾃⼰需要关注的节点,⼀旦该节点的数据发⽣改变,那么服务端就会向相应的客户端发送Wacher事件通知,客户端接收到消息通知后,需要主动到服务端获取最新的数据。
(2)实际系统开发过程中:我们可以将初始化配置信息放到节点上集中管理,应⽤在启动时都会主动到ZooKeeper服务端进⾏⼀次配置读取,同时在指定节点注册Watcher监听,主要配置信息⼀旦变更,订阅者就可以获取读取最新的配置信息。
通常系统中需要使⽤⼀些通⽤的配置信息,⽐如机器列表信息、运⾏时的开关配置、数据库配置信息等全局配置信息,这些都会有以下3点特性: 1) 数据量通常⽐较⼩(通常是⼀些配置⽂件) 2) 数据内容在运⾏时会经常发⽣动态变化(⽐如数据库的临时切换等) 3) 集群中各机器共享,配置⼀致(⽐如数据库配置共享)。
zookeeper的原理和应用场景
![zookeeper的原理和应用场景](https://img.taocdn.com/s3/m/be8e944cdf80d4d8d15abe23482fb4daa48d1d7d.png)
zookeeper的原理和应用场景ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services within distributed systems. It's essentially a coordination service for distributed systems that helps in managing and coordinating various tasks among multiple nodes.The principle of ZooKeeper revolves around the concept of a hierarchical namespace known as the Znode hierarchy, where each znode can act as a data node or a directory node. ZooKeeper provides APIs to create, update, delete, and retrieve data from these znodes. Here are some key principles:1.Hierarchical Namespace: ZooKeeper organizes data in ahierarchical namespace similar to a file system. Each znode in the hierarchy can store data and have child znodes.2.Watchers: ZooKeeper allows clients to set a watch on aznode. Clients will be notified when there's a change in the dataassociated with the watched znode, enabling them to react tochanges dynamically.3.Consistency: ZooKeeper provides strong consistencyguarantees. Once a change is made to a znode, it is propagatedto all the nodes in the cluster in a deterministic order.4.Sequential Consistency: ZooKeeper provides sequentialconsistency for updates. This means that updates from a client are applied in the order they were received.5.Atomicity: Updates to ZooKeeper are atomic, meaning they either succeed entirely or fail entirely.Application scenarios for ZooKeeper include:1.Configuration Management: ZooKeeper can be used to store configuration information for distributed applications. Clients can watch for changes in configuration data and update their behavior accordingly.2.Service Discovery: In distributed systems, services need to discover each other dynamically. ZooKeeper can be used to register and discover services within a cluster.3.Leader Election: ZooKeeper can be used to implement leader election algorithms in distributed systems, ensuring that only one node acts as the leader at any given time.4.Distributed Locks: ZooKeeper provides primitives like locks and barriers that can be used to implement distributed synchronization mechanisms.5.Group Membership: ZooKeeper can be used to manage group membership in distributed systems, allowing nodes to join or leave a group dynamically.Now, here's the analysis in Chinese:ZooKeeper是一种集中式服务,用于在分布式系统中维护配置信息、命名、提供分布式同步以及提供群组服务。
zookeeper使用场景及示例
![zookeeper使用场景及示例](https://img.taocdn.com/s3/m/6036c318182e453610661ed9ad51f01dc281571a.png)
zookeeper使用场景及示例
Zookeeper是一个分布式应用程序协调服务,它提供高效、可
靠的数据注册和协调功能。
以下是几个Zookeeper使用场景的
示例:
1. 分布式锁管理:Zookeeper可以用于实现分布式锁,确保在
分布式环境中只有一个进程可以访问共享资源。
2. 配置管理:Zookeeper可以用于动态管理分布式系统的配置,当配置发生变化时,它可以及时通知到所有的客户端。
3. 分布式协调:Zookeeper可以用于实现分布式协调任务,如
选举主节点、分发任务等。
4. 分布式命名服务:Zookeeper可以用于实现分布式环境下的
命名服务,通过将节点添加到Zookeeper的树状结构中来实现
节点的命名与发现。
5. 高可用性集群管理:Zookeeper可以用于管理分布式系统的
集群节点,监控节点的状态并及时处理故障。
一个示例是使用Zookeeper实现分布式锁管理:多个进程尝试
获取同一个资源上的锁时,先向Zookeeper获取一个唯一的临
时顺序节点,然后检查自己是否是最小的节点,如果是,则获取到锁,否则等待。
当进程释放锁时,Zookeeper会删除相应
的节点,通知下一个排队等待的进程获取锁。
另一个示例是使用Zookeeper实现分布式协调任务:多个进程需要协调完成一个任务,每个进程都在Zookeeper上创建一个临时节点,当任务分配完毕后,只有拥有对应节点的进程才能继续执行任务,其他进程可以监控节点的变化,一旦发现自己成为了被分配到任务的进程之一,就开始执行任务。
zookeeper的作用,使用场景
![zookeeper的作用,使用场景](https://img.taocdn.com/s3/m/518d027386c24028915f804d2b160b4e767f8103.png)
Zookeeper是一个分布式协调服务,主要用于维护和管理共享数据,并提供了一些基础服务,如配置管理、同步协调、通知、路由和分布式标注等。
以下是Zookeeper的一些作用和主要使用场景:作用:1. 配置管理:Zookeeper可以集中管理服务器的配置信息,使得各个服务都能够快速获取到配置信息,并且变更配置时能够实时同步到所有服务。
2. 同步协调:Zookeeper可以用于实现分布式系统中不同组件之间的同步协调。
例如,多个服务可能需要根据一定的规则来更新数据,Zookeeper可以保证这些服务之间的数据一致性。
3. 命名服务:Zookeeper提供了一种统一的命名方式,可以用来查找、注册和删除对象,例如服务地址、端口、节点等。
4. 集群管理:Zookeeper可以用于管理分布式系统的集群,例如监控集群状态、协调负载均衡策略等。
5. 消息通知:Zookeeper可以用于实现消息通知机制,当某个事件发生时,可以通过Zookeeper将消息通知到相关人员。
6. 分布式锁:Zookeeper可以通过临时节点实现分布式锁,用于限制对共享资源的访问。
7. 选举和一致性:在分布式系统中,通过Zookeeper可以实现一致性选举,使得系统中的各个节点能够选出一个领导者,同时也能保证各个节点之间的数据一致性。
使用场景:1. 分布式系统中的配置管理:在分布式系统中,各个服务器的配置信息需要集中管理和同步。
Zookeeper可以提供集中式的配置管理功能,使得各个服务都能够快速获取到配置信息。
2. 分布式系统中的同步协调:在分布式系统中,不同组件之间的数据可能需要保持一致性。
Zookeeper可以提供同步协调功能,保证不同组件之间的数据一致性。
3. 分布式系统中的命名服务:在分布式系统中,需要使用统一的命名方式来查找、注册和删除对象。
Zookeeper提供了一种统一的命名方式,可以用于分布式系统的命名服务。
4. 分布式系统中的集群管理:在分布式系统中,需要监控集群状态、协调负载均衡策略等。
ZooKeeper典型使用场景一览
![ZooKeeper典型使用场景一览](https://img.taocdn.com/s3/m/b2f6fb4be518964bcf847c1e.png)
场景类别 典型场景描述( ZK 特性,使用方法)
应用中的具体使用
1. 索引信息和集群中机器节点 状态存放在 zk 的一些指定节点, 供各个客户端订阅使用。2. 系
统日志(经过处理后的)存储, 这些日志通常 2-3 天后被清除。 3. 应用中用到的一些配置信息 集中管理,在应用启动的时候 主动来获取一次,并且在节点 上注册一个 Watcher,以后每 次配置有更新,实时通知到应 用,获取最新配置信息。 发布与订阅即所谓的配置管理,顾名思义就是将数据发布到 数据发布 zk 节点上,供订阅者动态获取数据,实现配置信息的集中式 4. 业务逻辑中需要用到的一些 与订阅 管理和动态更新。例如全局的配置信息,地址列表等就非常 全局变量,比如一些消息中间 适合使用。 件的消息队列通常有个 offset,这个 offset 存放在 zk 上,这样集群中每个发送者都 能知道当前的发送进度。
类似于任务分发系统,子任务 启动后,到 zk 来注册一个临时 节点,并且定时将自己的进度 进行汇报(将进度写回这个临 时节点),这样任务管理者就 能够实时知道任务进度。 总之,使用 zookeeper 来进 行分布式通知和协调能够大大 降低系统之间的耦合。 分布式锁,这个主要得益于 ZooKeeper 为我们保证了数据 的强一致性,即用户只要完全相信每时每刻,zk 集群中任意 节点(一个 zk server)上的相同 znode 的数据是一定是相 同的。锁服务可以分为两类,一个是保持独占,另一个是 控制时序。 所谓保持独占,就是所有试图来获取这个锁的客户端,最终 只有一个可以成功获得这把锁。通常的做法是把 zk 上的一个 znode 看作是一把锁,通过 create znode 的方式来实现。 所有客户端都去创建 /distribute_lock 节点,最终成功创 建的那个客户端也即拥有了这把锁。 控制时序,就是所有视图来获取这个锁的客户端,最终都是 会被安排执行,只是有个全局时序了。做法和上面基本类似, 只是这里 /distribute_lock 已经预先存在,客户端在它下 面创建临时有序节点(这个可以通过节点的属性控制: CreateMode.EPHEMERAL_SEQUENTIAL 来指定)。 Zk 的父节点(/distribute_lock)维持一份 sequence,保 证子节点创建的时序性,从而也形成了每个客户端的全局时 序。 集群管理 1. 集群机器监控:这通常用于那种对集群中机器状态,机器 在线率有较高要求的场景,能够快速对集群中机器变化作出 响应。这样的场景中,往往有一个监控系统,实时检测集群 机器是否存活。过去的做法通常是:监控系统通过某种手段 (比如 ping)定时检测每个机器,或者每个机器自己定时向 监控系统汇报“我还活着”。 这种做法可行,但是存在两个比 较明显的问题:1. 集群中机器有变动的时候,牵连修改的东 西比较多。2. 有一定的延时。 利用 ZooKeeper 有两个特性,就可以实时另一种集群机器 存活性监控系统:a. 客户端在节点 x 上注册一个 Watcher,那么如果 x 的子节点变化了,会通知该客户端。 b. 创建 EPHEMERAL 类型的节点,一旦客户端和服务器 的会话结束或过期,那么该节点就会消失。 例如,监控系统在 /clusterServers 节点上注册一个 Watcher,以后每动态加机器,那么就往 /clusterServers 下创建一个 EPHEMERAL 类型的节点: /clusterServers/{hostname}. 这样,监控系统就能够实 时知道机器的增减情况,至于后续处理就是监控系统的业务 了。 2. Master 选举则是 zookeeper 中最为经典的使用场
zookeeper应用案例
![zookeeper应用案例](https://img.taocdn.com/s3/m/6d0f1a50dcccda38376baf1ffc4ffe473368fd0d.png)
zookeeper应用案例随着互联网和信息技术的发展,大数据、人工智能等新兴技术的应用越来越广泛。
在这一背景下,Zookeeper作为一种分布式协调服务框架,也得到了越来越多的应用。
Zookeeper可以用于应用场景非常丰富,比如分布式应用程序的协调、配置管理、命名服务、分布式锁等等。
下面我们来看看一些有关Zookeeper应用案例。
1. Hadoop生态系统Hadoop是一个非常著名的分布式计算框架,它的生态系统中包含了许多其他的组件,比如Hive、Pig、HBase等等。
这些组件都涉及到分布式协调,而Zookeeper则成为了它们之间的协调者。
具体来说,Zookeeper用于维护Hadoop集群的状态信息,以及各个组件之间的通信和任务分配。
2. 分布式锁分布式锁是在分布式环境下协调进程/线程之间的访问操作的一种技术。
Zookeeper作为一种可靠的分布式协调框架,可以用于实现分布式锁。
在分布式锁的实现中,Zookeeper将会用于协调锁的获取和释放、以及防止死锁等问题。
3. 命名服务命名服务是指提供一种机制来维护服务名称和网络地址之间的映射关系。
在分布式系统中,命名服务是非常重要的,因为它可以帮助客户端发现和访问服务。
Zookeeper可以作为一种分布式命名服务框架,用于维护服务名称和网络地址之间的映射关系。
4. 分布式配置管理分布式系统中,配置管理是非常重要的。
在一个大规模的系统中,配置可能会有很多,而且需要经常修改。
这时候,我们需要一个分布式配置管理系统来协调各个节点的配置信息。
Zookeeper提供的Watch机制可以帮助我们在配置发生变化时及时通知所有节点进行更新。
5. 分布式协调分布式协调是指在分布式系统中,协调各个节点之间的通信和任务分配。
Zookeeper可以作为一种分布式协调框架,用于实现分布式协调。
在分布式协调的实现中,Zookeeper将会用于实现领导选举、分布式队列、分布式计数器等功能。
Zookeeper
![Zookeeper](https://img.taocdn.com/s3/m/6a17e91c844769eae009edd0.png)
选举leader
zookeeper服务器发送自己为选举的leader。 1.所选举leader的id(就是配置文件中写好的每个服务器的id) ,在初始阶段, 每台服务器的这个值都是自己服务器的id,也就是它们都选举自己为leader。 2.服务器最大数据的zxid,这个值大的服务器,说明存放了更新的数据。 3.逻辑时钟。 每台服务器将自己服务器的以上数据发送到集群中的其他服务器之后,同 样的也需要接收来自其他服务器的数据。
分布式锁
node
znode1 watch
znode2 watch
znode3
client1
client2
client3
分布式锁
思考: 假如client2在获取锁之前异常挂掉,client3就会获取锁。那么client1 和cl锁: 删除有序临时节点。 如果客户端进程死亡或连接失效,对应的节点也会被删除。
选举leader
Messenger类中有两种线程: WorkerReceiver线程类:接收线程,接收来自其他server的消息并处理这 些消息,在选举过程没有停止的时候,接收线程就循环处理接收到的消 息。处理消息的过程是:在外部消息队列recvQueue中取得一个消息,如 果这个消息的发送端是个observer,那么立刻回复,将本server要选举的 leader、当前状态、epoch信息发送过去。如果这个消息来自于一个 participate,那么按本server的状态讨论,如果本server处于looking状态, 那么将该消息放到本地接收队列中,同时判断发送方的状态,如果发送 方也是looking状态并且其epoch值比较小,那么回复它一个消息告知本 server的选举的leader信息。如果本server不是looking状态,而对方是 looking状态的话,就回复一个消息告知本server所知道的leader信息。 WorkerSender线程类:发送线程,负责发送消息到其他server。发送消息 的过程是:只要选举没有停止就从本地发送队列sendqueue中取一个消息 并将它发送到指定的server。
zookeeper
![zookeeper](https://img.taocdn.com/s3/m/de30257ffab069dc502201e6.png)
zookeeperzookeeper概述ZooKeeper工作原理ZooKeeper是有一组ZooKeeper服务器构成的系统。
一台Leader服务器,其他都是Follower当且仅当一半以上的Follower的状态和Leader状态同步后,才代表Leader选举完成,服务开启如果Leader失去响应,那么原有的Follower将选举一个新的Leader来协调工作ZooKeeper的设计目标简单化➢ZooKeeper通过共享体系的命名空间来协调,它由一些数据寄存器(Znode)组成。
数据存放在内存中。
健壮性➢只要大部分的服务器可用,那么ZooKeeper服务就可用。
➢如果连接到某服务器的TCP链接断开,客户端将连接到其他的服务器上。
有序性➢ZooKeeper可以为每次更新操作赋予一个版本号,此版本号是全局有序的速度➢在读取主要负载时尤其快。
➢ZooKeeper应用程序在上千台机器的节点上运行ZooKeeper的数据结构与组成ZooKeeper的结构类似于树,树中的节点成为ZnodeZnode负责数据的管理,并且执行协调更新操作ZooKeeper存在临时节点,这些节点与session同时存在可以为每个节点添加一个“监控”(Watcher),当节点的状态发生改变时,用“监控”触发某个事件ZooKeeper的目录结构ZooKeeper的算法ZooKeeper的实现主要采用了原子广播(ZooKeeper Atomaic Broadcast,简称Zab)协议原子广播➢客户端所有的写请求都被转发给Leader➢Leader将请求通过广播的形式发送给所有Follower➢超过半数的Follower修改数据,Leader才会提交这个更新➢过程要么全部成功,要么全部失败ZooKeeper中服务器的状态➢LOOKING表示初始化状态,等待参与Leader的投票➢LEADING表示领导者状态,统一管理系统中其他的服务器➢FOLLOWING表示跟随着状态,除了Leader外,剩下的服务器都处于这个状态ZooKeeper领导者选举ZooKeeper领导者的选举过程➢核心思想:由某个新加入集群的服务器发起一次选举,如果该服务器获得n/2+1个票数,那么它将成为LeaderZooKeeper的特性会话➢客户端连接到ZooKeeper服务器时,建立一个会话➢每个会话都存在一个有效时间➢在真实的系统环境中,通过Ping请求保持会话不过期版本号➢版本号是一种乐观加锁的机制,使客户端能检测出对节点的修改冲突监控➢当节点的状态发生变化时,监控(Watcher)机制可以让客户端得到通知Zookeeper的数据模型»层次化的目录结构,命名符合常规文件系统规范»每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识»节点Znode可以包含数据和子节点,但是EPHEMERAL类型的节点不能有子节点»Znode中的数据可以有多个版本,比如某一个路径下存有多个数据版本,那么查询这个路径下的数据就需要带上版本»客户端应用可以在节点上设置监视器»节点不支持部分读写,而是一次性完整读写Zookeeper的节点»Znode有两种类型,短暂的(ephemeral)和持久的(persistent)»Znode的类型在创建时确定并且之后不能再修改»短暂znode的客户端会话结束时,zookeeper会将该短暂znode删除,短暂znode不可以有子节点»持久znode不依赖于客户端会话,只有当客户端明确要删除该持久znode时才会被删除»Znode有四种形式的目录节点,PERSISTENT、PERSISTENT_SEQUENTIAL、EPHEMERAL、EPHEMERAL_SEQUENTIALZookeeper的顺序号»创建znode时设置顺序标识,znode名称后会附加一个值»顺序号是一个单调递增的计数器,由父节点维护»在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序Zookeeper的保证»更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行»数据更新原子性,一次数据更新要么成功,要么失败»全局唯一数据视图,client无论连接到哪个server,数据视图都是一致的»实时性,在一定事件范围内,client能读到最新数据观察(watcher)»Watcher 在ZooKeeper 是一个核心功能,Watcher 可以监控目录节点的数据变化以及子目录的变化,一旦这些状态发生变化,服务器就会通知所有设置在这个目录节点上的Watcher,从而每个客户端都很快知道它所关注的目录节点的状态发生变化,而做出相应的反应»可以设置观察的操作:exists,getChildren,getData»可以触发观察的操作:create,delete,setData» 1.一次性触发器client在一个节点上设置watch,随后节点内容改变,client将获取事件。
ZooKeeper典型应用场景-数据发布与订阅
![ZooKeeper典型应用场景-数据发布与订阅](https://img.taocdn.com/s3/m/10e88c3af011f18583d049649b6648d7c1c7080f.png)
ZooKeeper典型应⽤场景-数据发布与订阅 ZooKeeper 是⼀个⾼可⽤的分布式数据管理与系统协调框架。
基于对 Paxos 算法的实现,使该框架保证了分布式环境中数据的强⼀致性,也正是基于这样的特性,使得 ZooKeeper 可以解决很多分布式问题。
随着互联⽹系统规模的不断扩⼤,⼤数据时代飞速到来,越来越多的分布式系统将 ZooKeeper 作为核⼼组件使⽤,如 Hadoop、Hbase、Kafka、Storm等,因此,正确理解 ZooKeeper 的应⽤场景,对于 ZooKeeper 的使⽤者来说显得尤为重要。
本节主要将重点围绕数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等⽅⾯来讲解 ZooKeeper 的典型应⽤场景及实现。
1、数据发布/订阅 发布/订阅模式是⼀对多的关系,多个订阅者对象同时监听某⼀主题对象,这个主题对象在⾃⾝状态发⽣变化时会通知所有的订阅者对象。
使它们能⾃动的更新⾃⼰的状态。
发布/订阅可以使得发布⽅和订阅⽅独⽴封装、独⽴改变。
当⼀个对象的改变需要同时改变其他对象,⽽且它不知道具体有多少对象需要改变时可以使⽤发布/订阅模式。
发布/订阅模式在分布式系统中的典型应⽤有配置管理和服务发现、注册。
配置管理是指如果集群中的机器拥有某些相同的配置并且这些配置信息需要动态的改变,我们可以使⽤发布/订阅模式把配置做统⼀集中管理,让这些机器格⼦各⾃订阅配置信息的改变,当配置发⽣改变时,这些机器就可以得到通知并更新为最新的配置。
服务发现、注册是指对集群中的服务上下线做统⼀管理。
每个⼯作服务器都可以作为数据的发布⽅向集群注册⾃⼰的基本信息,⽽让某些监控服务器作为订阅⽅,订阅⼯作服务器的基本信息,当⼯作服务器的基本信息发⽣改变如上下线、服务器⾓⾊或服务范围变更,监控服务器可以得到通知并响应这些变化。
1.1、配置管理 所谓的配置中⼼,顾名思义就是发布者将数据发布到 ZooKeeper 的⼀个或⼀系列节点上,供订阅者进⾏数据订阅,进⽽达到动态获取数据的⽬的,实现配置信息的集中式管理和数据的动态更新。
zk使用场景
![zk使用场景](https://img.taocdn.com/s3/m/42e0226fbf1e650e52ea551810a6f524cdbfcb40.png)
zk使用场景ZooKeeper(zk)是一个分布式的协调和管理系统,它提供高可用的、可靠的、有序的数据访问能力。
目前,zk已经广泛应用于各种领域,例如分布式锁、配置中心、消息发布/订阅、分布式队列等等。
接下来,我们来具体了解zk的使用场景。
一、分布式锁在分布式系统中,多个节点同时向同一个资源发送请求时,有可能会出现竞争条件,即多个节点同时修改同一个数据导致数据不一致。
针对这种情况,我们可以使用分布式锁技术,通过对共享的资源加锁来保证数据的一致性。
zk提供了完善的分布式锁机制,可以很方便地实现分布式锁。
二、配置中心在一些大型应用中,有很多的配置参数需要统一维护和管理。
如果一个一个手动修改,不仅浪费时间,还容易出错。
此时,我们可以使用配置中心,通过一个统一的中心维护所有应用的配置参数,实现集中管理,便于维护。
zk提供了统一的数据存储和更新能力,可以很方便地实现配置中心。
三、消息发布/订阅在一些应用中,需要向多个节点分发消息,使得这些节点能够做出相应的处理。
这种场景可以使用消息发布/订阅机制,zk提供了统一的数据存储和访问能力,可以很方便地实现消息发布/订阅机制。
四、分布式队列在一些应用中,需要对事件进行排序和处理,即先到先得。
这种场景可以使用分布式队列,可以很方便地实现分布式队列。
以上就是zk的一些应用场景,它们都是基于zk的共享存储和更新能力实现的。
实际应用中,我们可以根据实际需求结合zk的特点和优势,灵活选择相应的应用场景,以达到更好的效果。
Zookeeper简介及使用
![Zookeeper简介及使用](https://img.taocdn.com/s3/m/e09d381202d8ce2f0066f5335a8102d276a26175.png)
Zookeeper简介及使⽤⼀、Zookeeper简介1、zookeeper简介动物管理员Apache ZooKeeper致⼒于开发和维护开源服务器,实现⾼度可靠的分布式协调。
2、什么是ZooKeeper?ZooKeeper是⼀种集中式服务,⽤于维护配置信息,命名,提供分布式同步和提供组服务。
所有这些类型的服务都以分布式应⽤程序的某种形式使⽤。
每次实施它们都需要做很多⼯作来修复不可避免的错误和竞争条件。
由于难以实现这些类型的服务,应⽤程序最初通常会吝啬它们,这使得它们在变化的情况下变得脆弱并且难以管理。
即使正确完成,这些服务的不同实现也会在部署应⽤程序时导致管理复杂性。
3、zookeeper功能(1)存储数据(2)监听4、zookeeper⼯作机制基于观察者模式设计的分布式服务管理框架5、zookeeper的存储结构⽬录树结构6、zookeeper应⽤场景(1)集群统⼀配置管理(2)集群统⼀命名服务(3)集群统⼀管理(4)服务器的动态上下线感知(5)负载均衡7、安装zookeeper单机版(1)下载安装包 zookeeper-3.4.10.tar.gz(2)上传安装包到Linuxalt+p(SecureCRT中)(3)解压tar -zxvf zookeeper-3.4.10.tar.gz(4)修改配置⽂件进⼊zookeeper安装⽬录下的conf⽂件夹下mv zoo_sample.cfg zoo.cfgvi zoo.cfgdataDir=/root/hd/zookeeper-3.4.10/zkData(5)启动zkbin/zkServer.sh start(6)查看状态bin/zkServer.sh status(7)启动客户端bin/zkCli.sh8、完全分布式安装(1)下载安装包 zookeeper-3.4.10.tar.gz(2)上传安装包到Linuxalt+p(SecureCRT中)(3)解压tar -zxvf zookeeper-3.4.10.tar.gz(4)修改配置⽂件进⼊zookeeper安装⽬录下的conf⽂件夹下mv zoo_sample.cfg zoo.cfgvi zoo.cfgdataDir=/root/hd/zookeeper-3.4.10/zkData###############cluster###############server.1=hd09-1:2888:3888server.2=hd09-2:2888:3888server.3=hd09-3:2888:3888其中server.后⾯的数字1、2、3分别是机器hd09-1、hd09-2、hd09-3中zookeeper-3.4.10/zkData/myid⽂件中的值(5)添加⽂件myid$cd zookeeper-3.4.10/zkData$touch myid(6)添加内容在myid为1$ vi myid1(7)发送zookeeper⽂件到其它机器$ scp -r zookeeper-3.4.10 hd09-2:$PWD$ scp -r zookeeper-3.4.10 hd09-3:$PWD(8)修改myid依次为2 3(9)修改环境变量vi /etc/profileexport ZOOKEEPER_HOME=/root/hd/zookeeper3.4.10 export PATH=$PATH:$ZOOKEEPER_HOME/bin (10)⽣效环境变量source /etc/profile(11)启动zookeeperzkServer.sh start(12)查看状态zkServer.sh status(13)关闭zookeeperzkServer.sh stop9、客户端的命令⾏操作(1)启动客户端zkCli.sh(2)查看帮助help(3)查看当前znode所包含的内容ls /(4)创建节点create /hello 18(5)创建短暂znodecreate -e /haha tom(6)创建带序号znodecreate -s /bigdata tom(7)创建短暂带序号create -e -s /bigdata tom(8)查看此节点的详细信息ls2 /(9)获得节点值监听get /hello watch(10)监听路径ls / watch(11)修改znode数据set /hello iiiii(12)删除节点delete /hello(13)递归删除rmr /delireba(14)查看节点状态信息stat /⼆、Zookeeper⼯作机制1、Zookeeper⼯作机制2、Zookeeper⽬录结构3、Zookeeper选举机制三、Zookeeper简单客户端APIpackage com.css.zk;import java.io.IOException;import java.util.List;import org.apache.zookeeper.CreateMode;import org.apache.zookeeper.KeeperException;import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.Watcher;import org.apache.zookeeper.ZooDefs.Ids;import org.apache.zookeeper.ZooKeeper;import org.apache.zookeeper.data.Stat;import org.junit.Before;import org.junit.Test;public class ZkClient {private String connectString = "192.168.146.132:2181,192.168.146.133:2181,192.168.146.134:2181"; private int sessionTimeout = 3000;ZooKeeper zkCli = null;// 初始化客户端@Beforepublic void init() throws IOException {zkCli = new ZooKeeper(connectString, sessionTimeout, new Watcher() {// 回调监听@Overridepublic void process(WatchedEvent event) {// System.out.println(event.getPath() + "\t" + event.getState() + "\t" + event.getType());try {List<String> children = zkCli.getChildren("/", true);for (String c : children) {// System.out.println(c);}} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}});}// 创建⼦节点@Testpublic void createZnode() throws KeeperException, InterruptedException {String path = zkCli.create("/hello", "world".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); System.out.println(path);}// 获取⼦节点@Testpublic void getChild() throws KeeperException, InterruptedException {List<String> children = zkCli.getChildren("/", true);for (String c : children) {System.out.println(c);}Thread.sleep(Long.MAX_VALUE);}// 删除节点@Testpublic void rmChildData() throws KeeperException, InterruptedException {// byte[] data = zkCli.getData("/bbq", true, null);// System.out.println(new String(data));zkCli.delete("/hello", -1);}// 修改数据@Testpublic void setData() throws KeeperException, InterruptedException {zkCli.setData("/hello", "17".getBytes(), -1);}// 判断节点是否存在@Testpublic void testExist() throws KeeperException, InterruptedException {Stat exists = zkCli.exists("/hello", false);System.out.println(exists == null ? "not exists" : "exists");}}四、Zoopeeper监听API1、监听单节点内容package com.css.zk;import java.io.IOException;import org.apache.zookeeper.KeeperException;import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.Watcher;import org.apache.zookeeper.ZooKeeper;// 监听单节点内容public class WatchDemo {public static void main(String[] args) throws IOException, KeeperException, InterruptedException {ZooKeeper zkCli = new ZooKeeper("192.168.146.132:2181,192.168.146.133:2181,192.168.146.134:2181", 3000, new Watcher() {// 监听回调@Overridepublic void process(WatchedEvent event) {}});byte[] data = zkCli.getData("/hello", new Watcher() {// 监听的具体内容@Overridepublic void process(WatchedEvent event) {System.out.println("监听路径为:" + event.getPath());System.out.println("监听的类型为:" + event.getType());System.out.println("监听被修改了");}}, null);System.out.println(new String(data));Thread.sleep(Long.MAX_VALUE);}}2、监听⽬录package com.css.zk;import java.io.IOException;import java.util.List;import org.apache.zookeeper.KeeperException;import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.Watcher;import org.apache.zookeeper.ZooKeeper;// 监听⽬录public class WatchDemo1 {static List<String> children = null;public static void main(String[] args) throws IOException, KeeperException, InterruptedException {ZooKeeper zkCli = new ZooKeeper("192.168.146.132:2181,192.168.146.133:2181,192.168.146.134:2181", 3000, new Watcher() {// 监听回调@Overridepublic void process(WatchedEvent event) {System.out.println("正在监听中......");}});// 监听⽬录children = zkCli.getChildren("/", new Watcher() {@Overridepublic void process(WatchedEvent event) {System.out.println("监听路径为:" + event.getPath());System.out.println("监听的类型为:" + event.getType());System.out.println("监听被修改了");for (String c : children) {System.out.println(c);}}});Thread.sleep(Long.MAX_VALUE);}五、Zookeeper动态上下线感知系统需求某分布式系统当中,主节点有多台,可以进⾏动态上下线,当有任何⼀台机器发⽣了动态的上下线任何⼀台客户端都能感知到。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【ZooKeeper Notes 28】ZooKeeper典型应用场景一览@ni掌柜
nileader@
/nileader
ZooKeeper是一个高可用的分布式数据管理与系统协调框架。
基于对Paxos算法的实现,使该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得ZooKeeper解决很多分布式问题。
网上对ZK的应用场景也有不少介绍,本文将结合作者身边的项目例子,系统地对ZK的应用场景进行一个分门归类的介绍。
值得注意的是,ZK并非天生就是为这些应用场景设计的,都是后来众多开发者根据其框架的特性,利用其提供的一系列API接口(或者称为原语集),摸索出来的典型使用方法。
因此,也非常欢迎读者分享你在ZK使用上的奇技淫巧。