首页 > 编程知识 正文

router的原理,ZooKeeper的事件机制原理

时间:2023-05-04 17:30:23 阅读:40127 作者:1611

目录

一. Zookeeper功能介绍

二、ZooKeeper的基本概念

2.1集群的作用

2.2集群节点分工

2.3会话

2.4数据节点

2.5状态信息

2.6事物操作

2.7 Watcher (事件侦听器) () ) ) ) ) ) ) 0

zookeeper APP应用程序的典型场景

3.1数据分发和订阅(配置中心) ) ) ) ) ) ) ) ) )。

3.2命名服务

3.3分布式协调服务/通知

3.4主场选举

3.5分布式锁定

四.总结

一. Zookeeper功能介绍

ZooKeeper是雅虎创建的开源分布式协调服务,是谷歌chubby的开源实现。 分布式APP应用基于ZooKeeper,包括数据发布/订阅、负载平衡、名称服务、分布式协调/通知、集群管理、主选举、配置维护、名称服务、分布式同步、分布式锁定、分布式队列等二、ZooKeeper的基本概念

本节介绍ZooKeeper的几个主要概念

因此,我们需要知道这些概念。

集群的作用

一个ZooKeeper群集在同一时间只有一个Leader。 其他的是Follower或观察器。

ZooKeeper的配置很简单,每个节点的配置文件(zoo.cfg )相同,只有myid文件不同。 myid的值必须是zoo.cfg的server.{数值}的{数值}部分。

zoo.cfg配置文件示例

在安装ZooKeeper的计算机的终端上运行ZooKeeper-server status时,可以看到当前节点的ZooKeeper是什么角色。 默认情况下,ZooKeeper只有两个角色: Leader和Follower,没有观察器角色。 要使用观察器模式,请将:peerType=Observer添加到要成为观察器的节点的配置文件中,然后将所有服务器的配置文件添加到配置为观察器模式的服务器的行配置中

2 .节点读写服务分工

1.ZooKeeper群集中的所有机器都通过Leader选举过程选定一台称为“Leader”的机器,Leader服务器为客户端提供读写服务。 2.Follower和Observer都可以提供读取服务,但不能提供写入服务。 两者唯一的区别是观察器机器不参与Leader的选举过程,也不参与写入操作的“一半写入成功”策略,因此观察器可以在不影响写入性能的情况下提高集群的读取性能。 3 .会话

Session是客户端会话,在描述客户端会话之前,让我们先了解一下客户端连接。 在ZooKeeper中,单个客户端连接是客户端和ZooKeeper服务器之间的TCP长连接。 ZooKeeper的外部服务端口默认值为2181,在客户端启动时,首先与服务器建立TCP连接,然后从第一个连接建立开始客户端会话的生命周期。 此连接允许客户端通过心跳检测和服务器保持有效的会话,向ZooKeeper服务器发送请求以接受响应,以及通过该连接接收来自服务器的Watch事件通知。 会话的会话时间输出值用于设置客户端会话的超时时间。 即使客户端连接由于各种原因(如服务器压力、网络故障或主动断开客户端)而断开,如果可以在SessionTimeout指定的时间内重新连接到群集中的任何服务器,则以前创建的会话4 .数据节点

zookeeper的结构实际上是树形结构,leader相当于其中的根节点,其他节点相当于follow节点,每个节点保持自己的内容。 zookeeper节点分为两类:永久节点和临时节点-永久节点。 永久节点是指一旦在此树结构中创建,该节点将存储在zookeeper中,除非您主动执行删除树节点的操作。 -临时节点—临时节点的生命周期与客户端会话相关联,禁用客户端会话将删除该客户端创建的所有临时节点。 5 .状态信息

每个节点不仅存储数据的内容,还存储节点本身的状态信息。 在可以同时获取作为get命令的节点的内容和状态信息的ZooKeeper中,version属性用于实现乐观锁定机制中的“写入检查”(保证分布式数据的原子操作)。 6 .事物操作

在ZooKeeper中,可以更改ZooKeeper服务器状态的操作

作称为事务操作。一般包括数据节点创建与删除、数据内容更新和客户端会话创建与失效等操作。对应每一个事务请求,ZooKeeper都会为其分配一个全局唯一的事务ID,用 ZXID 表示,通常是一个64位的数字。每一个 ZXID对应一次更新操作,从这些 ZXID 中可以间接地识别出 ZooKeeper 处理这些事务操作请求的全局顺序。

7 .Watcher(事件监听器)

是 ZooKeeper 中一个很重要的特性。ZooKeeper允许用户在指定节点上注册一些 Watcher,并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去。该机制是 ZooKeeper 实现分布式协调服务的重要特性。

三 .ZooKeeper应用的典型场景

ZooKeeper 是一个高可用的分布式数据管理与协调框架。基于对ZAB算法的实现,该框架能够很好地保证分布式环境中数据的一致性。也是基于这样的特性,使得 ZooKeeper 成为了解决分布式一致性问题的利器。

1 . 数据发布与订阅(配置中心)

