当前位置: 首页 > news >正文

一文了解zookeeper

1.ZooKeeper是什么

简单来说,她是一个分布式的,开放源码的分布式应用程序协调服务

具体来说,他可以做如下事情:

  • 分布式配置管理:ZooKeeper可以存储配置信息,应用程序可以动态读取配置信息。
  • 分布式同步:ZooKeeper可以协调各个节点的同步,确保数据的一致性。
  • 命名服务:ZooKeeper可以作为一个命名服务,应用程序可以通过名字来找到所需的服务。
  • 集群管理:ZooKeeper可以用来管理分布式集群,协调各个节点的加入和退出。
  • Master选举:ZooKeeper可以用来实现Master选举,选择一个节点作为Master节点。
  • 分布式协调服务:Zookeeper提供了一些分布式协调服务,如分布式锁、唯一标识生成等,帮助系统中的各个组件之间进行协调。
  • 服务注册和发现:Zookeeper可以用于注册和发现系统中的服务,简化服务的部署和更新。
  • 负载均衡:Zookeeper可以用于动态地对请求进行负载均衡,以提高系统的可用性

2.Zookeeper的数据结构是怎么样的?

  • 数据模型

    • 数据是以目录结构的形式存储的

    • 每一个存储数据的节点都叫做Znode,每个Znode都有一个唯一的路径标识

      • 每一个节点都可以可有子节点(临时节点除外)

      • 节点中可以存储数据和状态信息

      • 每个Znode上可以配置监视器(watcher),用于监听节点中的数据变化

      • 节点不支持部分读写,而是一次性完整读写。

      • 每个znode被创建时都会带有一个ACL列表,用于决定谁可以对它执行何种操作

  • 节点类型

    • Znode有四种类型

      • PERSISTENT(持久节点)

        • 在节点创建后,就一直存在,直到有删除操作来主动清除这个节点——不会因为创建该节点的客户端会话失效而消失。

      • PERSISTENT_SEQUENTIAL(持久的连续节点)

        • 在ZooKeeper中,每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。

        • 在创建节点过程中,ZooKeeper会自动为给定节点名加上一个数字后缀,作为新的节点名(序列号会自动递增)。这个数字后缀的范围是整型的最大值。

      • EPHEMERAL(临时节点)

        • 临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉

      • EPHEMERAL_SEQUENTIAL(临时的连续节点)

        • 临时节点的生命周期和客户端会话绑定。注意创建的节点会自动加上编号(序列号会自动递增)。

3.Zookeeper集群中的角色有哪些?有什么区别?

  • ZK中主要有以下角色:

    • 领导者(leader)

      • 负责进行投票的发起和决议,更新系统状态。

      • 为客户端提供读和写服务

    • 跟随者(follower)

      • 在选主过程中参与投票

      • 为客户端提供读服务,转发写请求

    • 观察者(observer)

      • 可以接受客户端连接处理读请求,将写请求转发给leader

      • 但observer不参加投票过程,只同步leader的状态

      • observer的目的是为了扩展系统,提高zookeeper集群的读性能

        • Observer支持更多的客户端连接提高了zookeeper读性能的同时又不影响zookeeper的写性能

    • 客户端(client)

      • 请求发起方

4.Zookeeper是CP的还是AP的?

  • ZooKeeper职责

    • ZooKeeper作为分布式协调服务,它的职责是保证数据在其管辖下的所有服务之间保持同步、一致

    • 所以会牺牲可用性,会丢弃一些请求,消费者程序需要重新请求才能获得结果。

    • 所以是cp的

  • cp的体现

    • zookeeper的写操作是要经过半数以上的Follower确认才能够写成功的。那么当zookeeper集群中的节点越多时,zookeeper的写性能就越差。如果集群中的存活节点数低于总结点数的一半,那么整个集群将无法接受新的写 请求。

    • 在 ZK 的 master 选举过程中,在新的Master被选举出来之前,整个集群也无法接受新的写请求。

      • 如果 ZooKeeper下所有节点都断开了,或者集群中出现了网络分割的故障,那么ZooKeeper 会将它们都从自己管理范围中剔除出去,外界就不能访问到这些节点了,即便这些节点本身是“健康”的,可以正常提供服务的;

