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

Zookeeper

zookeeper是一个分布式协调服务。所谓分布式协调主要是来解决分布式系统中多个进程之间的同步限制,防止出现脏读,例如我们常说的分布式锁。

zookeeper中的数据是存储在内存当中的,因此它的效率十分高效。它内部的存储方式十分类似于文件存储结构,采用了分层存储结构。但是它和文件存储结构的区别是,它的各个节点中是允许存储数据的,需要注意的是zk的每个节点存储数据不能超过1M。它的内存数据结果如下图:

可以通过不同的路径访问到不同的节点,因为它是分层结构,我们也可以通过某一个父节点,获取到该节点下的所有子节点信息。

zk只提供了几个简单的api,但是我们可以通过灵活使用这些api的组合,来实现我们复杂的业务要求:

  1. create:创建一个新节点,通过指定路径的方式创建节点,例如创建路径为/A/A1/demo,则会在A1节点下创建一个demo节点;
  2. delete:删除节点,通过路径的方式删除节点,如果删除路径为/A/A1/demo,则会删除A1节点下的demo节点;
  3. exists:判断指定路径下的节点是否存在,例如判断路径为/A/A1/demo,则会判断A1节点下的demo节点是否存在;
  4. get:获取指定路径下某个节点的值是什么,例如获取路径为/A/A1/demo,则会获取A1节点下的demo节点的值什么;
  5. set:为指定路径的节点进行赋值操作,例如修改路径为/A/A1/demo,则会修改A1节点下的demo节点的值;
  6. get children:获取指定路径节点下的子节点信息,例如获取路径为/A,则会获取A节点下的A1和A2节点;
  7. sync:获取到同步数据,这个涉及到了zk的原理,zk集群属于最终一致性,调用该方法,可以获取到最终的结果值,如果不使用该方法,在查询的时候可能获取到的值是中间值;

zk中创建的节点分为两种:永久性节点和临时性节点。永久性节点即创建以后,在不执行delete命令的前提下,该节点是永久存在的;而临时节点与session有关,每个客户端与zk建立链接的时候会生成一个session,这个session不会因为链接zk服务器节点的变化而变化,只有当客户端断开连接以后,该session才会消失,而临时节点会随着session的消失而消失。

 zk拥有watch机制,也就是监视机制,可以支持响应式编程模式,它可以对某个路径的终节点及其子节点的变更进行监视,当其发生变更以后,会调用注册的callback方法,然后进行具体的业务逻辑。例如监测路径为/A/A1,那么它会加测A1节点,以及附属于A1的所有子节点,这个子不单单只一层子节点,是指所有层的子节点。
 

zk拥有以下几个重要特性:

        1)顺序一致性:来自客户端的相关指令会按照顺序执行,不会出现乱序的情况,客户端发送到服务的指令1->2->3->4,那个这些指令就会按照顺序执行;

        2)原子性:更新只有成功和失败,没有中间状态;

        3)可靠性:也可以称之为持久性,节点更新以后,在下次更新之前,它的数据不会发生变更;

        4)准实时性:也可以称之为最终一致性,在zk集群中,一个客户端修改了其中的一个节点,一定时间以后,所有可用的服务对应的节点都会变成更新以后的值。
 

分布式锁

zk作为分布式协调服务,它的一个很大的作用就是用来实现分布式锁。zk节点存在临时节点,它的生命周期与session有关,它会随着session的消失而消失,这就解决了分布式锁时可能出现的死锁问题。

Zookeeper 是基于临时顺序节点以及 Watcher 监听器机制实现分布式锁的

具体流程

  1. 一把分布式锁通常使用一个 Znode 节点表示;如果锁对应的 Znode 节点不存在,首先创建 Znode 节点。这里假设为 /test/lock,代表了一把需要创建的分布式锁。
  2. 抢占锁的所有客户端,使用锁的 Znode 节点的子节点列表来表示;如果某个客户端需要占用锁,则在 /test/lock 下创建一个临时顺序的子节点。比如,如果子节点的前缀为 /test/lock/seq-,则第一次抢锁对应的子节点为 /test/lock/seq-000000001,第二次抢锁对应的子节点为 /test/lock/seq-000000002,以此类推。
  3. 当客户端创建子节点后,需要进行判断:自己创建的子节点,是否为当前子节点列表中序号最小的子节点。如果是,则加锁成功;如果不是,则监听前一个 Znode 子节点变更消息,等待前一个节点释放锁。
  4. 一旦队列中的后面的节点,获得前一个子节点变更通知,则开始进行判断,判断自己是否为当前子节点列表中序号最小的子节点,如果是,则认为加锁成功;如果不是,则持续监听,一直到获得锁。
  5. 获取锁后,开始处理业务流程。完成业务流程后,删除自己的对应的子节点,完成释放锁的工作,以方面后继节点能捕获到节点变更通知,获得分布式锁。