数据发布与订阅,即所谓的配置中心,顾名思义就是发布者将数据发布到 ZooKeeper 节点上,供订阅者进行数据订阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和动态更新。 对于:数据量通常比较小。数据内容在运行时动态变化。集群中各机器共享,配置一致。这样的全局配置信息就可以发布到 ZooKeeper上,让客户端(集群的机器)去订阅该消息。发布/订阅系统一般有两种设计模式,分别是推(Push)和拉(Pull)模式。 - 推模式 服务端主动将数据更新发送给所有订阅的客户端 - 拉模式 客户端主动发起请求来获取最新数据,通常客户端都采用定时轮询拉取的方式ZooKeeper 采用的是推拉相结合的方式: 客户端想服务端注册自己需要关注的节点,一旦该节点的数据发生变更,那么服务端就会向相应的客户端发送Watcher事件通知,客户端接收到这个消息通知后,需要主动到服务端获取最新的数据

2 . 命名服务

命名服务也是分布式系统中比较常见的一类场景。在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。被命名的实体通常可以是集群中的机器,提供的服务,远程对象等等——这些我们都可以统称他们为名字。其中较为常见的就是一些分布式服务框架(如RPC)中的服务地址列表。通过在ZooKeepr里创建顺序节点,能够很容易创建一个全局唯一的路径,这个路径就可以作为一个名字。ZooKeeper 的命名服务即生成全局唯一的ID。

3 . 分布式协调服务/通知

ZooKeeper 中特有 Watcher 注册与异步通知机制,能够很好的实现分布式环境下不同机器,甚至不同系统之间的通知与协调,从而实现对数据变更的实时处理。使用方法通常是不同的客户端如果 机器节点 发生了变化,那么所有订阅的客户端都能够接收到相应的Watcher通知,并做出相应的处理。ZooKeeper的分布式协调/通知,是一种通用的分布式系统机器间的通信方式。

4 . Master选举

Master 选举可以说是 ZooKeeper 最典型的应用场景了。比如 HDFS 中 Active NameNode 的选举、YARN 中 Active ResourceManager 的选举和 HBase 中 Active HMaster 的选举等。

针对 Master 选举的需求,通常情况下,我们可以选择常见的关系型数据库中的主键特性来实现:希望成为 Master 的机器都向数据库中插入一条相同主键ID的记录,数据库会帮我们进行主键冲突检查,也就是说,只有一台机器能插入成功——那么,我们就认为向数据库中成功插入数据的客户端机器成为Master。 依靠关系型数据库的主键特性确实能够很好地保证在集群中选举出唯一的一个Master。 但是,如果当前选举出的 Master 挂了,那么该如何处理?谁来告诉我 Master 挂了呢?显然,关系型数据库无法通知我们这个事件。但是,ZooKeeper 可以做到! 利用 ZooKeepr 的强一致性,能够很好地保证在分布式高并发情况下节点的创建一定能够保证全局唯一性,即 ZooKeeper 将会保证客户端无法创建一个已经存在的 数据单元节点。 也就是说,如果同时有多个客户端请求创建同一个临时节点,那么最终一定只有一个客户端请求能够创建成功。利用这个特性,就能很容易地在分布式环境中进行 Master 选举了。 成功创建该节点的客户端所在的机器就成为了 Master。同时,其他没有成功创建该节点的客户端,都会在该节点上注册一个子节点变更的 Watcher,用于监控当前 Master 机器是否存活,一旦发现当前的Master挂了,那么其他客户端将会重新进行 Master 选举。 这样就实现了 Master 的动态选举。

5 . 分布式锁

分布式锁是控制分布式系统之间同步访问共享资源的一种方式
分布式锁又分为排他锁和共享锁两种

排它锁
ZooKeeper如何实现排它锁?

定义锁
ZooKeeper 上的一个 机器节点 可以表示一个锁获得锁
把ZooKeeper上的一个节点看作是一个锁,获得锁就通过创建临时节点的方式来实现。
ZooKeeper 会保证在所有客户端中,最终只有一个客户端能够创建成功,那么就可以
认为该客户端获得了锁。同时,所有没有获取到锁的客户端就需要到/exclusive_lock
节点上注册一个子节点变更的Watcher监听,以便实时监听到lock节点的变更情况。

释放锁
因为锁是一个临时节点,释放锁有两种方式

当前获得锁的客户端机器发生宕机或重启,那么该临时节点就会被删除,释放锁正常执行完业务逻辑后,客户端就会主动将自己创建的临时节点删除,释放锁。

无论在什么情况下移除了lock节点,ZooKeeper 都会通知所有在 /exclusive_lock 节点上注册了节点变更 Watcher 监听的客户端。这些客户端在接收到通知后,再次重新发起分布式锁获取,即重复『获取锁』过程。

共享锁

共享锁在同一个进程中很容易实现,但是在跨进程或者在不同 Server 之间就不好实现了。Zookeeper 却很容易实现这个功能,实现方式也是需要获得锁的 Server 创建一个 EPHEMERAL_SEQUENTIAL 目录节点,然后调用 getChildren方法获取当前的目录节点列表中最小的目录节点是不是就是自己创建的目录节点,如果正是自己创建的,那么它就获得了这个锁,如果不是那么它就调用 exists(String path, boolean watch) 方法并监控 Zookeeper 上目录节点列表的变化,一直到自己创建的节点是列表中最小编号的目录节点,从而获得锁,释放锁很简单,只要删除前面它自己所创建的目录节点就行了。

总结

本文介绍的 Zookeeper 的基本知识,以及介绍了几个典型的应用场景。这些都是 Zookeeper 的基本功能,最重要的是 Zoopkeeper 提供了一套很好的分布式集群管理的机制,就是它这种基于 层次型的目录树的数据结构,并对树中的节点进行有效管理,从而可以设计出多种多样的分布式的数 据管理模型,而不仅仅局限于上面提到的几个常用应用场景

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。