5.Zookeeper是选举机制是怎样的?

  • 提名和投票

    • 在提名过程中,所有的投票者都遵守一个原则,那就是遇强投强。

      • 在Zookeeper中,通过数据是否足够新来判断这个节点是不是够强,在 Zookeeper 中以事务id(zxid)来标识数据的新旧程度,节点的zxid越大代表这个节点的数据越新,也就代表这个节点能力越强。

        • 那么在投票过程中,节点首先会认为自己是最强的,所以他会在投票时先投自己一票,然后把自己的投票信息广播出去,这里面包含了zxid和sid,zxid就是自己的事务ID,sid就是标识出自己是谁的唯一标识。

        • 这样集群中的节点们就会不断收到别人发过来的投票结果,然后这个节点就会拿别人的zxid和自己的zxid进行比较,如果别人的zxid更大, 说明他的数据更新,那么就会重新投票,把zxid和sid都换成别人的信息再发出去。

      • 选举过程:如果一个候选者获得了大多数节点投票,它就会成为新的Leader,否则,所有节点会继续下一个选举周期

        • 选举过程分为多个轮次,每个轮次被称为一个"选举周期"。在每个选举周期中,节点根据投票数来选择新的Leader候选者。如果一个候选者获得了大多数节点(超过半数)的投票,那么它就会成为新的Leader。否则,没有候选者能够获得足够的投票,那么这个选举周期失败,所有节点会继续下一个选举周期

6.如何用Zookeeper实现分布式锁?

  • 基于zookeeper临时有序节点可以实现的分布式锁。

    • 客户端首先连接到 ZooKeeper 集群

    • 客户端在特定路径下创建临时有序节点

      • 例如,如果路径为 /lock,那么客户端创建的节点可能是 /lock/lock-00000001,下一个创建的节点可能是 /lock/lock-00000002,依此类推。

    • 通过序号获取锁

      • 客户端获取 /lock 目录下所有子节点,并按序号排序。

      • 检查自己创建的节点是否是序号最小的节点。如果是,则获取锁。

    • 等待锁

      • 如果当前客户端的节点不是序号最小的节点,那么找到比自己序号小的节点,设置监听器等待它被删除。

      • 当上一个节点被删除时,ZooKeeper 会通知客户端,此时客户端重新检查自己是否成为了序号最小的节点。

    • 释放锁

      • 完成任务后,删除自己创建的临时节点,从而释放锁

7.Zookeeper是如何保证创建的节点是唯一的?

第6点说到分布式锁通过Zookeeper创建节点实现的,那么如何保证创建的节点是唯一的

  • Zookeeper通过两个手段来保证节点创建的唯一性:

    • 所有的写请求都会由Leader进行,即使是请求到Follower节点,也会被转发到Leader节点上执行

    • 通过加锁(synchronized)和CAS(ConcurrentHashMap)操作,保证了并发情况下只有一个线程可以添加节点成功。

      • 先是通过synchronized锁,将父节点锁住,然后再在锁里面判断是否已经存在节点,如果已存在,直接抛异常,如果不存在,则向维护了节点的map——NodeHashMap中添加当前节点。

8.Zookeeper的watch机制是如何工作的?

  • watch机制是什么

    • 能够让应用程序监听Zookeeper上节点的变化,从而及时做出响应。

  • Zookeeper的watch机制是如何工作的?

    • 客户端连接到Zookeeper服务端,客户端创建一个ZkWatcherManager实例,用于管理客户端中所有的watcher。

    • 当客户端想要监控某个znode节点时,它可以调用ZkWatcherManager中的方法创建watcher并将其注册到客户端中。客户端将watcher的信息发送到Zookeeper服务端。

    • Zookeeper服务端接收到客户端发送的watcher信息后,会将该watcher信息交给WatchManager处理。WatchManager会将该watcher注册到相应的znode节点上,并将watcher相关的信息保存在内存中。

    • 当znode节点发生变化时,WatchManager会通知Zookeeper Server

    • Zookeeper Server会根据变化类型通知相应的客户端,告知它们发生了哪些变化。

    • 当客户端接收到Zookeeper Server的通知后,ZkWatcherManager会根据watcher的类型(data watcher或child watcher)来触发相应的事件处理方法,例如data watcher会触发processDataChanged()方法,child watcher会触发processChildChanged()方法等。

