ETCD中MVCC的运用

MVCC

并发与锁从来都是密不可分的两个东西,在一个请求的过程中,难免会操作各种各样的资源,那么在多个请求同时到来的时候,各个请求处理资源是无序的,肯定就会造成干扰,那么普遍的做法就是加锁。

但是,这势必会导致系统性能下降,因此出现了各种优化的方案:控制锁的粒度;乐观锁等等。

另一个方面,伴随着锁的出现,针对锁的处理,开始有了事务,说到事务,那么就会想到MVCC(多版本控制),相信大家对MVCC开始了解应该都是从mysql开始的。

那么今天要说的etcd,同样使用了MVCC来解决各种性能问题以及watch问题

关键字

我们知道在mysql的mvcc的实现中,会有一些控制标志,
同样的,etcd 也有,如下所示:

  • Revision
    作用域为集群,逻辑时间戳,全局单调递增,任何 key 的增删改都会使其自增

  • CreateRevision
    作用域为 key, 等于创建这个 key 时集群的 Revision, 直到删除前都保持不变

  • ModRevision
    作用域为 key, 等于修改这个 key 时集群的 Revision, 只要这个 key 更新都会自增

  • Version
    作用域为 key, 这个key刚创建时Version为1,之后每次更新都会自增,即这个key从创建以来更新的总次数。

Watch

我们知道,在使用etcd做配置管理的时候,我们一般都会watchetcd的相关key,etcd会在key发生变更的时候,推动相关的数据过来,
那么具体推送哪些数据呢,etcd通过mvcc的那些控制标识来让用户自己选择,因此规则如下:

  • watch 某一个 key 时,想要从历史记录开始就用 CreateRevision ,最新一条(这一条直接返回) 开始就用 ModRevision 。

  • watch 某个前缀,就必须使用 Revision 。如果要watch当前前缀后续的变化,则应该从当前集群的 Revision+1 版本开始watch。

启动重建

我们知道,etcd本质上是内存数据库,所有的数据都是加载到了内存中,当然,它跟redis一样,数据都是持久化了的,只是在启动的时候,将文件数据重新全部加载到内存中。
在重建过程中,对mvcc是怎么处理的呢?

  • 重建内存索引btree的时候,遍历boltdb,从版本号0到最大版本号不断遍历,从value里面解析出对应的key、revision等信息,重建btree。

当etcd收到一个请求Get Key时,请求被层层传递到了mvcc层后,它首先需要从内存索引btree中查找key对应的版本号,随后从boltdb里面根据版本号查出对应的value, 然后返回给client.

https://www.lixueduan.com/posts/etcd/06-why-mvcc/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/149546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一些损失函数的学习

CrossEntropy loss 交叉熵是用来衡量两个概率分布之间的差异性或不相似性的度量交叉熵定义为两个概率分布p和q之间的度量。其中,p通常是真实分布,而q是模型预测的分布 交叉熵还等于信息熵 相对熵 这里,x遍历所有可能的事件,p(x)…

OpenAI与微软合作,构建 ChatGPT 5 模型;10天准确天气预报

🦉 AI新闻 🚀 OpenAI与微软合作,构建 ChatGPT 5 模型,下一代人工智能或拥有超级智能 摘要:OpenAI首席执行官 Sam Altman 在接受采访时表示,OpenAI正在与微软合作构建下一代人工智能模型 ChatGPT 5&#x…

1、谈谈你对Spring的理解

什么是spring Spring是一个生态:可以构建java应用所需的一切基础设施通常Spring指的就是Spring Framework 核心解释 1、spring是一个轻量级的开源容器框架。 2、spring是为了解决企业级应用开发的业务逻辑层和其他各层对象和对象直接的耦合问题 3、spring是一个I…

element UI表格中设置文字提示(tooltip)或弹出框(popover)时候注意的地方

在表格中自定义内容的时候需要使用标签,否则无法正常显示 文档中有两种写法:1、使用 slot“reference” 的具名插槽,2、使用自定义指令v-popover指向 Popover 的索引ref。 使用tooltip 时用具名 slot 分发content,替代tooltip中…

牧童

《牧童》 作者/罗光记 青草地上牧童行, 黄牛耳边语轻轻。 夕阳西下归家去, 一曲笛声入晚庭。

如何将文字、图片、视频、链接等内容生成一个二维码?

通过二维彩虹的【H5编辑】功能,就可以将文字、图片、视频、文件、链接等多种格式的内容编辑在一个页面,然后生成一个自定义的二维码——H5编辑二维码。扫描后,即可查看二维码中的详细图文视频等内容了。这个功能大受欢迎! 这个H5…

html主页框架,前端首页通用架构,layui主页架构框架,首页框架模板

