【ZooKeeper Notes 28】ZooKeeper典型应用场景一览
- 格式:pdf
- 大小:426.78 KB
- 文档页数:6
一:名称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被广泛应用,主流的大数据组件如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的一种原子广播协议,用于确保在分布式环境中数据的一致性。
目录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 是一个开源的分布式协调服务框架,主要用于解决分布式应用中一致性、可靠性和可伸缩性等问题。
它提供了一种简单而高效的方式来管理分布式应用程序中的数据、状态和配置信息。
以下是 ZooKeeper 的一些常见应用场合:1. 分布式锁:在分布式系统中,多个进程可能需要竞争访问共享资源。
ZooKeeper 可以通过创建临时节点来实现分布式锁,确保只有一个进程能够获得锁并访问共享资源。
2. 服务注册与发现:在微服务架构中,服务可以动态地注册到 ZooKeeper 节点上,并通过节点信息来发现其他服务。
这有助于实现服务的自动发现和负载均衡。
3. 配置管理:ZooKeeper 可以用于存储和管理应用程序的配置信息,如配置文件、参数等。
通过监听 ZooKeeper 节点的变化,应用程序可以及时获取最新的配置。
4. 命名服务:ZooKeeper 可以提供全局唯一的名称服务,用于给分布式系统中的资源或服务分配唯一的标识符。
5. 分布式队列:ZooKeeper 可以用于实现简单的分布式队列。
通过创建顺序节点,可以模拟队列的行为,实现任务的排队和处理。
6. leader 选举:在分布式系统中,需要选举一个主节点来负责协调和管理其他节点。
ZooKeeper 可以通过创建临时顺序节点来实现 leader 选举。
7. 数据发布/订阅:ZooKeeper 支持数据的发布/订阅模型。
客户端可以订阅感兴趣的数据节点,当数据发生变化时,ZooKeeper 会通知订阅者。
总之,ZooKeeper 在分布式系统中扮演着重要的角色,可以用于实现各种分布式协调任务,提高系统的可靠性、一致性和可伸缩性。
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就能实现互斥操作。
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 是一个针对分布式应用程序的开源协调服务。
它提供了分布式应用程序的协作服务,包括配置维护、命名服务、分布式同步和分布式锁等功能。
Zookeeper 主要用于:
1. 分布式的配置管理,例如,多个节点需要共享配置文件时,可以使用 Zookeeper 实现配置文件的管理和更新,保证多个节点共享一份数据,并可快速更新和同步。
2. 命名服务,例如,多个节点需要根据名称访问同一资源时,可以使用 Zookeeper 实现统一的命名服务,使得每个节点都能够使用相同的名称访问该资源。
3. 分布式同步,例如,多个节点需要实现数据更新同步时,可以使用 Zookeeper 实现分布式的同步控制,以保证节点间数据的一致性。
4. 分布式锁,例如,多个节点需要对同一资源进行加锁时,可以使用 Zookeeper 实现分布式的锁控制,以保证节点之间对该资源的访问不会产生冲突。
综上所述,Zookeeper 可以帮助开发人员轻松实现分布式应用程序的一些关键功能,例如配置管理、同步和锁定等,从而提升应用程序的可靠性和可扩展性。
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是中典型的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 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 Notes 28】ZooKeeper典型应用场景一览@ni掌柜
nileader@
/nileader
ZooKeeper是一个高可用的分布式数据管理与系统协调框架。
基于对Paxos算法的实现,使该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得ZooKeeper解决很多分布式问题。
网上对ZK的应用场景也有不少介绍,本文将结合作者身边的项目例子,系统地对ZK的应用场景进行一个分门归类的介绍。
值得注意的是,ZK并非天生就是为这些应用场景设计的,都是后来众多开发者根据其框架的特性,利用其提供的一系列API接口(或者称为原语集),摸索出来的典型使用方法。
因此,也非常欢迎读者分享你在ZK使用上的奇技淫巧。