ZooKeeper 分布式锁的优缺点

这里把 Zookeeper 与 Redis 实现分布式锁对比一下:

  • 优点:ZooKeeper分布式锁(如 InterProcessMutex),除了独占锁、可重入锁,还能实现读写锁,并且可靠性比 Redis 更好。
  • 缺点:ZooKeeper实现的分布式锁,性能并不太高。因为每次在创建锁和释放锁的过程中,都要动态创建、销毁瞬时节点来实现锁功能。而 ZK 中创建和删除节点只能通过 Leader 服务器来执行,然后 Leader 服务器还需要将数据同不到所有的 Follower 机器上,同步之后才返回,这样频繁的网络通信,性能的短板是非常突出的;而 Redis 则是异步复制。

Redis 是 AP 架构,而 ZooKeeper 是 CP 架构。在高性能,高并发的场景下,不建议使用ZooKeeper的分布式锁,可以使用 Redis 分布式锁。而由于ZooKeeper的可靠性,所以在并发量不是太高的场景,推荐使用ZooKeeper的分布式锁。

相关文章:

Zookeeper

zookeeper是一个分布式协调服务。所谓分布式协调主要是来解决分布式系统中多个进程之间的同步限制,防止出现脏读,例如我们常说的分布式锁。 zookeeper中的数据是存储在内存当中的,因此它的效率十分高效。它内部的存储方式十分类似于文件存储…...

wav转mp3,wav转换成mp3教程

很多使用音频文件的小伙伴,总会接触到不同类型的音频格式,根据需求不同需要做相关的处理。比如有人接触到了wav格式的音频,这是windows系统研发的一种标准数字音频文件,是一种占用磁盘体积超级大的音频格式,通常用于录…...

springboot项目配置文件加密

1背景: springboot项目中要求不能采用明文密码,故采用配置文件加密. 目前采用有密码的有redis nacos rabbitmq mysql 这些配置文件 2技术 2.1 redis nacos rabbitmq 配置文件加密 采用加密方式是jasypt 加密 2.1.1 加密步骤 2.1.2 引入maven依赖 …...

公司招聘:33岁以上的和两年一跳的不要,开出工资我还以为看错了...

导读:对于公司来说,肯定是希望花最少的钱招到最优秀的员工,但事实上这个想法是不太现实的,虽然如今互联网不太好找工作,但要员工降薪去入职,相信还是有很大难度的,很多人宁可在家休息&#xff0…...

【置顶】:文章合集系列

【置顶】:文章合集系列 必看 文章中的所有内容仅供做个人学习使用,所有环境都在本地搭建并验证,任何人使用文中方法进行未经授权的渗透行为都与文章与我本人无关,请各位大佬不要进行未经授权的渗透行为…… 前言 之前更新过一段…...

Go的web开发Gin框架1(八)——Gin

一、重点内容: 知识要点有哪些? 1、了解Gin框架 2、导入使用Gin框架 3、尝试配合GORM开发 4、整合html,css,js 二、详细知识点介绍: 1、Gin框架介绍 ​ Gin是一个golang的微框架,封装比较优雅&…...

吴思进——复杂美创始人首席执行官

杭州复杂美科技有限公司创始人兼CEO, 本科毕业于浙江大学机械专业,辅修过多门管理课程;1997年获经济学硕士学位,有关对冲基金的毕业论文被评为优秀;2008年创办杭州复杂美科技有限公司。 吴思进 中国电子学会区块链委员会专家&…...

apk简单介绍(组成以及打包安装流程)

apk简单介绍APK 的组成apk安装流程app的启动过程apk打包流程AIDLAIDL介绍为什么要设计这门语言它有哪些语法?默认支持的数据类型包括什么是apk打包流程了解打包流程能做什么操作APK 的组成 APK 其实是一个 zip 类型的压缩包,而一个典型的 APK 通常都会包…...

ffmpeg学习笔记之SDL视频播放器

看了雷神的 100行代码实现最简单的基于FFMPEGSDL的视频播放器&#xff08;SDL1.x&#xff09; 后手痒难耐&#xff0c;决定将里面的代码重新建一个 首先建立一个空项目&#xff0c;新建一个Mysimplest.cpp的文件。在里面写代码 #include <stdio.h>extern "C" …...

【Git】合并多条 commit 注释信息

文章目录1、查看 commit 记录2、合并 commit 注释1、查看 commit 记录 # 3 指的是查看最近 3 次的 commit 记录&#xff0c;如果要查看多次的可以修改数字 # -3 不加&#xff0c;则表示查看所有 commit 记录&#xff0c;一般还是用数字去指定 git log -32、合并 commit 注释 …...

