Zookeeper详解(zk)

2024-03-23 05:52
文章标签 详解 zookeeper zk

本文主要是介绍Zookeeper详解(zk),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • Zookeeper 概念
    • ZooKeeper的应用场景使用场景
    • zk的原理
    • ZAB 协议
    • 假如注册中心挂了,消费者还能调⽤服务吗,用什么调用的
    • dubbo注册中心为什么选择 Zookeeper
    • 关于zookeeper部署的个数
    • Zk分布式锁原理和实现
    • zk中的Watch机制的原理
    • Zk实现Leader选举

Zookeeper 概念

zooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 Hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper 的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、 功能稳定的系统提供给用户。ZooKeeper 包含一个简单的原语集, 提供 Java 和 C 的接口 ,ZooKeeper 代码版本中,提供了分布式独享锁、选举、队列的接口,代码在 zookeeper-3.4.3\src\recipes。其中分布锁和队列有 Java 和 C 两个版本,选举只有 Java 版本
Zookeeper 是一个分布式协调服务,可用于服务发现,分布式锁,分布式领导选举,配置管理等。
Zookeeper 提供了一个类似于 Linux 文件系统的树形结构(可认为是轻量级的内存文件系统,但只适合存少量信息,完全不适合存储大量文件或者大文件),同时提供了对于每个节点的监控与通知机制
ZooKeeper 提供了什么:文件系统和通知机制

ZooKeeper的应用场景使用场景

Zookeeper的出现,主要是为了满足分布式环境中,以上三种常见的场景需求,作为一个分布式的中间件而存在。它相当于是一个分布式开源的协调组件。简单理解,就相当于是一个裁判员的角色,专门负责协调和解决分布式系统中的各类问题。
总的来说,Zookeeper 就是经典的分布式数据一致性解决方案,致力于为分布式应用提供高性能、高可用,并且具有严格顺序访问控制能力的分布式协调服务。它底层通过基于 Paxos 算法演化而来的 ZAB 协议实现。
1.服务注册与订阅(共用节点)
2.分布式通知(监听ZNode)
3.服务命令(ZNode特性)
4.数据订阅、发布(Watcher)
5.分布式锁(临时节点)

  1. 集群管理
    Zookeeper 提供了 CP 的模型,来保证集群中的每个节点的数据一致性,当然Zk 本身的集群并不是 CP 模型,而是顺序一致性模型,如果要保证 CP 特性,需要调用 sync 同步方法。
    在多个节点组成的集群中,为了保证集群的 HA 特性,每个节点都会冗余一份数据副本。这种情况下需要保证客户端访问集群中的任意一个节点都是最新的数据。
  2. 分布式锁
    Zookeeper 提供了多种不同的节点类型,如持久化节点、临时节点、有序节点、容器节点等,其中对于分布式锁这个场景来说,Zookeeper 可以利用有序节点的特性来实现。除此之外,还可以利用同一级节点的唯一性特性来实现分布式锁。
    对某一个数据联系发出两个修改操作,两台机器同时收到请求,但是只能一台 机器先执行另外一个机器再执行,那么此时就可以使用 zk 分布式锁,一个机器接收到了 请求之后先获取 zk 上的一把分布式锁,就是可以去创建一个 znode,接着执行操作,然 后另外一个机器也尝试去创建那个 znode,结果发现自己创建不了,因为被别人创建了, 那只能等着,等等一个机器执行完了自己再执行。
    如何保证跨进程的共享资源的并发安全性,对于分布式系统来说也是一个比较大的挑战,而为了达到这样一个目的,必须要使用跨进程的锁也就是分布式锁来实现。
  3. Master 选举
    Zookeeper 可以利用持久化节点来存储和管理其他集群节点的信息,从而进行Master 选举机制。或者还可以利用集群中的有序节点特性,来实现 Master 选举。目前主流的 Kafka、Hbase、Hadoop 都是通过 Zookeeper 来实现集群节点的主从选举。
    在多个节点组成的集群中,为了降低集群数据同步的复杂度,一般会存在 Master和 Slave 两种角色的节点,Master 负责事务和非事务请求处理,Slave 负责非事务请求处理。但是在分布式系统中如何确定某个节点是 Master 还是 Slave,也成了一个难度不小的挑战。
    4.分布式协调:这个其实就是 zk 很经典的一个用法,简单来说,就好比,你系统 A 发送个 请求到 mq,然后 B 消费了之后处理。那 A 系统如何指导 B 系统的处理结果?用 zk 就可 以实现分布式系统之间的协调工作。A 系统发送请求之后可以在 zk 上对某个节点的值注 册个监听器,一旦 B 系统处理完了就修改 zk 那个节点的值,A 立马就可以收到通知,完美解决。
    5.配置信息管理:zk 可以用作很多系统的配置信息的管理,比如 kafka,storm 等等很多分 ,布式系统都会选用 zk 来做一些元数据,配置信息的管理,包括 dubbo 注册中心不也支持 zk 么。
    6.HA 高可用性:这个应该是很常见的,比如 hdfs,yarn 等很多大数据系统,都选择基于 zk 来发 HA 高可用机制,就是一个重要进程一般会主备两个,主进程挂了立马通过 zk 感知到切换到备份进程