相关文章:

一文了解zookeeper

1.ZooKeeper是什么 简单来说,她是一个分布式的,开放源码的分布式应用程序协调服务 具体来说,他可以做如下事情: 分布式配置管理:ZooKeeper可以存储配置信息,应用程序可以动态读取配置信息。分布式同步&a…...

算法题(67):最长连续序列

审题: 需要我们在O(n)的时间复杂度下找到最长的连续序列长度 思路: 我们可以用两层for循环: 第一层是依次对每个数据遍历,让他们当序列的首元素。 第二层是访问除了该元素的其他元素 但是此时时间复杂度来到…...

大中型企业专用数据安全系统 | 天锐蓝盾终端安全 数据安全

天锐蓝盾系列产品是专门为大中型企业量身定制的数据安全防护产品体系,涵盖天锐蓝盾DLP、天锐蓝盾终端安全管理系统、天锐蓝盾NAC以及其他搭配产品,致力于实现卓越的数据安全防护、施行严格的网络准入控制以及构建稳固的终端安全管理体系。通过全方位的防…...

Deepseek解读 | UE像素流送与实时云渲染技术的差别

为了实现UE引擎开发的3D/XR程序推流,绝大多数开发者会研究像素流送(Pixel Streaming)的使用方法,并尝试将插件集成在程序中。对于短时、少并发、演示场景而言,像素流送可以满足基本需求。当3D/XR项目进入落地交付周期后…...

CTFSHOW-WEB入门-PHP特性109-115

