Zookeeper统一配置管理
- 格式:ppt
- 大小:1.48 MB
- 文档页数:33
zookeeper集群工作原理Zookeeper集群工作原理Zookeeper是一个开源的分布式协调服务,它提供了一个高可用的、有序的、一致性的数据管理和协调服务。
在分布式系统中,Zookeeper集群起到了关键的作用,负责管理和维护分布式系统中的各种数据和状态。
一、Zookeeper集群的基本概念1. 服务器角色:Zookeeper集群中的每个节点都可以担任Leader 或Follower的角色。
Leader负责处理客户端请求和写操作,Follower则负责处理读操作和同步数据。
2. 数据模型:Zookeeper将数据存储在树形结构的命名空间中,类似于文件系统的目录结构,每个节点都有一个路径和一个关联的数据。
3. 会话:客户端与Zookeeper集群之间的连接被称为会话,会话可以保持一段时间,并且可以处理客户端请求。
二、Zookeeper集群的工作原理1. Leader选举:在Zookeeper集群中,只有一个节点可以担任Leader角色,其余节点为Follower。
当集群启动或Leader节点宕机时,会发起一次Leader选举。
选举过程通过ZAB协议(Zookeeper Atomic Broadcast)进行,节点首先互相通信,然后通过投票的方式选择出新的Leader节点。
2. 数据一致性:Zookeeper通过使用ZAB协议来实现数据的一致性。
当客户端向Leader节点发送写请求时,Leader节点将该请求转发给所有的Follower节点,一旦大多数Follower节点都返回成功响应,Leader节点就会将数据变更应用到自身的数据副本中,并通知Follower节点更新数据。
这样就保证了数据的一致性。
3. 数据同步:Zookeeper集群中的Follower节点会定期从Leader 节点同步数据,以保持数据的一致性。
Follower节点会向Leader 节点发送请求,获取最新的数据更新,然后更新到自身的数据副本中。
zookeeper、ZK安装、ZK配置、ZK使⽤-----------------------------⽬录-----------------------------------第⼀部分:zookeeper简介第⼆部分:zookeeper环境搭建 1、单机环境 2、集群环境第三部分:zookeeper基本使⽤ 1、java原⽣zk客户端api操作 2、zkClient客户端操作(推荐) 3、curator客户端操作(推荐)第四部分:zookeeper应⽤场景第五部分:zookeeper深⼊进阶第六部分:zookeeper源码分析-----------------------------⽬录-----------------------------------第⼀部分:zookeeper简介1、 zookeeper基本概念zookeeper是⼀个开源的分布式协调服务,其设计⽬标是将那些复杂并且容易出差错的分布式⼀致性服务封装起来,构成⼀个⾼效可靠的原语集,并提供给⽤户⼀些简单的接⼝,zookeeper是⼀个典型的分布式⼀致性的解决⽅案(CP模式),分布式应⽤程序可以基于它实现数据订阅/发布、负载均衡,命名服务、集群管理、分布式锁和分布式队列等功能。
2、基本概念@1、集群⾓⾊通常在分布式系统中,构成⼀个集群中的每⼀台机器都有⾃⼰的⾓⾊,典型的是master/slave模式(主备模式),这种情况下能够处理写操作的机器成为master机器,把所有通过⼀步复制⽅式获取最新数据并且提供服务的机器为slave机器。
在zookeeper中没有是⽤主备模式,引⼊了Leader、Follower、Observer三种⾓⾊,在zk集群中所有的机器通过Leader选举来选Leader,Leader服务器为客户端提供读写服务,Follower和Observer都能提供读服务,唯⼀的区别是Observer不参与Leader选举,不参与写操作的过半写成功。
zookeeper用法ZooKeeper是一个开源的分布式应用程序的协调服务,它是一个树形目录服务,提供的功能包括配置管理、分布式锁、集群管理。
以下是ZooKeeper的使用方法:1. 启动ZooKeeper服务:可以通过执行命令sh bin/zkServer.sh start/status/stop/restart来启动、停止、查看ZooKeeper服务状态或重启ZooKeeper服务。
2. 客户端登陆:可以通过执行命令sh bin/zkCli.sh(远程登陆zkCli.sh -server IP:2181)来登录ZooKeeper客户端。
3. 命令行操作:在ZooKeeper客户端中,可以执行以下命令进行操作:* 显示根目录下、文件:ls / 使用ls命令来查看当前ZooKeeper中所包含的内容。
* 显示根目录下、文件:ls2 / 查看当前节点数据并能看到更新次数等数据。
* 创建文件,并设置初始内容:create /zk "test" 创建一个新的znode节点“ zk ”以及与它关联的字符串。
* 获取文件内容:get /zk 确认znode是否包含我们所创建的字符串。
* 修改文件内容:set /zk "zkbak" 对zk所关联的字符串进行设置。
* 删除文件:delete /zk 将刚才创建的文件删除。
4. 使用ZooKeeper的Java API:可以在Java程序中使用ZooKeeper API进行连接、操作和监控ZooKeeper服务器。
以下是使用ZooKeeper API的示例代码:```javaimport org.apache.zookeeper.*;public class ZKExample {public static void main(String[] args) throws Exception {// 创建ZooKeeper连接ZooKeeper zk = new ZooKeeper("localhost:2181", 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) { System.out.println("Receive watched event:" + event);}});// 获取根目录下的所有节点List<String> nodes = zk.getChildren("/", false);System.out.println("Nodes under /: " +nodes);// 获取节点数据Stat stat = zk.exists("/test", false);if (stat != null) {System.out.println("Node /test exists, data: " + new String(zk.getData("/test", false, stat), "UTF-8"));} else {System.out.println("Node /test does not exist");}// 删除节点zk.delete("/test", stat.getVersion());// 关闭ZooKeeper连接zk.close();}}```以上示例代码演示了如何连接ZooKeeper服务器,获取根目录下的所有节点和节点数据,以及删除节点和关闭连接。
zk应用场景
Zookeeper(zk)是一个高性能的分布式协调服务,它可以用于各种分布式场景,包括但不限于以下几个方面:
1. 协调分布式应用:在分布式系统中,各个节点之间需要协调工作,Zookeeper 提供了一套原子操作,来实现分布式应用的协调和同步。
2. 统一配置管理:分布式系统中,各个节点的配置信息需要保持一致。
Zookeeper 提供了注册中心功能,可以统一管理配置信息,降低维护成本和出错概率。
3. 分布式锁:在多线程、多进程甚至多机器环境下,锁的管理非常困难。
Zookeeper 提供了分布式锁的实现,可以保证分布式环境下的数据安全性和可靠性。
4. 集群监控:Zookeeper本身就是一个分布式集群,因此它可以用来监控其它集群的状态,并根据其变化做出相应的处理。
5. 分布式队列:在分布式系统中,消息队列的使用非常广泛。
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就能实现互斥操作。
大数据主要所学技术(简介)目录大数据主要所学技术简介:一:大数据技术生态体系二:各个技术栈简介一:大数据技术生态体系二:各个技术栈简介Hadoophadoop是一个用java实现的一个开源框架,是一种用于存储和分析大数据的软件平台,专为离线数据而设计的,不适用于提供实时计算。
对海量数据进行分布式计算。
Hadoop=HDFS(文件系统,数据存储相关技术)+ Mapreduce(数据处理)+ Yarn (运算资源调度系统)zookeeper对于大型分布式系统,它是一个可靠的协调系统。
提供功能:[本质是为客户保管数据,为客户提供数据监控服务]1. 统一命名服务:在分布式环境下,经常需要对应用/服务进行统一命名,便于识别。
例如:一个域名下可能有多个服务器,服务器不同,但域名一样。
2. 统一配置管理:把集群统一配置文件交给zookeeper3. 统一集群管理:分布式环境中,实时掌握集群每个节点状态,zookeeper可以实现监控节点状态的变化。
4. 服务器动态上下线:客户端能实时洞察到服务器上下线变化。
5. 软负载均衡:在zookeeper中记录服务器访问数,让访问数最小的服务器去处理最新的客户端请求Hivehive是由facebook开源用于解决海量结构化日志的数据统计,是一个基于hadoop的数据库工具,可以将结构化数据映射成一张数据表,并提供类SQL的查询功能,本质是将SQL语句转化为MapReduce程序。
用hive的目的就是避免去写MapReduce,减少开发人员学习成本。
FlumeFlume是hadoop生态圈中的一个组件,主要应用于实时数据的流处理,是一个高可用,高可靠,分布式的海量日志采集,聚合和传输的系统。
支持多路径流量,多管道接入流量,多管道接出流量。
含有三个组件:•source 【收集】•channel 【聚集,一个通道,类似数据缓冲池】•sink 【输出】基础架构:Kafka分布式的基于发布/订阅模式的消息队列。
zookeeper 使用场景
Zookeeper 是一个针对分布式应用程序的开源协调服务。
它提供了分布式应用程序的协作服务,包括配置维护、命名服务、分布式同步和分布式锁等功能。
Zookeeper 主要用于:
1. 分布式的配置管理,例如,多个节点需要共享配置文件时,可以使用 Zookeeper 实现配置文件的管理和更新,保证多个节点共享一份数据,并可快速更新和同步。
2. 命名服务,例如,多个节点需要根据名称访问同一资源时,可以使用 Zookeeper 实现统一的命名服务,使得每个节点都能够使用相同的名称访问该资源。
3. 分布式同步,例如,多个节点需要实现数据更新同步时,可以使用 Zookeeper 实现分布式的同步控制,以保证节点间数据的一致性。
4. 分布式锁,例如,多个节点需要对同一资源进行加锁时,可以使用 Zookeeper 实现分布式的锁控制,以保证节点之间对该资源的访问不会产生冲突。
综上所述,Zookeeper 可以帮助开发人员轻松实现分布式应用程序的一些关键功能,例如配置管理、同步和锁定等,从而提升应用程序的可靠性和可扩展性。
zk监听原理ZooKeeper是一个让你构建分布式应用的开源框架。
它的作用是在分布式应用中提供协调服务,包括统一的配置管理、命名服务、分布式锁的协调、对集群状态的监控等等。
ZooKeeper的核心思想是将数据存储在一个树形结构中。
每个节点都有一个ACL (Access Control List)权限控制列表,用于控制哪些节点可以访问该节点的数据。
同时,ZooKeeper采用了基于事务的方式来确保数据一致性。
当一个节点的数据发生变化时,ZooKeeper会自动通知所有监听该节点的客户端。
这个通知机制是ZooKeeper的核心机制,也是实现分布式协调的重要手段之一。
ZooKeeper的监听原理可以分为两部分来讲解:客户端监听和服务端监听。
客户端监听客户端监听是指客户端通过调用ZooKeeper API来注册节点监听器,以便在节点数据发生变化时得到通知。
在ZooKeeper中,节点数据的变化分为三种类型:节点创建、节点删除、节点数据变化。
在注册节点监听器时,可以指定所监听的类型,也可以监听所有变化类型。
客户端注册监听器的一般流程如下:1. 调用ZooKeeper API注册一个Watcher对象,用于接收节点数据变化通知;2. 调用ZooKeeper API获取节点的数据,并设置Watcher对象;3. 当节点数据发生变化时,ZooKeeper会通知所有监听该节点的Watcher对象。
客户端收到通知后,重新获取节点数据,并再次注册Watcher对象,以实现对节点的持续监听。
服务端监听除了客户端监听外,ZooKeeper还提供了服务端监听机制。
服务端监听指的是ZooKeeper集群中的任一节点在数据发生变化时,都可以通知其他所有节点,以确保数据的一致性和可靠性。
在ZooKeeper中,服务端监听的实现原理是基于ZAB(ZooKeeper Atomic Broadcast)协议。
ZAB协议是ZooKeeper集群中用于数据同步和一致性的协议。
zookeeper是什么、做什么⽤⼀、什么是zookeeper ZooKeeper是⼀个分布式的,开放源码的分布式应⽤程序协调服务,是Google的Chubby⼀个开源的实现,是Hadoop和Hbase的重要组件。
它是⼀个为分布式应⽤提供⼀致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
简单来说,zookeeper = ⽂件系统 + 监听通知机制⼆、⽂件系统 zookeeper有着与linux类似的⽂件系统,区别是,linux的⽬录就是⽬录,⽂件就是⽂件。
⽽zookeeper中只有⼀个znode概念,本⾝可以做为“⽂件”存储⼀定的数据,⼜可以做为“⽬录”存在。
/*+---+|/ |+-+-+|| +------++--|config|| +--+---+| | +-----+| +-----|ip || | +-----+| | +-----+| +-----|port || +-----+|| +------++--|apps |+--+---+| +-----++-----|app1 || +-----+| +-----++-----|app2 |+-----+*/ znode共分为四种: 1、PERSISTENT-持久化⽬录节点 此节点在客户端与zookeeper断开连接之后,依然存在,需要主动删除。
2、PERSISTENT_SEQUENTIAL-持久化顺序编号⽬录节点 同样地,此类节点也是需要主动删除,不会随着客户端的断开连接⽽删除。
与PERSISTENT不同的是,zookeeper会给此类节点进⾏编号。
如:app0000003362。
0000003362为zookeeper给的编号,⾃动递增。
由于此编号是⼀个有符号整形(4字节),当它超过2147483647时,将会溢出。
3、EPHEMERAL-临时⽬录节点 与PERSISTENT不同的是,此类节点会在客户端与zookeeper断开连接之后被删除。