zk的原理

ZooKeeper 是以 Fast Paxos 算法为基础的,Paxos 算法存在活锁的问题,即当有多个 proposer 交错提交时,有可能互相排斥导致没有一个 proposer 能提交成功,而 Fast Paxos 作了一些优化,通过选举产生一个 leader (领导者),只有 leader 才能提交 proposer,具体 算法可见 Fast Paxos。因此,要想弄懂 ZooKeeper 首先得对 Fast Paxos 有所了解。
ZooKeeper 的基本运转流程:
1、选举 Leader。
2、同步数据。
3、选举 Leader 过程中算法有很多,但要达到的选举标准是一致的。
4、Leader 要具有最高的执行 ID,类似 root 权限。
5、集群中大多数的机器得到响应并 follow选出的 Leader。
数据结构Znode:zookeeper数据采⽤树形层次结构,和标准⽂件系统⾮常相似,树中每个节点被称为Znode;
通知机制Watcher:zookeeper可以为所有的读操作(exists()、getChilden()及getData())设置watch,watch事件是⼀次性出发器,当watch的对象状态发⽣改变时,将会触发次对象上watch所对应的事件。watch事件将被异步的发送给客户端,并且zookeeper为watch机制提供了有序的⼀致性保证。
基本流程:分布式锁应用场景
1、传统的⼀主n从分布式系统,容易发⽣单点故障,传统解决方式是增加⼀个备⽤节点,定期给主节点发送Ping包,主节点回复ack,但是如果⽹络原因ack丢失,那么会出现两个主节点,造成数据混乱。
2、zookeeper的引⼊可以管理两个主节点,其中挂了一个,会将另外⼀个作为新的主节点,挂的节点回来时担任备⽤节点;

ZAB 协议

ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持崩溃恢复的原子广播协议。
ZAB 协议包括两种基本的模式:崩溃恢复和消息广播。
当整个 zookeeper 集群刚刚启动或者 Leader 服务器宕机、重启或者网络故障 导致不存在过 半的服务器与 Leader 服务器保持正常通信时,所有进程(服务 器)进入崩溃恢复模式,首 先选举产生新的 Leader 服务器,然后集群中 Follower 服务器开始与新的 Leader 服务器进 行数据同步,当集群中超过半数 机器与该 Leader 服务器完成数据同步之后,退出恢复模式 进入消息广播模 式,Leader 服务器开始接收客户端的事务请求生成事物提案来进行事务请求处理。

假如注册中心挂了,消费者还能调⽤服务吗,用什么调用的

  1. 注册中心对等集群,任意一台宕掉后,会自动切换到另一台
  2. 注册中心全部宕掉,服务提供者和消费者仍可以通过本地缓存通讯
  3. 服务提供者无状态,任一台 宕机后,不影响使用
  4. 服务提供者全部宕机,服务消费者会无法使用,并无限次重连等待服务者恢复

dubbo注册中心为什么选择 Zookeeper