题目:web 109 1. 题目: 2. 解题思路:题目要求获得两个参数,v1 v2,if语句中的意思是要求两个参数都包含字母,条件满足的话,执行 echo new 类名(方法()&#xf…...

模糊综合评价法:原理、步骤与MATLAB实现

引言 在复杂决策场景中,评价对象往往涉及多个相互关联的模糊因素。模糊综合评价法通过建立模糊关系矩阵,结合权重分配与合成算子,实现对多因素系统的科学评价。本文详细讲解模糊综合评价法的数学原理、操作步骤,并辅以MATLAB代码…...

【数据结构-红黑树】

文章目录 红黑树红黑树介绍红黑树的五个基本性质红黑树的平衡原理红黑树的操作红黑树的操作 代码实现节点实现插入和查询操作 红黑树 红黑树介绍 红黑树(Red-Black Tree)是一种自平衡的二叉查找树(Binary Search Tree, BST)&…...

【STM32】舵机SG90

1.舵机原理 舵机内部有一个电位器,当转轴随电机旋转,电位器的电压会发生改变,电压会带动转一定的角度,舵机中的控制板就会电位器输出的电压所代表的角度,与输入的PWM所代表的角度进行比较,从而得出一个旋转…...

【Linux】Socket编程—TCP

🔥 个人主页:大耳朵土土垚 🔥 所属专栏:Linux系统编程 这里将会不定期更新有关Linux的内容,欢迎大家点赞,收藏,评论🥳🥳🎉🎉🎉 文章目…...

c++11 for auto不定参数

数量不定的模板参数。参数分为一个和一包两部分。 ​ 冒号的左边声明一个变量。右手边必须是一个容器。从容器(某种数据结构)中找出每一个元素设置到左边这个变量。11之前可以用容器的迭代器去取数据。或者标准库里的foreach...

C#+redis实现消息队列的发布订阅功能

代码 参考c#redis stream实现消息队列以及ack机制文章的思路&#xff0c;实现 SubscribeAttribute.cs using System;namespace DotnetQueue.Attributes {/// <summary>/// 订阅特性/// </summary>[AttributeUsage(AttributeTargets.Method, Inherited false)]pu…...

Docker容器基本操作

容器的基本操作 操作命令&#xff08;全&#xff09;命令&#xff08;简&#xff09;容器的创建docker container run <image name>docker run <image name>容器的列出&#xff08;up&#xff09;docker container lsdocker ps容器的列出&#xff08;up和exit&…...

从无序到有序:上北智信通过深度数据分析改善会议室资源配置

当前企业普遍面临会议室资源管理难题&#xff0c;预约机制不完善和临时会议多导致资源调度不合理&#xff0c;既有空置又有过度拥挤现象。 针对上述问题&#xff0c;上北智信采用了专业数据分析手段&#xff0c;巧妙融合楼层平面图、环形图、折线图和柱形图等多种可视化工具&a…...

总结:使用JDK原生HttpsURLConnection,封装HttpsUtil工具类,加载自定义证书验证,忽略ssl证书验证

总结&#xff1a;使用JDK原生HttpsURLConnection&#xff0c;封装HttpsUtil工具类&#xff0c;加载自定义证书验证&#xff0c;忽略ssl证书验证 一HttpsUtil工具类二SSLUtil工具类 一HttpsUtil工具类 package com.example.util;import javax.net.ssl.HttpsURLConnection; impo…...

重新定义人机关系边界,Soul以AI社交构建多元社交元宇宙

近年来,AI Native应用的兴起已逐渐成为大众关注的焦点。在此背景下,Soul App的首席技术官陶明在极客公园IF2025创新大会上,发表了一场主题为“人机关系的新边界,Soul如何定义AI社交未来”的演讲。他分享了Soul在人工智能领域内的最新技术进展和战略规划,同时也将Soul社交元宇宙…...

HTTP 参数污染(HPP)详解

1. 什么是 HTTP 参数污染&#xff08;HPP&#xff09;&#xff1f; HTTP 参数污染&#xff08;HTTP Parameter Pollution&#xff0c;简称 HPP&#xff09;是一种 Web 应用攻击技术&#xff0c;攻击者通过在 HTTP 请求中注入多个相同的参数来绕过安全控制或篡改应用逻辑&#…...

阿里云轻量服务器docker部署nginx

拉取nginx docker镜像 sudo docker pull nginx创建以下挂载目录及文件 用户目录下&#xff1a;conf html logs conf: conf.d nginx.conf html: index.html conf.d: default.confnginx.conf添加文件内容 events {worker_connections 1024; }http {include /etc/ngi…...

(萌新入门)如何从起步阶段开始学习STM32 —— 我应该学习HAL库还是寄存器库?

概念 笔者下面需要介绍的是库寄存器和HAL库两个重要的概念&#xff0c;在各位看完之后&#xff0c;需要决定自己的学习路线到底是学习HAL呢&#xff1f;还是寄存器呢&#xff1f;还是两者都学习呢&#xff1f; 库寄存器 库寄存器就是简单的封装了我们对寄存器的操作&#xf…...

Windchill开发-电子仓相关对象信息查询SQL

电子仓相关对象信息查询SQL 一、说明二、数据表信息三、数据表字段说明3.1 HOLDERTOCONTENT3.1.1 对象类型3.1.2 存储类型 3.2 APPLICATIONDATA3.2.1 类别3.2.2 与对象的角色关系3.2.3 存储方式3.2.4 其他字段 3.3 URLDATA3.4 STREAMDATA3.5 FVITEM3.6 FVMOUNT3.6.1 安装状态3.…...

MySQL 数据库定时任务及进阶学习

一、引言 在当今数字化时代&#xff0c;数据管理的高效性和自动化至关重要。MySQL 作为一款广泛应用的开源关系型数据库管理系统&#xff0c;提供了强大的功能来满足各种数据处理需求。其中&#xff0c;定时任务执行功能对于自动化数据操作、维护数据完整性以及优化系统性能具…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...