【gcc/g++】程序的翻译(.c -->.exe)

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;前言我们在写完代码运行时会发现生成了一个.exe的可执行程序&#xff0c;那么该程序是如何形成的呢&#xff1f;本次章节将在linux下用编译器gcc进行一…...

电话号码的字母组合-力扣17-java

一、题目描述给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。示例 1&#xff1a;输入&#xff1a;digits "23"输出…...

Archery-SQL审核查询平台

Archery-SQL审核查询平台 文章目录Archery-SQL审核查询平台一、功能列表介绍1.1、SQL审核MySQL实例非MySQL实例审核执行分离SQL工单自动审批、高危语句驳回快速上线其他实例定时执行1.2、SQL查询多类型数据库支持授权管理页面体验1.3、SQL优化慢日志管理SQL语句优化1.4、实例管…...

MySQL8.0安装教程

文章目录1.官网下载MySQL2.下载完记住解压的地址&#xff08;一会用到&#xff09;3.进入刚刚解压的文件夹下&#xff0c;创建data和my.ini在根目录下创建一个txt文件&#xff0c;名字叫my&#xff0c;文件后缀为ini&#xff0c;之后复制下面这个代码放在my.ini文件下&#xff…...

一文详解工业知识模型互联平台MoHub

1月8日&#xff0c;MWORKS 2023产品发布会落下帷幕。会上&#xff0c;同元软控隆重推出了云原生的工业知识模型互联平台MoHub&#xff0c;引起广泛关注。本文将从服务定位、架构方案、核心服务、持续运营等方面对MoHub平台进行全面介绍。1 MoHub平台的服务定位装备数字化的必要…...

MySQL入门篇-MySQL表连接小结

备注:测试数据库版本为MySQL 8.0 这个blog我们来聊聊常见的表连接的方法 测试数据: create table t1(id int); create table t2(id int);insert into t1 values(1); insert into t1 values(2);insert into t2 values(2); insert into t2 values(3); commit;内连接 --求交集 …...

使用纹理(Textures)

当物体表面并非是纯色的时候&#xff0c;比如带波点&#xff0c;斑纹或者表面有刮痕或被裂纹等&#xff0c;这些效果该如何实现呢&#xff1f; 这里我们需要提到一个概念是贴图&#xff08;Maps&#xff09;。Maps是覆盖在游戏物体上的2D图片&#xff0c;用来设置表面的颜色、s…...

android 11 添加开机铃声

需求&#xff1a;在11.0在定制化系统中&#xff0c;默认是没有开机铃声的&#xff0c;有客户提出需要要添加开机铃声&#xff0c;所以为了完成需求&#xff0c;就来实现这一个功能关于开机铃声 都是在bootanimation_main.cpp 这里面负责管理。添加添加开机铃声的核心类framewor…...

操作系统考试突击复习笔记

0 基础概念补充特权命令&#xff1a;有特殊权限的指令&#xff0c;比如清内存、置时钟、分配系统资源、修改虚拟内存的段表和页表&#xff0c;修改用户的访问权限。系统调用&#xff1a;操作系统为应用程序提供的使用接口&#xff0c;可以理解为一种可供应用程序调用的特殊函数…...

java8函数式接口分布式事务简单实现方式

import java.util.List; import java.util.function.Function;/*** @ClassName TransactionFunctionDTO* @Description* @Author SD.LIU* @Date 2023/2/13 22:41* @Version 1.0**/ public class TransactionFunctionDTO...

最后一个单词的长度-力扣58-java

一、题目描述给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。示例 1&#xff1a;输入&#xff1a;s "Hello World"输出&#x…...

Java开发学习(四十九)----MyBatisPlus更新语句之乐观锁

1、概念 在讲解乐观锁之前&#xff0c;我们还是先来分析下问题: 业务并发现象带来的问题:秒杀 假如有100个商品或者票在出售&#xff0c;为了能保证每个商品或者票只能被一个人购买&#xff0c;如何保证不会出现超买或者重复卖 对于这一类问题&#xff0c;其实有很多的解决方…...

力扣SQL刷题11

目录标题1194. 锦标赛优胜者--做出来了1225. 报告系统状态的连续日期-勉强1159. 市场分析 II1205. 每月交易II1194. 锦标赛优胜者–做出来了 题型&#xff1a;看题 解答&#xff1a;先处理matches表&#xff0c;整出分数列和players表连接 注意点&#xff1a; union all 时…...

Fluent Python 笔记 第 9 章 符合 Python 风格的对象

得益于 Python 数据模型&#xff0c;自定义类型的行为可以像内置类型那样自然。实现如此自然的行为&#xff0c;靠的不是继承&#xff0c;而是鸭子类型(duck typing)&#xff1a;我们只需按照预定行为实现对象所需的方法即可。 9.1 对象表示形式 实现 __repr__ 和 __str__ 特…...

档案管理数字化,成功的领导者,往往只问这3个问题

