您当前的位置:钢材 > 型钢 > 市场分析

zookeeper是什么?,zookeeper是啥意思

来源:头条 作者: chanong
分享到
关注德勤钢铁网在线:
  • 扫描二维码

    关注√

    德勤钢铁网微信

在线咨询:
  • 扫描或点击关注德勤钢铁网在线客服

1. Zookeeper概述Zookeeper是一个开源的分布式协调服务框架,主要用于解决分布式集群中的应用系统一致性和数据管理问题。

2: Zookeeper的特点Zookeeper本质上是一个分布式文件系统,适合存储小文件,也可以理解为一个数据库,如上图左侧所示,Zookeeper实际上存储的Znode是一个Zookeeper节点。 Znode 具有/data/host1、/data/host2 等路径。这个路径也可以理解为Znode的名称。 Znode 还可以承载数据。例如,Znode路径是/data。 /host1,其值为字符串“192.168.0.1” Znodes的特性允许Zookeeper提供类似文件系统的外观。您可以通过操作文件系统来操作Zookeeper。使用路径获取Znode 获取Znode承载的数据修改Znode承载的数据删除Znode并添加Znode3 Zookeeper应用场景3.1 数据发布/订阅在数据发布/订阅系统中,发布者必须发布数据数据发送到Zookeeper节点供订阅者订阅。这样就达到了动态检索数据、集中配置信息、动态更新数据的目的。发布/订阅通常有两种设计模式:推送模式和拉取模式。服务器主动向所有订阅的客户端发送数据更新(简称推送模式)。客户端主动请求最新数据(简称pull模式)。 Zookeeper采用推拉组合模型。客户端向服务器注册需要关注的节点。当节点的数据发生变化时,服务器会向相应的客户端推送Watcher事件通知。客户端收到此通知后,会主动联系服务器以获取最新数据。

3.2 命名服务命名服务是分步实现系统的常见场景。在分布式系统中,命名实体通常是集群中的机器、提供的服务地址或远程对象。通过命名服务,客户端可以如下识别资源实体:在分布式环境中,上层应用程序只需要全局唯一的名称即可。 Zookeeper可以实现分布式全局唯一ID分配机制。

可以通过调用Zookeeper节点创建的API接口来创建顺序节点,并使用返回节点全名作为API返回值的函数生成全局ID。