可以选 Zookeeper,memcached,redis 等。
命名服务,服务提供者向 Zookeeper 指定节点写入 url,完成服务发布。
负载均衡,注册中心承载能力有限,而 Zookeeper 集群配合 web 应用很容易达到负载均衡。
zk 支持监听事件,特别适合发布/订阅场景,dubbo生产者和消费者就类似这场景。
数据模型简单,数据存在内存,可谓高性能
Dubbo 选择 Zookeeper 作为注册中心的原因有以下几点

  1. 分布式特性
    Zookeeper 是一个分布式协调服务,具有良好的分布式特性和可靠性,适合作为 Dubbo 的注册中心。它可以实现分布式服务的注册与发现,保证服务的高可用性和一致性。
  2. 节点管理
    Zookeeper 提供了节点管理和监控功能,可以轻松管理 Dubbo 微服务架构中的各个节点信息,包括服务提供者和消费者的注册信息、健康状态等。
  3. 顺序一致性
    Zookeeper 提供了顺序一致性的特性,能够确保节点数据的一致性和可靠性。这对于服务注册中心来说非常重要,可以有效避免数据同步的问题。
  4. Watcher 机制
    Zookeeper 支持 Watcher 机制,可以实现对节点变化的监听和通知,当服务提供者或消费者状态发生变化时,注册中心可以及时感知并通知相关节点。
  5. 可靠性和稳定性
    Zookeeper 是一个经过大规模应用验证的成熟分布式系统,具有良好的可靠性和稳定性,能够保证 Dubbo 微服务架构的正常运行。
  6. 社区支持
    Zookeeper 拥有活跃的社区和丰富的生态系统,可以获得及时的技术支持和更新迭代,能够满足 Dubbo 在注册中心方面的需求。
    综上所述,Zookeeper 作为 Dubbo 的注册中心具有良好的分布式特性、节点管理能力、一致性保证、Watcher 机制、稳定性和社区支持等优势,能够很好地满足 Dubbo 微服务架构的需求。因此,Dubbo 选择 Zookeeper 作为注册中心是基于以上考虑而做出的合理选择。

关于zookeeper部署的个数

你运行一个zookeeper也是可以的,但是在生产环境中,你最好部署3,5,7个节点。部署的越多,可靠性就越高,当然只能部署奇数个,偶数个是不可以的(zookeeper有这样一个特性:集群中只要有过半的机器是正常工作的,那么整个集群对外就是可用的。也就是说如果有2个zookeeper,那么只要有1个死了zookeeper就不能用了,因为1没有过半,所以2个zookeeper的死亡容忍度为0;同理,要是有3个zookeeper,一个死了,还剩下2个正常的,过半了,所以3个zookeeper的容忍度为1;同理你多列举几个:2->0;3->1;4->1;5->2;6->2会发现一个规律,2n和2n-1的容忍度是一样的,都是n-1,所以为了更加高效,何必增加那一个不必要的zookeeper呢)。你需要给每个zookeeper 1g左右的内存,如果可能的话,最好有独立的磁盘。 (独立磁盘可以确保zookeeper是高性能开发的。).如果你的集群负载很重,不要把zookeeper和regionserver运行在同一台机器上面。就像datanodes 和 tasktrackers一样

Zk分布式锁原理和实现