随着数字经济时代的到来&#xff0c;信息技术的更迭演进&#xff0c;逐渐改变了企业的办公业务流程&#xff0c;传统的办公业务模式已不能满足当前的企业业务需求。数字化转型成为当下企业的必选项。随着公司部门架构的日益复杂&#xff0c;流程繁多&#xff0c;产生海量的企业…...

自学软件测试从哪里开始?给还在迷茫的人一条出路

这两天和朋友谈到软件测试的发展&#xff0c;其实软件测试已经在不知不觉中发生了非常大的改变&#xff0c;前几年的软件测试行业还是一个风口&#xff0c;随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业&#xff0c;目前软件测试行业“缺口”已经基本饱和。当然&a…...

配置MyBatis Plus 的分页查询功能

配置MyBatis Plus 的分页查询功能一. 回顾Mysql分页查询二. 配置MyBatis Plus 分页功能2.1 定义分页拦截器2.2 进行分页查询 selectPage()三. 开启MyBatis Plus的运行日志一. 回顾Mysql分页查询 limit 是MySQL当中特有的&#xff01;其他数据库没有&#xff01;不通用&#xf…...

Solon2 开发之插件,四、插件热插拔管理机制(H-Spi)

插件热插拔管理机制&#xff0c;简称&#xff1a;H-Spi。是框架提供的生产时用的另一种高级扩展方案。相对E-Spi&#xff0c;H-Spi 更侧重隔离、热插热拔、及管理性。 应用时&#xff0c;是以一个业务模块为单位进行开发&#xff0c;且封装为一个独立插件包。 1、特点说明 所…...

从react源码看hooks的原理

React暴露出来的部分Hooks //packages/react/src/React.js export {...useCallback,useContext,useEffect,useLayoutEffect,useMemo,useReducer,useRef,useState,... }功能描述 useState、useReducer: 状态值相关useEffect、useLayoutEffect: 生命周期相关useContext: 状态共…...

空间尺寸对迭代次数的影响

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) ( A, B )---4*30*2---( 1, 0 )( 0, 1 ) 做4个训练集尺寸分别为3行3列&#xff0c;3行4列&#xff0c;4行3列和2行4列的网络。简写为3*3&#xff0c;3*4&#xff0c;4*3&#xff0c;2*4. 保持这4个网络差值结构的形态一致&#xff0c;…...

江苏网站备案流程图/百度地图3d实景地图

展开全部给你个正则表达式的资料&#xff0c;自己慢慢研究&#xff0c;授你以渔&#xff1a;一、正则表达式基础知识我们先从简单的开始。假设你62616964757a686964616fe78988e69d8331333264623264要搜索一个包含字符“cat”的字符串&#xff0c;搜索用的正则表达式就是“cat”…...

做音响网站/抖音seo优化系统招商

韩国新罗免税店28日表示&#xff0c;新罗网上免税店的化妆品和保健食品等300多种韩国免税商品7月将登陆中国购物网站。作为新罗免税店官方指定物流服务商&#xff0c;菜鸟负责将所有新罗免税店的商品从韩国直邮到中国。由此&#xff0c;中国“海淘客”足不出户&#xff0c;即可…...

物流企业网站建设步骤/淘宝关键词top排行榜

一分钟速览新闻点&#xff01; 京东回应京东科技赴港IPO&#xff1a;不予置评微信红包封面支持裂变分发&#xff1a;抢红包时可领同款佳能尼康中国关厂裁员&#xff0c;员工工作30年换150万补偿程序员避开7天班却被安排7场相亲 感叹好累阿里字节再次瞄上兴趣社交&#xff0c;分…...

wordpress方正模板/天猫代运营

1.配置文件 SpringBoot使用一个全局的配置文件&#xff0c;配置文件名是固定的&#xff1b; application.properties application.yml 配置文件的作用&#xff1a;修改SpringBoot自动配置的默认值 YAML(YAML Ain’t Markup Language) 既是一个标记语言&#xff0c;又不是…...

做企业网站的字体大小要求/郑州厉害的seo顾问

[原文地址&#xff1a; http://blog.csdn.net/easwy/archive/2007/09/30/1807725.aspx ] 在windows上访问linux有多种方法&#xff1a; 对于习惯使用命令行的人来说&#xff0c;可以使用终端的方式进行访问&#xff0c;也就是通过telnet, ssh等方法远程登录到linux主机&#xf…...

北京响应式网站如何开发/网站百度不收录的原因

原来ID8的记录删除后, 下一个Insert记录为9 当插入ID10的记录后, 使用 DBCC CHECKIDENT([MCU].[RecordSequence],RESEED,7) 当再次Insert记录, 就会是ID为8. 不过以上不是真实的使用场景, 以上情况应该插入包含ID的记录就行: SET IDENTITY_INSERT 表 ON转载于:https://www.cnbl…...