根据任务类型,客户端通过调用指定任务类型下的接口(如“job-”)来创建序列节点。创建后,将返回完整的节点名称,例如“job-00000001”。当客户端将type类型与返回值连接起来时,它可以用作全局唯一ID,例如“type2-job-00000001”。 3.3 分布式协调和通知通过向Zookeeper特有的Watcher注册异步通知机制,可以成功实现分布式环境下不同机器甚至不同系统之间的协调和通知,实现数据变化的实时处理。通常情况下,不同的客户端会在Zookeeper上为同一个数据节点注册Watcher,以监控该数据节点(包括自身及其子节点)的变化。当数据节点发生变化时,所有订阅的客户端都可以接收到它。通知相应的客户。请密切关注并做出相应回应。在大多数分布式系统中,系统机器之间的通信仅限于心跳检测、工作进度报告和系统调度。 (1)心跳检测:由于我们需要检测不同机器之间是否正常工作,因此我们可以根据临时节点的特点,使用Zookeeper来实现机器之间的心跳检测。(临时节点的生命周期是一个客户端session(这使得不同的机器可以在Zookeeper中的给定节点下创建临时子节点,不同的机器使用这个临时子节点)来判断对应的客户端机器是否存活。Zookeeper可以显着降低系统耦合度。(2)工作进展报告通常,任务分发到不同的机器后,我们需要向分布式系统实时报告任务的执行进度。可以在Zookeeper上选择一个节点,每个任务客户端在其下创建一个临时节点。子节点有用于判断机器是否存活,每台机器除了能够做出决策外,还可以将自己的任务执行进度写入临时节点,让中央系统实时获取任务执行进度。(3 )系统调度,Zookeeper可以: 可以实现的系统调度模式: 一个分布式系统由两部分组成:控制台和一些客户端系统。控制台的作用是向所有客户端发送指令信息,并执行相应的业务逻辑。后台管理器运行在控制台上,在控制台上进行一些操作实际上意味着更改Zookeeper上特定节点上的数据,这意味着Zookeeper可以将数据变化以时间通知的形式发送给订阅客户端。

3.4 分布式锁分布式锁是一种控制跨分布式系统共享资源同步访问的方法。可以保证不同系统访问一个或一组资源时的一致性。主要分为排它锁和共享锁。排他锁也称为写锁或排他锁。当事务T1给数据对象O1添加排它锁时,在锁期间,只允许事务T1读取和更新O1,不允许其他事务。在T1 释放排它锁之前,不能对该数据对象执行其他类型的操作。 获取锁。当所有客户端需要获取排他锁时,都会在/exclusive_lock下创建一个临时子节点/exclusive_lock/。通过调用接口锁定节点。 Zookeeper可以保证只有一个客户端创建成功,但是失败的客户端必须注册/exclusive_lock节点watch。 解除锁定。如果获取锁的客户端崩溃或者业务逻辑成功完成,临时节点将被删除。此时,所有在/exclusive_lock 节点上注册监控的客户端都会收到通知,并且可以重新启动分发。锁定获取。共享锁也称为读锁。如果事务T1对数据对象O1加了共享锁,则当前事务只能对O1进行读操作,其他事务对这个数据对象加共享锁,直到数据对象耗尽为止,我能做的就是这些。共享锁被释放。当所有客户端需要获取共享锁时,它们会在/shared_lock下创建一个临时序列节点。

3.5 分布式队列在某些情况下,多个团队可能需要共同完成一项任务。例如,A团队将Hadoop集群的计算结果传递给B团队继续计算,B团队完成任务后再传递给C团队继续计算。这有点像业务系统中每个环节都经过的工作流程。分布式环境还需要单进程的类似队列的组件来实现跨进程、跨主机和跨网络的数据共享和数据传输。这是一个分布式队列。

4. Zookeeper架构Zookeeper集群是一个基于主/从架构的高可用集群。

每个服务器承担以下三个角色之一: Leader:Zookeeper 集群一次只有一位活跃的Leader,向每个跟随者和观察者发起并维护心跳。所有写操作都必须通过读取器完成,读取器将它们广播到其他服务器。 Followers 一个Zookeeper集群可以同时有多个followers,它们响应leader的心跳。 Followers可以直接处理并返回客户端的读请求,可以同时将写请求转发给Leader处理,并在Leader处理写请求时负责对请求进行投票。观察者的角色与追随者类似,但他们没有投票权。

5. Zookeeper选举机制Leader选举是保证分布式数据一致性的关键。当Zookeeper集群中的服务器遇到以下两种情况之一时,必须发起Leader选举:

5.1. 服务器启动时的领导者选举领导者选举至少需要两台机器,但在本例中我们选择由三台机器组成的服务器集群。在集群初始化阶段,服务器Server1启动时,无法自行完成Leader选举。第二台服务器Server2启动后,两台机器就可以互相通信了。每台机器都试图找到一个领导者,因此输入:领导者选择过程。选举过程如下: (1) 每个服务器发出投票。由于这是初始情况,Server1 和Server2 投票作为领导服务器。每次投票包含推荐服务器的myid和ZXID,用(myid,ZXID)表示。现在Server1的投票是(1, 0),Server2的投票是(2, 0),并且每台都将此投票发送到集群中的其他机器以接受来自每个服务器的投票。(2)。当集群中的每个服务器收到投票时,首先会判断该投票的有效性,包括检查该投票是否属于本轮以及是否来自处于LOOKING 状态的服务器。 (3) 处理您的投票;对于每一次投票,服务器必须用自己的投票来PK对方的投票。 PK规则为:

请先检查您的ZXID。具有较高ZXID 的服务器优先作为领导者。如果ZXID相同,则比较myid。 myid 较高的服务器充当领导服务器。 Server1 的投票是(1, 0),Server2 的投票是(2, 0)。首先比较两个ZXID,都是0,然后比较myid。现在Server2的myid最大,所以将投票更新为(2, 0),然后再次投票。对于Server2来说,不需要更新投票,只需将最后一次投票信息再次发送给集群中的所有机器即可。 (4) 计票。每次投票后,服务器都会对投票信息进行统计,以确定是否有超过一半的机器收到了相同的投票信息。对于服务器1 和服务器2,集群中的两台机器被计为接受了(2, 0) 票。 ),假设此时领导者已经被选举出来。 (5) 更改服务器状态。一旦确定了leader,每个server的状态都会更新,如果是follower则状态变为FOLLOWING,如果是leader则状态变为LEADING。

5.2. 服务器运行期间的Leader选举在Zookeeper运行期间,Leader服务器和非Leader服务器发挥着各自的作用,但即使非Leader服务器宕机或者添加了新服务器,此时Leader也不会受到影响。我不。但如果Leader服务器宕机,整个集群暂停对外服务,进入新一轮Leader选举。这个过程和启动时的leader选举过程本质上是一样的。

6.规划您的Zookeeper安装集群

服务器IP(192.168.174)之前的网段必须使用自己的网段。

第一步:下载Zookeeper压缩包。下载地址为:http://archive.apache.org/dist/zookeeper/。在以下网址下载你要使用的zk版本:3.4.9,下载完成后上传。保存到Linux /export/。准备安装在soxwares路径下。

步骤2:准备安装Zookeeper压缩包,将其解压到路径/export/servers(您可以自行设置路径,我们将使用/export/servers)。

