zookeeper入门学习
zookeeper入门学习
zookeeper应用场景
- 分布式
协调组件
客户端第一次请求发给服务器2,将flag值修改为false,第二次请求被负载均衡到服务器1,访问到的flag也会是false
一旦有节点发生改变,就会通知所有监听方改变自己的值,保持数据的一致性(watch机制) => 会不会改变的太频繁了
- 分布式锁
后面讲述
- 无状态化的实现
比如我的登录信息,单独放在哪一台主机都不合适,这时,就可以将登录信息放在zookeeper中
配置与命令
- zoo.cfg配置文件说明(单节点)
dataDir: zookeeper的数据存储在内存中,为防止数据丢失,需持久化到磁盘
- 事务持久化:保存执行命令
- 快照持久化:保存内存快照
与Redis不同,这两种模式zk都默认开启了,在恢复时,先恢复快照文件中的数据到内存中,再用日志文件做增量恢复。
- 操作命令
内部数据模型
zk结构
类似Linux的文件目录:
zk的数据存储基于节点,这种节点叫做Znode,但不同于树的节点,Znode节点的引用方式是路径引用,类似文件路径:/动物/猫
创建节点:create /test1,create /test1/sub1
存储数据(如上文说的存储session信息):create /test2 session
获取数据: get /test2
Znode结构
包含4部分:
- data:保存数据
- acl:权限
- c、d: create、delete权限,允许在该节点下创建、删除子节点
- w、r:读写权限
- a:允许对该节点进行acl权限设置
- stat:描述当前znode的
元数据(get -s /tets2可查看,创建时间、版本号等) - child:当前节点的子节点
Znode类型
zk节点创建(本文都是通过zkCli客户端创建,java有一个curator客户端,这里不做记录)
- 持久节点:创建出的节点,在会话结束后依然存在
- 持久序号节点:创建的节点会有一个数值,越晚创建数值越大,适用于分布式锁场景
create /test3会提示/test3已存在create -s /test3会创建/test300000000001节点
- 临时节点:会话结束后自动删除,通过这个特性,zk可以实现
服务注册与发现(注册中心)的效果
临时节点不断发送会话续约心跳,当停止发送心跳后,zk服务器的定时任务会发现这些未续约的session并删除:
服务注册与发现:服务停供者P连接zk,创建临时的znode,这样客户端C就可以访问到这个服务了,但如果这个服务P下线了,临时znode节点被删除,客户端就不能访问服务P了
临时节点创建:create -e /test4
- 临时序号节点: 用于分布式临时锁场景,
create -e -s /tets4 - 容器节点:容器节点中没有任何子节点,则该容器会被删除(60s后)
- TTL节点:指定节点的到期时间,到期后zk被定时删除
znode删除
- 普通删除
- 乐观锁删除:
delete -v 0 /test2,删除前不上锁,删除时如果发现版本号变化,则删除失败
zk分布式锁
分布式锁:一个请求发送服务器1,zk服务器对资源A上锁,后续当请求负载均衡到服务器2,服务器2
上的资源A也需要被锁
读锁:上读锁的前提是资源A没有上写锁
写锁:上写锁的前提是资源A没有上任何锁
- zk上读锁:
如:
- 请求1访问服务器(不论是1还是2)上的资源A, 这个请求被线程池中的x号线程接管
- /lock_node(该节点专门用来上锁的)创建子节点 read0001(这个节点的数据应该就是资源A),表示资源A已被上读锁了
- 然后第二个并发请求过来,被线程池中的y号线程接管,如果判断1号节点(最小节点)上的是写锁,则上读锁失败
- 如果1号节点是写锁,2号节点将向1号节点注册一个watch,监听1号节点被释放
- zk上写锁:
- 羊群(惊群)效应
如果有100个并发,都在上写锁,那么后面的99个节点都要监听第一个节点,等1号节点释放了,另外的98个节点又要监听2号节点
解决:链式监听,当前节点监听上一个节点是否释放
watch机制
watch机制:可以理解成注册再特定znode上的触发器,当这个znode改变时,也就是调用了create、delete、setDate
等命令时,会触发znode上注册的对应事件,请求watch的客户端会接受到异步通知。
具体交互:
zk集群
主要讲述集群的选举和数据同步
集群角色
- leader:处理集群的所有事务请求,一个集群只能有一个leader
- follower:只能处理读请求,参与leader选举
- observer:只能处理读请求,提升集群读的性能,不参与leader选举
搭建集群
搭建4个节点,其中一个observer
- 创建节点的myid
- 编写4个zoo.cfg
注意配置三类端口:
- clientPort:开放给客户端的端口
- server.2001:集群通信端口,主要用于同步
- server.3001:集群选举端口
- 启动4台zk
- 客户端链接zk集群
如果只填一个zk服务器,那就和单机集群没区别了,zk服务器挂了后,就不会连其他zk服务器了
ZAB协议
原子广播协议:zk为了保证数据的一致性,使用了ZAB(Zookeeper Atomic Broadcast)协议,这个协议解决了zk崩溃恢复和主从数据同步的问题
zk集群的主节点一般不给客户端直接连,而是用于服务器数据同步
ZAB协议定义的四种节点状态
- looking(巡视):选举状态,zk集群的节点在上线时,会进入到looking状态
- following:follower节点所处的状态
- leading:leader节点所处的状态
- observing:observer节点所处的状态
集群上线时的Leader选举过程
节点成为leader的条件,投票箱中有超半数的投票,所以zk集群中的结点数量一般是奇数个。
如三台zk服务器,主要票数达到2就能完成leader选举,而如果是4台,则需要票数达到3。
对于上文的集群配置,第二台服务器会成为leader,选举过程如下:
- 选票格式:
- myid:
- 选举时,如果事务id一样,就投myid比较大的
- zXid:
- 节点每进行一次增删改,这个事务id就会加1,因此这个事务id就描述了这个节点发生了多少次的变化
- 每次选举先比较zXid,因为如果zXid大,就表示这个节点的数据更新
- 开始选举
- 第一台服务器上线,不会进行选举
- 第二台服务器上线,开始选举
-
第一轮:
-
第二轮:第一轮还没选出票数过半的节点,继续选举
- 此时,节点3可能也启动了,那么节点1和节点2也会收到节点3的投票,第二轮结束后,如果没选出leader则还会进行第三轮选举(这种情况暂不考虑)
- 第二轮投票结束后,leader选举成功,选举过程结束
-
- 第三台服务器上线,发现leader已经存在了,自动成为follower
崩溃时的leader选举
leader建立完成后,leader周期性地向follower发送心跳(ping命令),当leader崩溃后,follower发现通道已关闭,
于是进入到looking状态,重新进行选举,此时集群不能对外提供服务
主从数据同步
客户端连接一个zk服务器(follower),向该服务器写了一个数据DA,那么这个数据需要同步到所有服务器
按步骤解释:
- 第2步:leader先将该数据
DA存储到自己的磁盘,而不能直接写内存,要写就所有服务器一起写- 这里的
所有是指集群一切正常的情况下
- 这里的
- 第4步:follower收到数据后,不能直接写内存,会造成有的follower中有数据
DA,有的却没有,造成数据不同步 - 第5,6,7步:只有leader收到的ack消息达到服务器数量的
半数以上,才能将数据写到内存- 为什么leader收到ack消息数量达到半数以上即可:
- 假设leader需要收到全部follower的ack消息,如果有少数几台服务器网络卡了,甚至掉线了,那么zk集群的写效率将会很低
- 为什么leader收到ack消息数量达到半数以上即可:
两阶段提交:写数据文件,再写内存的方式,防止有的服务器有数据,有的却没有
强一致性: 如果集群中的一台服务器与leader的通信出现故障了,那么这台服务器将暂时无法同步数据DA,但是等通信恢复了,数据DA还是会同步到这台服务器,现实各个服务器数据的顺序一致性
zk数据一致性
CAP理论
- 一致性(Consistency): 更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一直
- 可用性(Availability): 即服务一直可用,且是正常响应时间
- 分区容错性(Partition tolerance): 分布式系统在遇到某节点或网络分区故障时,仍能对外提供满足一致性或可用性的服务。 => 避免单点故障,就要进行冗余部署,冗余部署就相当于服务的分区,这样分区就具备了容错性。
这三项最多只能满足两项:
- CA: 比如银行、金融行业,发生网络故障时,宁愿停止服务(但其实不满足P,而不叫分布式系统了,因为不存在分区了)
- CP: 发生故障时,只读不写
- AP: 分布式系统一般都是尽量满足AP,舍弃C(退而求其次保证最终一致性)
如我向银行服务A存储了5k元,在服务器B同步服务器A的过程中(如网络阻塞),我查询资金的请求可能经过分布式网关被转发到了服务B:
- 若允许访问,则是追求AP,但此时两台服务器的数据是不一致
- 若不允许访问,则是追求CP,则此时银行系统是不可用的
BASE理论
CAP的一致性是强一致性,而Base理论的核心思想是即使无法做到强一致性,但可以采用适合的方式达到最终一致性
- 基本可用性:分布式系统出现故障时,允许损失部分可用性,保证核心可用。
- 双十一为了应对激增的流量,只提供浏览、下单功能,注册、评论等功能关闭
- 软状态:系统允许存在中间状态,而该中间状态不影响系统整体可用性。分布式存储中,一般一份数据会有至少三个副本,允许不同节点间副本同步的演示就是软状态的体现。
- 如双十一处于可用又不可用的中间状态
- 又比如客户端向zk的leader写了数据,但立马查询follower时数据查询不到,这个同步的过程系统就处于软状态,同步完后,就能查询到数据了
- 最终一致性:系统中所有副本经过一定时间后,最终能达到一致的状态。最终一致性是弱一致性的一种特殊情况
- 双十一过去后,电商系统会恢复如初
zk追求的一致性
zk追求的是CP,在进行选举时,集群不对外开放,选举完成后要进行数据同步,这一不可用的过程通常在30s~120s之间。
zk在收到半数以上的ack后(如果要收到全部follower的ack,会降低集群的同步效率),就会写内存,因此会造成部分follower没有同步数据:
zk在数据同步时,追求的并不是强一致性,而是顺序一致性(事务id的单调递增),如集群启动后,写如第一个数据后,写成功的服务器事务id为1,而写失败的服务器事务id为0,等再写第二个数据时,
网络阻塞的服务器一定会同步第一个数据,再同步第二个数据。也就是如果一个事务A在事务B之前执行,那么任何情况下,事务A都必须在事务B之前执行。
如果不保证顺序执行,同步失败过的服务器SA可能会产生旧值,比如第一个同步a=1失败,后续同步a=2,此时各个服务的a都应该是2,但SA由于错序执行,a又变成1了。
个人猜想:在分布式锁中,当服务在同步/znode时,各个服务器都加了锁/znode/write001,然后又释放了,如果SA同步失败后,又乱序执行,会导致这台服务器永远也访问不了这个数据了。
zk的NIO与BIO
早期zk用NIO,后面的版本用netty
NIO:同步非阻塞的网络模型(类似多路复用)
- zk服务器连接多个客户端:所有客户端的请求发送给zk服务后,就继续执行其他动作
- 客户端监听多个zk节点:zk服务的多个事件发送客户端后,客户端处理这些事件的同时,继续监听
BIO:
- 在选举投票时,各个服务器需要建立socket连接
- leader向follower发送心跳,也需要建立socket连接
相关文章:
zookeeper入门学习
zookeeper入门学习 zookeeper应用场景 分布式协调组件 客户端第一次请求发给服务器2,将flag值修改为false,第二次请求被负载均衡到服务器1,访问到的flag也会是false 一旦有节点发生改变,就会通知所有监听方改变自己的值&#…...
VirtualEnv 20.24.0 发布
导读VirtualEnv 20.24.0 现已发布,VirtualEnv 用于在一台机器上创建多个独立的 Python 运行环境,可隔离项目之间的第三方包依赖,为部署应用提供方便,把开发环境的虚拟环境打包到生产环境即可,不需要在服务器上再折腾一…...
LabVIEW开发高压航空航天动力系统爬电距离的测试
LabVIEW开发高压航空航天动力系统爬电距离的测试 更多电动飞机MEA技术将发电,配电和用电集成到一个统一的系统中,提高了飞机的可靠性和可维护性。更多的电动飞机使用更多的电能来用电动替代品取代液压和气动系统。对车载电力的需求不断增加,…...
【论文阅读】基于深度学习的时序异常检测——Anomaly Transformer
系列文章链接 数据基础:多维时序数据集简介 论文一:2022 Anomaly Transformer:异常分数预测 论文二:2022 TransAD:异常分数预测 论文链接:Anomaly Transformer.pdf 代码链接:https://github.co…...
Java并发总结
1.创建线程三种方式 Runnable.Callable接口使用继承Thread类的方式创建多线程Runnable 和Callable区别 Callable规定(重写)的方法是call(),Runnable规定(重写)的方法是run()。Callable的任务执行后可返回值࿰…...
视频汇聚平台EasyCVR视频广场侧边栏支持拖拽
为了提升用户体验以及让平台的操作更加符合用户使用习惯,我们在EasyCVR v3.3版本中,支持面包屑侧边栏的广场视频、分组列表、收藏这三个模块拖拽排序,并且该操作在视频广场、视频调阅、电子地图、录像回放等页面均能支持。 TSINGSEE青犀视频…...
MyCat分片规则——范围分片、取模分片、一致性hash、枚举分片
1.范围分片 2.取模分片 范围分片和取模分片针对数字类型的字段可以,但是针对于字符串类型的字段时。这两种就不适用了。 3.一致性hash 4.枚举分片 默认节点指的是,如果我们向数据库表插入数据的时候,超出了这个枚举值,那么默认向…...
设计模式行为型——备忘录模式
目录 什么是备忘录模式 备忘录模式的实现 备忘录模式角色 备忘录模式类图 备忘录模式举例 备忘录模式代码实现 备忘录模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是备忘录模式 备忘录模式(Memento Pattern)又叫做快照模式&#x…...
Parquet存储的数据模型以及文件格式
文章目录 数据模型Parquet 的原子类型Parquet 的逻辑类型嵌套编码 Parquet文件格式 本文主要参考文献:Tom White. Hadoop权威指南. 第4版. 清华大学出版社, 2017.pages 363. Aapche Parquet是一种能有效存储嵌套数据的列式存储格式,在Spark中应用较多。 …...
Go和Java实现访问者模式
Go和Java实现访问者模式 我们下面通过一个解压和压缩各种类型的文件的案例来说明访问者模式的使用。 1、访问者模式 在访问者模式中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随 着访问者改变而…...
想要通过软件测试的面试,都需要学习哪些知识
很多人认为,软件测试是一个简单的职位,职业生涯走向也不会太好,但是随着时间的推移,软件测试行业的变化,人们开始对软件测试行业的认知有了新的高度,越来越多的人开始关注这个行业,开始重视这个…...
MySQL的索引使用的数据结构,事务知识
一、索引的数据结构🌸 索引的数据结构(非常重要) mysql的索引的数据结构,并非定式!!!取决于MySQL使用哪个存储引擎 数据库这块组织数据使用的数据结构是在硬盘上的。我们平时写的代码是存在内存…...
普及100Hz高刷+1ms响应 微星发布27寸显示器:仅售799元
不论办公还是游戏,高刷及低响应时间都很重要,微星现在推出了一款27寸显示器PRO MP273A, 售价只有799元,但支持100Hz高刷、1ms响应时间,还有FreeSync技术减少撕裂。 PRO MP273A的100Hz高刷新率是其最大的卖点之一&#…...
Java课题笔记~6个重要注解参数含义
1、[掌握]Before 前置通知-方法有 JoinPoint 参数 在目标方法执行之前执行。被注解为前置通知的方法,可以包含一个 JoinPoint 类型参数。 该类型的对象本身就是切入点表达式。通过该参数,可获取切入点表达式、方法签名、目标对象等。 不光前置通知的方…...
Windows Docker Desk环境时区问题导致的时间问题解决?
大多docker镜像为了保持镜像大小,采用了alpine linux。 但经常由于时区问题导致时间不准确,解决也很简单。 1.查看事件文件 cd /usr/share/zoneinfo 2.复制时区文件 将文件copy到 /etc/localtime 路径下即可(重庆时区,上海也…...
SpringBoot复习:(22)ConfigurationProperties和@PropertySource配合使用及JSR303校验
一、配置类 package cn.edu.tju.config;import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component;Component ConfigurationPropertie…...
Spring IoC (控制反转)
IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则。 Spring 通过 IoC 容器来管理所有 Java 对象的实例化和初始化,控制对象与对象之间的依赖关系。…...
安卓下模拟渲染EGLImageKHR
创建AHardwareBuffer并填充颜色 AHardwareBuffer_Desc desc = {static_cast<uint32_t>(screenW),static_cast<uint32_t>(screenH),...
Spring MVC 框架学习总结
文章目录 初步认识 Spring MVC 框架 一、初识 Spring MVC 框架 二、 三、 四、 五、 六、 七、 八、 九、...
2、简单上手+el挂载点+v-xx(v-text、v-html、v-on、v-show、v-if、v-bind、v-for)
官网: vue3:https://cn.vuejs.org/ vue2:https://v2.cn.vuejs.org/v2/guide/ 简单上手: 流程: 导入开发版本的Vue.js <!--开发环境版本,包含了有帮助的命令行警告--> <script src"https…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
