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…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