cd /export/software -- 切换到文件上传的目录。 tar -zxvfzookeeper-3.4.9.tar.gz -C ./servers/--解压到服务器目录。第三步:修改配置文件。第一台机器配置文件

将cd /export/servers/zookeeper-3.4.9/conf/cpzoo_sample.cfgzoo.cfgmkdir -p /export/servers/zookeeper-3.4.9/zkdatas/vimzoo.cfgzoo.cfg 添加到文件末尾。

dataDir=/export/servers/zookeeper-3.4.9/zkdatas -- 唯一路径# 保留的快照数量autopurge.snapRetainCount=3 # 清理日志的时间autopurge.purgeInterval=1 # 集群server 中的服务器地址。 1=node01:2888:3888server .2=node02:2888:3888server.3=node03:2888:3888 步骤4:添加myid配置。在第一台机器上的/export/servers/zookeeper-3.4.9/zkdatas/路径下创建一个文件。我的ID和文件内容是1

echo 1 /export/servers/zookeeper-3.4.9/zkdatas/myid 步骤5:分发安装包并更改myid值将安装包分发到其他机器上在第一台机器上运行以下两个命令:我会这样做。

scp -r /export/servers/zookeeper-3.4.9/node02:/export/servers/scp -r /export/servers/zookeeper-3.4.9/node03:/export/servers/将第二台机器的myid值设置为Change像这样: 2

echo 2 /export/servers/zookeeper-3.4.9/zkdatas/myid 在第三台机器上将myid 值更改为3。

echo 3 /export/servers/zookeeper-3.4.9/zkdatas/myid 步骤6:在三台机器上启动Zookeeper 服务在三台机器上启动Zookeeper 服务在需要执行此操作的所有三台机器上运行此命令。

/export/servers/zookeeper-3.4.9/bin/zkServer.sh start 显示启动状态

/export/servers/zookeeper-3.4.9/bin/zkServer.sh status7.启动Zookeeper shell客户端操作:进入Zookeeper文件夹,运行以下段落。这里node01是服务器名称。也可以使用IP 地址。

bin/zkCli.sh -server node01:21811:创建常规节点

create /app1 hello2: 创建序列节点

create -s /app3 world3: 创建临时节点

create -e /tempnode world4: 创建一个连续的临时节点

create -s -e /tempnode2 aaa5: 获取节点数据

get /app16: 修改节点数据

set /app1 xxx7: 删除节点

delete /app1 被删除的节点不能有子节点rmr /app1 Znode 特性的递归删除文件系统的核心是Znode。如果你想选择一个Znode,你需要使用一个路径格式(例如/test1/test11Znode本身)不是一个文件,也不是一个file.folder,但是一个Znode有一个类似于Name的路径,所以它有树形,文件系统ZK在逻辑上可以保证Znode访问的原子性,不存在更新成功的问题。 Znode中有数据大小限制,最大为1M,一个Znode由三部分组成:stat : 状态、Znode权限信息、版本和其他数据每个Znode子节点:条数据,无论是否存在。 可承载数据的子节点列表Znode 类型每个Znode 有两个主要特征,可以配置四种不同类型的Znode。

当持久客户端断开连接时,持久Znode 不会被删除。即使客户端临时断开连接,所有保留的Znode 也会被删除。临时Znode 不能有子Znode。 Znode 是按顺序创建的。顺序是:添加您的序列号。序列号是由其父节点管理的Znode 的自动增量、无序创建。 Znode属性dataVersion是数据版本。当Znode 中的数据发生变化时,dataVersion 会自动增加cversion。节点版本每当修改节点时,Znode cversion 都会自动增加aclVersion ACL(访问控制列表)版本号。当Znode权限信息发生变化时,aclVersion会自动增加zxid、事务ID、ctime、创建时间、mtime和最新值。更新时间ephemeralOwner 如果Znode 是临时节点,ephemeralOwner 表示与该节点关联的SessionId 通知机制通知,类似于数据库中的触发器。在特定的Znode 上设置Watcher。当Znode发生变化时,WatchManager会调用相应的Watcher。当一个Znode被删除、修改、创建或者其子节点被修改时,都会通知对应的Watcher。 Watcher的特殊之处在于Watcher是一次触发的,并且只能触发一次。如果需要继续监控,则需要重新添加Watcher事件包。 获得观察者。事件被封装,包含三个内容:keeperStae、eventType、path8。 Zookeeper JavaAPI 操作。这里Zookeeper的JavaAPI操作使用一组Zookeeper客户端。 Curator 框架为Zookeeper 客户端解决了许多非常低级和详细的开发任务。 Curator 包含几个包。

curator-framework:封装了Zookeeper的一些底层API curator-recipes:封装了一些高级功能如缓存事件监控、选举、分布式锁、分布式计数器等Maven依赖(使用的Curator版本:2.12.0,对应版本Zookeeper为3.4) .x.如果版本之间存在兼容性问题,可能会出现节点运行失败的情况。)