html主页框架 前言功能说明效果使用初始化配置菜单加载主题修改回调 其他非iframe页面内容使用方式iframe页面内容使用方式 前言 这是一个基于layui、jquery实现的html主页架构 平时写的系统后台可以直接套用此框架 由本人整合编写实现,简单上手,完全免…

潮玩宇宙大逃杀游戏开发源码说明

潮玩宇宙大逃杀游戏是一款简单而刺激的游戏。玩家在倒计时结束前从8个房间中选择一个房间并投入宝石。倒计时结束后,系统会自动生成一个敌人,然后随机挑选一个房间并清除这个房间内的人。其余7个房间内的玩家就可以按照投入比例获得被清除掉玩家的宝石。…

接口测试基础与接口测试用例设计思路详解

接口测试简介 1.什么是接口 接口就是内部模块对模块,外部系统对其他服务提供的一种可调用或者连接的能力的标准,就好比usb接口,他是系统向外接提供的一种用于物理数据传输的一个接口,当然仅仅是一个接口是不能进行传输的&#x…

【数据结构】栈

1.58.33 栈 栈栈的概念及基本结构栈的存储栈的基本操作栈的置空初始化---StackInit()栈的初始化2.0---给栈开辟一点空间StackInit1()栈的销毁---StackDestory()入栈----StackPush()出栈----StackPop()获取栈中元素的数量---StackSize()判断栈是否为空---StackEmpty()获取栈顶元…

自动化测试系列 —— UI自动化测试

UI 测试是一种测试类型,也称为用户界面测试,通过该测试,我们检查应用程序的界面是否工作正常或是否存在任何妨碍用户行为且不符合书面规格的 BUG。了解用户将如何在用户和网站之间进行交互以执行 UI 测试至关重要,通过执行 UI 测试…

值得学习的演示文稿制作范例

1,在第一张幻灯片前插入1张新幻灯片,设置幻灯片大小为“全屏显示(16:9) ”;为整个演示文稿应用“离子会议室”主题,放映方式为“观众自行浏览”;除了标1题幻灯片外其它每张幻灯片中的页脚插入“晶泰来水晶吊坠”七个字。 2,第一张幻灯片的版式设置为“标题幻灯片”,主标题为“…

代码随想录算法训练营第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结

977. 有序数组的平方 简单 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方…

2311d模板替换运行时勾挂

原文 本周我完成了把_d_newarray{mTX,miTX,OpT}转换为单个模板的工作,并合并了PR这里. 它们分配并初化多维数组.与_d_newarray{U,T,iT}类似,_d_newaraym*现在由单个勾挂实现:_d_newarraymTX. 以前,用两个勾挂来区分默认初化和零初化类型._d_newarrayOpT是两个_d_newarraym{i,}T…

下载node-sass

先卸载node-sass npm uninstall node-sass重新下载node-sass,设置变量 sass_binary_site,指向淘宝镜像地址 npm i node-sass --sass_binary_sitehttps://npm.taobao.org/mirrors/node-sass/

面试笔记:你在开发中遇到过什么问题

持续更新~ java后端 mysql时差相差八小时。 tomcat的session有效时间只有两个小时。 tomcat的默认文件上传大小不大于1MB。 下载文件时文件名有特殊字符(URL不支持的字符,空格,下划线等),文件名变成了请求地址的路…

外贸网站被谷歌收录的方法

在当今的数字化时代,拥有一个在线存在是任何企业或个人成功的关键。一个有效的网站不仅可以提供信息,还可以作为吸引潜在客户的强大工具。然而,如果网站没有被搜索引擎,如谷歌收录,那么它的价值将大打折扣。以下是一些…

含免费次数的常用API接口

银行卡三要素:检测输入的姓名、身份证号码、银行卡号是否一致。毫秒级响应、直联保障,支持全国所有银联卡 。运营商三要素 API:输入姓名、身份证号码、手机号码,验证此三种信息是否一致,返回验证结果、手机归属地、运营…

Python算法——树的镜像

Python中的树的镜像算法详解 树的镜像是指将树的每个节点的左右子树交换,得到一棵新的树。在本文中,我们将深入讨论如何实现树的镜像算法,提供Python代码实现,并详细说明算法的原理和步骤。 树的镜像算法 树的镜像可以通过递归…

hive数据库delete删除部分数据/删除分区内的数据

Hive delete 删除部分数据 一、hive删除数据1.1、删除整个表1.2、删除表中的特定行1.3、删除表中的特定分区1.4、删除分区内的部分数据1.5、清空表中的所有数据 二、扩展2.1、dynamic partition on Crud si not disabled, please set hive.crud.dynamic.partitiontrue to enabl…