Zookeeper 是基于临时顺序节点以及 Watcher 监听器机制实现分布式锁的。
1.ZooKeeper 的每一个节点都是一个天然的顺序发号器。
2.ZooKeeper 节点的递增有序性可以确保锁的公平。
3.ZooKeeper 的节点监听机制,可以保障占有锁的传递有序而且高效
Zookeeper实现分布式锁原理:
Zookeeper节点路径不能重复 保证唯一性。 临时节点+事件通知
1.获取锁方法:
多个jvm同时在zk上创建一个临时节点/lockPath,
最终只能够有一个jvm创建临时节点成功,如果能够创建
临时节点成功jvm 表示获取锁成功能够正常执行业务逻辑,
如果没有创建临时节点成功的jvm,则表示获取锁失败。
获取锁失败之后,可以采用不断重试策略,重试多次
获取锁失败之后,当前的jvm就进入到阻塞状态。
2.释放锁方法:
直接调用.close();释放锁
因为采用临时节点,当我们调用close()方法的时候
该临时节点会自动被删除。
其他没有获取到锁的jvm,就会从新进入到获取锁的状态。
3.被唤醒的方法:
被阻塞的jvm(没有获取锁成功的jvm),采用事件监听的方式
监听到节点已经被删除的情况下,则开始从新进入到获取锁的状态。
Zookeeper 实现分布式锁的方法比较多,我们可以使用有序节点来实现,
1、来看这个图,每个线程或进程在 Zookeeper 上的/lock 目录下创建一个临时有序的节点表示去抢占锁,所有创建的节点会按照先后顺序生成一个带有序编号的节点。
2、线程创建节点后,获取/lock 节点下的所有子节点,判断当前线程创建的节点是否是所有的节点的序号最小的。
3、如果当前线程创建的节点是所有节点序号最小的节点,则认为获取锁成功。
4、如果当前线程创建的节点不是所有节点序号最小的节点,则对节点序号的前个节点添加一个事件监听,当前一个被监听的节点释放锁之后,触发回调通知,从而再次去尝试抢占锁。
ZooKeeper 是一种分布式协调服务,它可以帮助分布式系统中的各个节点进行协调和通信。ZooKeeper 的协调机制是通过一种称为 “ZNode” 的数据结构来实现的。
在 ZooKeeper 中,每个节点都被称为一个 ZNode,它可以有子节点和关联的数据。ZNode 可以被视为一种目录结构,其中每个节点都有一个路径。通过这个路径,可以找到节点的数据。
当使用 ZooKeeper 实现分布式锁时,可以使用一种称为 “顺序节点” 的机制。顺序节点是一种特殊的 ZNode,它会在创建时自动分配一个唯一的顺序编号。这个编号可以用来解决分布式锁的问题。
假设我们有一个需要被协调的任务,可以让多个进程都去创建 ZooKeeper 中的同一家目录下的一个子节点。由于是顺序节点,每个进程创建的子节点都会被分配一个唯一的编号。当一个进程创建了编号最小的子节点时,就认为它获得了锁,可以执行任务。其他进程在创建子节点时会被阻塞,等待前一个进程释放锁。
这个过程中,只要有一台机器能够成功创建子节点并获得锁,就可以完成任务。其他机器会继续等待,直到锁被释放。这样可以保证只有一个进程能够执行任务,实现分布式锁的效果。
总之,ZooKeeper 提供了分布式协调的机制,可以通过顺序节点实现分布式锁的功能,使得分布式系统中的任务可以被协调执行。

zk中的Watch机制的原理

Zookeeper是一个分布式协调组件,为分布式架构下的多个应用组件提供了顺序访问控制能力。
它的数据存储采用了类似于文件系统的树形结构,以节点的方式来管理存储在Zookeeper上的数据
Zookeeper提供了一个Watch机制,可以让客户端感知到Zookeeper Server上存储的数据变化,这样一种机制可以让Zookeeper实现很多的场景,比如配置中心、注册中心等。
Watch机制采用了Push的方式来实现,也就是说客户端和Zookeeper Server会建立一个长连接,一旦监听的指定节点发生了变化,就会通过这个长连接把变化的事件推送给客户端。
Watch的具体流程分为几个部分:
首先,是客户端通过指定命令比如exists、get,对特定路径增加watch
然后服务端收到请求以后,用HashMap保存这个客户端会话以及对应关注的节点路径,同时客户端
也会使用HashMap,存储指定节点和事件回调函数的对应关系。
当服务端指定被watch的节点发生变化后,就会找到这个节点对应的会话,把变化的事件和节点信息
发给这个客户端。客户端收到请求以后,从ZkWatcherManager里面对应的回调方法进行调用,完成事件变更的通知。
ZooKeeper 中的 Watch 机制是一种事件通知机制,在节点数据发生变化时,可以通知客户端进行相应的处理。以下是 ZooKeeper 中 Watch 机制的原理:

  1. 注册 Watcher: 客户端可以在对节点进行操作(比如创建、更新、删除等)时,通过 API 注册 Watcher 监听这些节点的变化。客户端在注册 Watcher 时需要指定 Watcher 类型(比如节点数据变化、子节点列表变化等)和具体的节点路径。
  2. Watch 持久化存储: 当节点数据发生变化时,ZooKeeper 会将变化事件保存到内存中,并向注册了对应 Watcher 的客户端发送通知,客户端接收到通知后会执行相应的回调函数。
  3. 一次性触发: 一旦 Watcher 被触发,它就会被删除,因此每个 Watcher 只能触发一次。如果客户端需要持续监视节点的变化,需要在收到通知后重新注册 Watcher。
  4. 版本号和序列号: ZooKeeper 使用版本号和序列号来标识节点的状态变化,客户端在注册 Watcher 时可以指定观察的节点状态版本号,当节点状态发生改变时,ZooKeeper 会比较版本号,并向注册的 Watcher 发送通知。
  5. Watch 事件类型: ZooKeeper 提供了多种 Watch 事件类型,包括数据变更通知、子节点列表变更通知等。客户端可以根据需要注册不同类型的 Watcher。
    总的来说,ZooKeeper 中的 Watch 机制通过注册、通知和回调实现节点状态变化的监听和处理。客户端可以利用 Watch 机制实现对节点数据变化的实时感知,并及时作出相应的处理。这种机制在分布式系统中非常重要,能够帮助实现实时的状态同步和协调。