8.1、创建Java项目,导入jar包org.apache.curator curator-framework 2.12.0 org.apache.curator curator-recipes 2.12.0 com.google.collections google-collections 1.0 junit junit RELEASE org.slf4j slf4j - simple 1.7 .25 8.2 节点操作import org.apache.curator.RetryPolicy;import org.apache.curator.framework.CuratorFramework;import org.apache.curator.framework.CuratorFrameworkFactory;import org.apache.curator.framework.recipes.cache .ChildData;导入org.apache.curator.framework.recipes.cache.TreeCache;导入org.apache.curator.framework.recipes.cache.TreeCacheEvent;导入org.apache.curator.framework.recipes.cache.TreeCacheListener;导入org . apache.curator.retry.ExponentialBackoffRetry;import org.apache.zookeeper.CreateMode;import org.junit.Test;/** * @Description * @Author wugongzi * @Date 2020/7/10 21:12 */public class ZKTest {/*节点监控机制*/@Test public void watchZnode() throws Exception { //1: 自定义重试策略RetryPolicy retryPolicy=new ExponentialBackoffRetry(3000, 1); //2: 获取客户端String conectionStr='192.168. 79.100:2181, 192.168 .79.110:2 181 ,192.168.79.120:2181'; CuratorFramework client=CuratorFrameworkFactory.newClient(conectionStr, 8000, 8000, retryPolicy); //启动3:客户端client.start(); //创建并监控4:TreeCache对象的节点指定路径TreeCache TreeCache=new TreeCache (client, '/hello3'); //5: 自定义监听器treeCache.getListenable().addListener(new TreeCacheListener() { //@Override public void childEvent( CuratorFramework curatorFramework, TreeCacheEvent TreeCacheEvent) throws Exception { ChildData data=treeCacheEvent.getData (); if(data !=null){ switch (treeCacheEvent.getType()){ case NODE_ADDED:System.out.println('正在监视新节点!'); Break; case NODE_REMOVED:System.out.println('您观察到一个节点被删除!');break; case NODE_UPDATED:System.out.println('您观察到一个节点已更新!' );break;default:break; } } } }); //开始监听treeCache.start(); Thread .sleep(1000000); } /* 获取节点数据*/@Test public void getZnodeData() throws Exception { //1: 自定义重试策略RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000, 1) ; //2: 获取客户端字符串conectionStr='192.168.79.100:2181,192.168.79.110:2181,192.168.79.120:2181'; CuratorFramework 客户端=CuratorFrameworkFactory.newClient(conectionStr, 8000, 80 00, retryPolicy); //3 333 60 启动客户端client.start( ); //4: 获取节点数据byte[] bytes=client.getData().forPath('/hello '); System.out.println(new String(bytes)); //5: 关闭客户端client.close( ); } /* 设置节点数据*/@Test public void setZnodeData() throws Exception { //1: 自定义重试策略RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000, 1); //2: 获取客户端String conectionStr='192.168 .79.100:2181,192.168.79.11033 3602181 ,192.168 .79.1203336 02181'; CuratorFramework client=CuratorFrameworkFactory.newClient(conectionStr, 8000, 8000, retryPolicy); //启动3:客户端client.start( ); //更改4:节点数据client.setData( ).forPath('/hello' , ' Zookeeper'.getBytes()); //5: 关闭客户端client.close(); } /* 创建临时节点*/@Test public void createTm

pZnode() throws Exception { //1:定制一个重试策略 /* param1: 重试的间隔时间 param2:重试的最大次数 */ RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,1); //2:获取一个客户端对象 /* param1:要连接的Zookeeper服务器列表 param2:会话的超时时间 param3:链接超时时间 param4:重试策略 */ String connectionStr = "192.168.79.100:2181,192.168.79.110:2181,192.168.79.120:2181"; CuratorFramework client = CuratorFrameworkFactory.newClient(connectionStr, 8000, 8000, retryPolicy); //3:开启客户端 client.start(); //4:创建节点 client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/hello4","world".getBytes()); Thread.sleep(5000); //5:关闭客户端 client.close(); } /* 创建永久节点 */ @Test public void createZnode() throws Exception { //1:定制一个重试策略 /* param1: 重试的间隔时间 param2:重试的最大次数 */ RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,1); //2:获取一个客户端对象 /* param1:要连接的Zookeeper服务器列表 param2:会话的超时时间 param3:链接超时时间 param4:重试策略 */ String connectionStr = "192.168.79.100:2181,192.168.79.110:2181,192.168.79.120:2181"; CuratorFramework client = CuratorFrameworkFactory.newClient(connectionStr, 8000, 8000, retryPolicy); //3:开启客户端 client.start(); //4:创建节点 client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/hello2","world".getBytes()); //5:关闭客户端 client.close(); }}
责任编辑:德勤钢铁网 标签:

热门搜索

相关文章

广告
德勤钢铁网 |市场分析

zookeeper是什么?,zookeeper是啥意思

chanong

|

1. Zookeeper概述Zookeeper是一个开源的分布式协调服务框架,主要用于解决分布式集群中的应用系统一致性和数据管理问题。

2: Zookeeper的特点Zookeeper本质上是一个分布式文件系统,适合存储小文件,也可以理解为一个数据库,如上图左侧所示,Zookeeper实际上存储的Znode是一个Zookeeper节点。 Znode 具有/data/host1、/data/host2 等路径。这个路径也可以理解为Znode的名称。 Znode 还可以承载数据。例如,Znode路径是/data。 /host1,其值为字符串“192.168.0.1” Znodes的特性允许Zookeeper提供类似文件系统的外观。您可以通过操作文件系统来操作Zookeeper。使用路径获取Znode 获取Znode承载的数据修改Znode承载的数据删除Znode并添加Znode3 Zookeeper应用场景3.1 数据发布/订阅在数据发布/订阅系统中,发布者必须发布数据数据发送到Zookeeper节点供订阅者订阅。这样就达到了动态检索数据、集中配置信息、动态更新数据的目的。发布/订阅通常有两种设计模式:推送模式和拉取模式。服务器主动向所有订阅的客户端发送数据更新(简称推送模式)。客户端主动请求最新数据(简称pull模式)。 Zookeeper采用推拉组合模型。客户端向服务器注册需要关注的节点。当节点的数据发生变化时,服务器会向相应的客户端推送Watcher事件通知。客户端收到此通知后,会主动联系服务器以获取最新数据。

3.2 命名服务命名服务是分步实现系统的常见场景。在分布式系统中,命名实体通常是集群中的机器、提供的服务地址或远程对象。通过命名服务,客户端可以如下识别资源实体:在分布式环境中,上层应用程序只需要全局唯一的名称即可。 Zookeeper可以实现分布式全局唯一ID分配机制。

可以通过调用Zookeeper节点创建的API接口来创建顺序节点,并使用返回节点全名作为API返回值的函数生成全局ID。

根据任务类型,客户端通过调用指定任务类型下的接口(如“job-”)来创建序列节点。创建后,将返回完整的节点名称,例如“job-00000001”。当客户端将type类型与返回值连接起来时,它可以用作全局唯一ID,例如“type2-job-00000001”。 3.3 分布式协调和通知通过向Zookeeper特有的Watcher注册异步通知机制,可以成功实现分布式环境下不同机器甚至不同系统之间的协调和通知,实现数据变化的实时处理。通常情况下,不同的客户端会在Zookeeper上为同一个数据节点注册Watcher,以监控该数据节点(包括自身及其子节点)的变化。当数据节点发生变化时,所有订阅的客户端都可以接收到它。通知相应的客户。请密切关注并做出相应回应。在大多数分布式系统中,系统机器之间的通信仅限于心跳检测、工作进度报告和系统调度。 (1)心跳检测:由于我们需要检测不同机器之间是否正常工作,因此我们可以根据临时节点的特点,使用Zookeeper来实现机器之间的心跳检测。(临时节点的生命周期是一个客户端session(这使得不同的机器可以在Zookeeper中的给定节点下创建临时子节点,不同的机器使用这个临时子节点)来判断对应的客户端机器是否存活。Zookeeper可以显着降低系统耦合度。(2)工作进展报告通常,任务分发到不同的机器后,我们需要向分布式系统实时报告任务的执行进度。可以在Zookeeper上选择一个节点,每个任务客户端在其下创建一个临时节点。子节点有用于判断机器是否存活,每台机器除了能够做出决策外,还可以将自己的任务执行进度写入临时节点,让中央系统实时获取任务执行进度。(3 )系统调度,Zookeeper可以: 可以实现的系统调度模式: 一个分布式系统由两部分组成:控制台和一些客户端系统。控制台的作用是向所有客户端发送指令信息,并执行相应的业务逻辑。后台管理器运行在控制台上,在控制台上进行一些操作实际上意味着更改Zookeeper上特定节点上的数据,这意味着Zookeeper可以将数据变化以时间通知的形式发送给订阅客户端。

3.4 分布式锁分布式锁是一种控制跨分布式系统共享资源同步访问的方法。可以保证不同系统访问一个或一组资源时的一致性。主要分为排它锁和共享锁。排他锁也称为写锁或排他锁。当事务T1给数据对象O1添加排它锁时,在锁期间,只允许事务T1读取和更新O1,不允许其他事务。在T1 释放排它锁之前,不能对该数据对象执行其他类型的操作。 获取锁。当所有客户端需要获取排他锁时,都会在/exclusive_lock下创建一个临时子节点/exclusive_lock/。通过调用接口锁定节点。 Zookeeper可以保证只有一个客户端创建成功,但是失败的客户端必须注册/exclusive_lock节点watch。 解除锁定。如果获取锁的客户端崩溃或者业务逻辑成功完成,临时节点将被删除。此时,所有在/exclusive_lock 节点上注册监控的客户端都会收到通知,并且可以重新启动分发。锁定获取。共享锁也称为读锁。如果事务T1对数据对象O1加了共享锁,则当前事务只能对O1进行读操作,其他事务对这个数据对象加共享锁,直到数据对象耗尽为止,我能做的就是这些。共享锁被释放。当所有客户端需要获取共享锁时,它们会在/shared_lock下创建一个临时序列节点。

3.5 分布式队列在某些情况下,多个团队可能需要共同完成一项任务。例如,A团队将Hadoop集群的计算结果传递给B团队继续计算,B团队完成任务后再传递给C团队继续计算。这有点像业务系统中每个环节都经过的工作流程。分布式环境还需要单进程的类似队列的组件来实现跨进程、跨主机和跨网络的数据共享和数据传输。这是一个分布式队列。

4. Zookeeper架构Zookeeper集群是一个基于主/从架构的高可用集群。

每个服务器承担以下三个角色之一: Leader:Zookeeper 集群一次只有一位活跃的Leader,向每个跟随者和观察者发起并维护心跳。所有写操作都必须通过读取器完成,读取器将它们广播到其他服务器。 Followers 一个Zookeeper集群可以同时有多个followers,它们响应leader的心跳。 Followers可以直接处理并返回客户端的读请求,可以同时将写请求转发给Leader处理,并在Leader处理写请求时负责对请求进行投票。观察者的角色与追随者类似,但他们没有投票权。

5. Zookeeper选举机制Leader选举是保证分布式数据一致性的关键。当Zookeeper集群中的服务器遇到以下两种情况之一时,必须发起Leader选举:

5.1. 服务器启动时的领导者选举领导者选举至少需要两台机器,但在本例中我们选择由三台机器组成的服务器集群。在集群初始化阶段,服务器Server1启动时,无法自行完成Leader选举。第二台服务器Server2启动后,两台机器就可以互相通信了。每台机器都试图找到一个领导者,因此输入:领导者选择过程。选举过程如下: (1) 每个服务器发出投票。由于这是初始情况,Server1 和Server2 投票作为领导服务器。每次投票包含推荐服务器的myid和ZXID,用(myid,ZXID)表示。现在Server1的投票是(1, 0),Server2的投票是(2, 0),并且每台都将此投票发送到集群中的其他机器以接受来自每个服务器的投票。(2)。当集群中的每个服务器收到投票时,首先会判断该投票的有效性,包括检查该投票是否属于本轮以及是否来自处于LOOKING 状态的服务器。 (3) 处理您的投票;对于每一次投票,服务器必须用自己的投票来PK对方的投票。 PK规则为:

请先检查您的ZXID。具有较高ZXID 的服务器优先作为领导者。如果ZXID相同,则比较myid。 myid 较高的服务器充当领导服务器。 Server1 的投票是(1, 0),Server2 的投票是(2, 0)。首先比较两个ZXID,都是0,然后比较myid。现在Server2的myid最大,所以将投票更新为(2, 0),然后再次投票。对于Server2来说,不需要更新投票,只需将最后一次投票信息再次发送给集群中的所有机器即可。 (4) 计票。每次投票后,服务器都会对投票信息进行统计,以确定是否有超过一半的机器收到了相同的投票信息。对于服务器1 和服务器2,集群中的两台机器被计为接受了(2, 0) 票。 ),假设此时领导者已经被选举出来。 (5) 更改服务器状态。一旦确定了leader,每个server的状态都会更新,如果是follower则状态变为FOLLOWING,如果是leader则状态变为LEADING。

5.2. 服务器运行期间的Leader选举在Zookeeper运行期间,Leader服务器和非Leader服务器发挥着各自的作用,但即使非Leader服务器宕机或者添加了新服务器,此时Leader也不会受到影响。我不。但如果Leader服务器宕机,整个集群暂停对外服务,进入新一轮Leader选举。这个过程和启动时的leader选举过程本质上是一样的。

6.规划您的Zookeeper安装集群

服务器IP(192.168.174)之前的网段必须使用自己的网段。

第一步:下载Zookeeper压缩包。下载地址为:http://archive.apache.org/dist/zookeeper/。在以下网址下载你要使用的zk版本:3.4.9,下载完成后上传。保存到Linux /export/。准备安装在soxwares路径下。

步骤2:准备安装Zookeeper压缩包,将其解压到路径/export/servers(您可以自行设置路径,我们将使用/export/servers)。

cd /export/software -- 切换到文件上传的目录。 tar -zxvfzookeeper-3.4.9.tar.gz -C ./servers/--解压到服务器目录。第三步:修改配置文件。第一台机器配置文件

将cd /export/servers/zookeeper-3.4.9/conf/cpzoo_sample.cfgzoo.cfgmkdir -p /export/servers/zookeeper-3.4.9/zkdatas/vimzoo.cfgzoo.cfg 添加到文件末尾。

dataDir=/export/servers/zookeeper-3.4.9/zkdatas -- 唯一路径# 保留的快照数量autopurge.snapRetainCount=3 # 清理日志的时间autopurge.purgeInterval=1 # 集群server 中的服务器地址。 1=node01:2888:3888server .2=node02:2888:3888server.3=node03:2888:3888 步骤4:添加myid配置。在第一台机器上的/export/servers/zookeeper-3.4.9/zkdatas/路径下创建一个文件。我的ID和文件内容是1

echo 1 /export/servers/zookeeper-3.4.9/zkdatas/myid 步骤5:分发安装包并更改myid值将安装包分发到其他机器上在第一台机器上运行以下两个命令:我会这样做。

scp -r /export/servers/zookeeper-3.4.9/node02:/export/servers/scp -r /export/servers/zookeeper-3.4.9/node03:/export/servers/将第二台机器的myid值设置为Change像这样: 2

echo 2 /export/servers/zookeeper-3.4.9/zkdatas/myid 在第三台机器上将myid 值更改为3。

echo 3 /export/servers/zookeeper-3.4.9/zkdatas/myid 步骤6:在三台机器上启动Zookeeper 服务在三台机器上启动Zookeeper 服务在需要执行此操作的所有三台机器上运行此命令。

/export/servers/zookeeper-3.4.9/bin/zkServer.sh start 显示启动状态

/export/servers/zookeeper-3.4.9/bin/zkServer.sh status7.启动Zookeeper shell客户端操作:进入Zookeeper文件夹,运行以下段落。这里node01是服务器名称。也可以使用IP 地址。

bin/zkCli.sh -server node01:21811:创建常规节点

create /app1 hello2: 创建序列节点

create -s /app3 world3: 创建临时节点

create -e /tempnode world4: 创建一个连续的临时节点

create -s -e /tempnode2 aaa5: 获取节点数据

get /app16: 修改节点数据

set /app1 xxx7: 删除节点

delete /app1 被删除的节点不能有子节点rmr /app1 Znode 特性的递归删除文件系统的核心是Znode。如果你想选择一个Znode,你需要使用一个路径格式(例如/test1/test11Znode本身)不是一个文件,也不是一个file.folder,但是一个Znode有一个类似于Name的路径,所以它有树形,文件系统ZK在逻辑上可以保证Znode访问的原子性,不存在更新成功的问题。 Znode中有数据大小限制,最大为1M,一个Znode由三部分组成:stat : 状态、Znode权限信息、版本和其他数据每个Znode子节点:条数据,无论是否存在。 可承载数据的子节点列表Znode 类型每个Znode 有两个主要特征,可以配置四种不同类型的Znode。

当持久客户端断开连接时,持久Znode 不会被删除。即使客户端临时断开连接,所有保留的Znode 也会被删除。临时Znode 不能有子Znode。 Znode 是按顺序创建的。顺序是:添加您的序列号。序列号是由其父节点管理的Znode 的自动增量、无序创建。 Znode属性dataVersion是数据版本。当Znode 中的数据发生变化时,dataVersion 会自动增加cversion。节点版本每当修改节点时,Znode cversion 都会自动增加aclVersion ACL(访问控制列表)版本号。当Znode权限信息发生变化时,aclVersion会自动增加zxid、事务ID、ctime、创建时间、mtime和最新值。更新时间ephemeralOwner 如果Znode 是临时节点,ephemeralOwner 表示与该节点关联的SessionId 通知机制通知,类似于数据库中的触发器。在特定的Znode 上设置Watcher。当Znode发生变化时,WatchManager会调用相应的Watcher。当一个Znode被删除、修改、创建或者其子节点被修改时,都会通知对应的Watcher。 Watcher的特殊之处在于Watcher是一次触发的,并且只能触发一次。如果需要继续监控,则需要重新添加Watcher事件包。 获得观察者。事件被封装,包含三个内容:keeperStae、eventType、path8。 Zookeeper JavaAPI 操作。这里Zookeeper的JavaAPI操作使用一组Zookeeper客户端。 Curator 框架为Zookeeper 客户端解决了许多非常低级和详细的开发任务。 Curator 包含几个包。

curator-framework:封装了Zookeeper的一些底层API curator-recipes:封装了一些高级功能如缓存事件监控、选举、分布式锁、分布式计数器等Maven依赖(使用的Curator版本:2.12.0,对应版本Zookeeper为3.4) .x.如果版本之间存在兼容性问题,可能会出现节点运行失败的情况。)

8.1、创建Java项目,导入jar包org.apache.curator curator-framework 2.12.0 org.apache.curator curator-recipes 2.12.0 com.google.collections google-collections 1.0 junit junit RELEASE org.slf4j slf4j - simple 1.7 .25 8.2 节点操作import org.apache.curator.RetryPolicy;import org.apache.curator.framework.CuratorFramework;import org.apache.curator.framework.CuratorFrameworkFactory;import org.apache.curator.framework.recipes.cache .ChildData;导入org.apache.curator.framework.recipes.cache.TreeCache;导入org.apache.curator.framework.recipes.cache.TreeCacheEvent;导入org.apache.curator.framework.recipes.cache.TreeCacheListener;导入org . apache.curator.retry.ExponentialBackoffRetry;import org.apache.zookeeper.CreateMode;import org.junit.Test;/** * @Description * @Author wugongzi * @Date 2020/7/10 21:12 */public class ZKTest {/*节点监控机制*/@Test public void watchZnode() throws Exception { //1: 自定义重试策略RetryPolicy retryPolicy=new ExponentialBackoffRetry(3000, 1); //2: 获取客户端String conectionStr='192.168. 79.100:2181, 192.168 .79.110:2 181 ,192.168.79.120:2181'; CuratorFramework client=CuratorFrameworkFactory.newClient(conectionStr, 8000, 8000, retryPolicy); //启动3:客户端client.start(); //创建并监控4:TreeCache对象的节点指定路径TreeCache TreeCache=new TreeCache (client, '/hello3'); //5: 自定义监听器treeCache.getListenable().addListener(new TreeCacheListener() { //@Override public void childEvent( CuratorFramework curatorFramework, TreeCacheEvent TreeCacheEvent) throws Exception { ChildData data=treeCacheEvent.getData (); if(data !=null){ switch (treeCacheEvent.getType()){ case NODE_ADDED:System.out.println('正在监视新节点!'); Break; case NODE_REMOVED:System.out.println('您观察到一个节点被删除!');break; case NODE_UPDATED:System.out.println('您观察到一个节点已更新!' );break;default:break; } } } }); //开始监听treeCache.start(); Thread .sleep(1000000); } /* 获取节点数据*/@Test public void getZnodeData() throws Exception { //1: 自定义重试策略RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000, 1) ; //2: 获取客户端字符串conectionStr='192.168.79.100:2181,192.168.79.110:2181,192.168.79.120:2181'; CuratorFramework 客户端=CuratorFrameworkFactory.newClient(conectionStr, 8000, 80 00, retryPolicy); //3 333 60 启动客户端client.start( ); //4: 获取节点数据byte[] bytes=client.getData().forPath('/hello '); System.out.println(new String(bytes)); //5: 关闭客户端client.close( ); } /* 设置节点数据*/@Test public void setZnodeData() throws Exception { //1: 自定义重试策略RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000, 1); //2: 获取客户端String conectionStr='192.168 .79.100:2181,192.168.79.11033 3602181 ,192.168 .79.1203336 02181'; CuratorFramework client=CuratorFrameworkFactory.newClient(conectionStr, 8000, 8000, retryPolicy); //启动3:客户端client.start( ); //更改4:节点数据client.setData( ).forPath('/hello' , ' Zookeeper'.getBytes()); //5: 关闭客户端client.close(); } /* 创建临时节点*/@Test public void createTm

pZnode() throws Exception { //1:定制一个重试策略 /* param1: 重试的间隔时间 param2:重试的最大次数 */ RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,1); //2:获取一个客户端对象 /* param1:要连接的Zookeeper服务器列表 param2:会话的超时时间 param3:链接超时时间 param4:重试策略 */ String connectionStr = "192.168.79.100:2181,192.168.79.110:2181,192.168.79.120:2181"; CuratorFramework client = CuratorFrameworkFactory.newClient(connectionStr, 8000, 8000, retryPolicy); //3:开启客户端 client.start(); //4:创建节点 client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/hello4","world".getBytes()); Thread.sleep(5000); //5:关闭客户端 client.close(); } /* 创建永久节点 */ @Test public void createZnode() throws Exception { //1:定制一个重试策略 /* param1: 重试的间隔时间 param2:重试的最大次数 */ RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,1); //2:获取一个客户端对象 /* param1:要连接的Zookeeper服务器列表 param2:会话的超时时间 param3:链接超时时间 param4:重试策略 */ String connectionStr = "192.168.79.100:2181,192.168.79.110:2181,192.168.79.120:2181"; CuratorFramework client = CuratorFrameworkFactory.newClient(connectionStr, 8000, 8000, retryPolicy); //3:开启客户端 client.start(); //4:创建节点 client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/hello2","world".getBytes()); //5:关闭客户端 client.close(); }}

市场分析