Zk实现Leader选举

Zookeeper集群节点由三种角色组成,分别是Leader,负责所有事务请求的处理,以及过半提交的投票发起和决策。Follower,负责接收客户端的非事务请求,而事务请求会转发给Leader节点来处理, 另外,
Follower节点还会参与Leader选举的投票。Observer,负责接收客户端的非事务请求,事务请求会转发给Leader节点来处理,另外Observer节点不参与任何投票,只是为了扩展Zookeeper集群来分担读操作的压力
其次,Zookeeper集群是一种典型的中心化架构,也就是会有一个Leader作为决策节点,专门负责事务请求的处理和数据的同步。这种架构的好处是可以减少集群架构里面数据同步的复杂度,集群管理会更加简单和稳定。但是,会带来Leader选举的一个问题,也就是说,如果Leader节点宕机了,为了保证集群继续提供可靠的服务,Zookeeper需要从剩下的Follower节点里面去选举一个新的节点作为Leader,也就是所谓的Leader选举
具体的实现是,每一个节点都会向集群里面的其他节点发送一个票据Vote,这个票据包括三个属性。
epoch, 逻辑时钟,用来表示当前票据是否过期。
zxid,事务id,表示当前节点最新存储的数据的事务编号。
myid,服务器id,在myid文件里面填写的数字。
每个节点都会选自己当Leader,所以第一次投票的时候携带的是当前节点的信息。
接下来每个节点用收到的票据和自己节点的票据做比较,根据epoch、zxid、myid的顺序逐一比较,以值最大的一方获胜。比较结束以后这个节点下次再投票的时候,发送的投票请求就是获胜的Vote信息。然后通过多轮投票以后,每个节点都会去统计当前达成一致的票据,以少数服从多数的方式,最终获得票据最多的节点成为Leader。
以上就是我对这个问题的理解。
最后我再补充一下,选择epoch/zxid/myid作为投票评判依据的原因,我是这么理解的。
epoch ,因为网络通信延迟的可能性,有可能在新一轮的投票里面收到上一轮投票的票据,这种数据应该丢弃,否则会影响投票的结果和效率。
zxid,zxid越大,说明这个节点的数据越接近leader,所以用zxid做判断条件是为了避免数据丢失的问题。myid, 服务器id,这个是避免投票时间过长,直接用myid最大值作为快速终结投票的属性。

这篇关于Zookeeper详解(zk)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/837350

相关文章

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

mac中资源库在哪? macOS资源库文件夹详解

《mac中资源库在哪?macOS资源库文件夹详解》经常使用Mac电脑的用户会发现,找不到Mac电脑的资源库,我们怎么打开资源库并使用呢?下面我们就来看看macOS资源库文件夹详解... 在 MACOS 系统中,「资源库」文件夹是用来存放操作系统和 App 设置的核心位置。虽然平时我们很少直接跟它打交道,但了

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

Rust 数据类型详解

《Rust数据类型详解》本文介绍了Rust编程语言中的标量类型和复合类型,标量类型包括整数、浮点数、布尔和字符,而复合类型则包括元组和数组,标量类型用于表示单个值,具有不同的表示和范围,本文介绍的非... 目录一、标量类型(Scalar Types)1. 整数类型(Integer Types)1.1 整数字

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1