etcd 与 Consul 的一致性读对比

本文分享和对比了 etcd 和 Consul 这两个存储的一致性读的实现。

作者:戴岳兵,爱可生研发中心工程师,负责项目的需求开发与维护工作。

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文约 900 字,预计阅读需要 3 分钟。

etcd 和 Consul 是现在比较流行的分布式一致性 KV 存储,本文就来分享和对比一下这两个存储的一致性读的实现。

Consul 一致性读的实现

Consul 有三种读模式:

  1. default
  2. consistent
  3. stale

其中 stale 是非一致性的读模式,而 default 和 consistent 是一致性的。

consistent 和 default 的区别在于 consistent 在读之前还会向各个节点确认自己是否还是 Leader,以防止在读之前的一瞬间变为 Follower,导致读取到旧值。

接下来我们看看具体实现的代码:

Get 方法的一开始 Consul 就调用了 ForwardRPC 方法来转发 RPC 请求,如果转发请求成功就直接返回。

如果转发请求没完成,就会取调用 blockingQuery 来查询本地的存储返回结果。

我们再来看一下 ForwardRPC 内部的实现。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以看到 ForwardRPC 方法内部主要做了三件事情:

  1. 如果需要,转发请求给其他 DC
  2. 判断当前节点是否能处理这个读请求
  3. 如果不能处理,转发请求给 Leader

我们再来看看第 2 步 Consul 是如何判断的。

其中 info.IsRead 用来判断是不是一个读请求,info.AllowStaleRead 判断 HTTP 请求参数中的 AllowStale,为 false 时即为一致性的读请求,而最后判断是否已经跟 Leader 交互过。

所以当一个请求是一致性读请求时就会走到第 3 步将请求转发到 Leader 上。

而在转发 Leader 时会判断自身是不是 Leader,如果不是才会转发。

小结

从这几段逻辑可以看出,Consul 的一致性读是通过转发读请求给 Leader 来实现的。

etcd 一致性读的实现

etcd 的读分为串行读(Serialize)和线性读(Linearizable)两种模式。其中线性读是一致性的读模式。

同样的我们来看下一致性读的实现:

可以看到串行读和线性读的区别只是在串行读之前调用了 linearizableReadNotify 方法。

linearizableReadNotify 中也只是简单的给 s.readwaitc 发信号然后等待结果。

这个信号将会在 linearizableReadLoop 方法中处理。

可以看到 linearizableReadLoop 方法中通过 requestCurrentIndex 方法获得了一个叫做 confirmedIndexindex

requestCurrentIndex 会向 Leader 节点发送 MsgReadIndex 消息,以获取 Leader 节点当前提交的最新的 index。然后再用本地的 appliedIndexconfirmedIndex 进行对比,如果本地已应用的 index 小于 confirmedIndex 则进行等待,直到追上 confirmedIndex 才会调用 nr.notify 发送通知信号解除 linearizableReadNotify 的等待进行后续的串行读操作。

也就是说 etcd 在做一致性读时,会先从 Leader 节点获取 Leader 节点当前最新的 commited index,然后和本地的 applied index 进行对比,等到本地应用的日志追上 Leader 时,才进行后续的串行读操作。

总结

从实现上来说 Consul 的一致性读的实现更加简单直接,但是可能会对 Leader 节点的性能造成一些影响。

而相对来说 etcd 的实现更加复杂但是讨巧,也充分利用到了每个节点的资源。

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

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

相关文章

Python实现FA萤火虫优化算法优化LightGBM回归模型(LGBMRegressor算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法(Fire-fly algorithm,FA)由剑桥大学Yang于2009年提出 , …

0基础学java-day14

一、集合 前面我们保存多个数据使用的是数组,那么数组有不足的地方,我们分析一下 1.数组 2 集合 数据类型也可以不一样 3.集合的框架体系 Java 的集合类很多,主要分为两大类,如图 :[背下来] package com.hspedu.c…

UniApp H5 跨域代理配置并使用(配置manifest.json、vue.config.js)

UniApp 运行到浏览器的时候,接口会跨域报错,这里通过两种方式解决,第一:修改Uniapp自带的manifest.json 源码视图并进行配置h5设置。第二:在项目根目录新建vue.config.js并配置代理。 二选一即可。 修改或调整配置文件…

Python 进阶(十四):枚举类型(enum 模块)

大家好,我是水滴~~ 本篇文章主要介绍了Python中的枚举类型,主要内容包括:枚举类型的简介、创建枚举类型、使用枚举类型等。 文章中包含大量的代码示例,能够帮助新手同学快速入门。 《Python入门核心技术》专栏总目录・点这里 文…

Vue 父传子组件传参 defineProps

defineProps 属性:用于接收父组件传递过来的数据。 注意:如果 defineProps 接收的参数名,和已有变量名相同,就会造成命名冲突。 语法格式: // 无限制 const props defineProps([参数名, 参数名]);// 限制数据类型 …

第二十一章总结

一、网络通信: 1.网络程序设计基础:网络程序设计编写的是与其他计算机进行通信的程序。 1.1局域网与互联网:为了实现两台计算机的通信,必须用一个网络线路连接两台计算机 2.网络协议:网络协议规定了计算机之间连接的…

文心一言大模型应用开发入门

本文重点介绍百度智能云平台、文心一言、千帆大模型平台的基本使用与接入流程及其详细步骤。 注册文心一言 请登录文心一言官方网站 https://yiyan.baidu.com/welcome 点击登录;图示如下: 请注册文心一言账号并点击登录,图示如下&#xff1…

游戏:火星孤征 - deliver us mars - 美图秀秀~~

今天水一篇,借着免费周下载了deliver us mars,玩下来截了好多图,就放这里了。 游戏没有难度,剧情也不难理解,美图到处都是,建模细节也是满满,值得一玩。 游戏中的 A.S.E是守卫飞行机器人&…

力扣刷题day2(最长公共前缀,有效括号,删除有序数组中的重复元素)

题目1:14.最长公共前缀 思路和解析: #define _CRT_SECURE_NO_WARNINGS //最长公共前缀 char* longestCommonPrefix(char** strs, int strsSize) {// 如果字符串数组为空,则返回空字符串if (strsSize 0){return "";}// 将第一个…

网络安全威胁——跨站脚本攻击

跨站脚本攻击 1. 定义2. 跨站脚本攻击如何工作3. 跨站脚本攻击类型4. 如何防止跨站脚本攻击 1. 定义 跨站脚本攻击(Cross-site Scripting,通常称为XSS),是一种典型的Web程序漏洞利用攻击,在线论坛、博客、留言板等共享…

JRT打印预览实现

JRT客户端部分已经实现了打印、导出Excel部分,之前没实现打印预览部分,因为要自己写打印预览界面,所以留到最后做,经过两晚的努力,实现了打印预览。 效果: 打印预览界面代码 package Monitor.Print;import javafx.a…

海鹰数据 shopee :为Shopee卖家提供的数据分析工具

在如今的电商时代,拥有准确的市场数据和深入的竞争分析是每个卖家成功的关键。为了帮助Shopee卖家更好地了解市场趋势、优化商品策略并提高运营效果,海鹰数据(Haiying Data)应运而生。作为一个专注于Shopee平台的数据分析工具&…

【日常总结】树莓派导致的公司无法上网 - 广播风暴

一、场景 二、问题 三、分析原因 四、解决方案 方案一:更换树莓派后ping路由器恢复正常 方案二:配置交换机 交换机广播风暴配置 也可以通过PPS来限速 查看配置 一、场景 宽带:公司3条500M光纤-联通 路由器:锐捷 在线用户…

VMware vSphere Web Services SDK 6.5编程指南(译文)

VMware vSphere Web Services SDK 6.5编程指南(译文) 本文档根据VMware vSphere 6.5 Documentation Center进行翻译整理,总共八章共110页。 先申明该译文文档非免费,有需要的可以联系(私信或微信)译者,文章尾部留也有联系方式。 目录 … ……

SAP MM中的科目分配类别是什么,如何配置

一、概述 这篇文章将概述 SAP MM 中的科目分配类别的基本概念以及如何在系统中配置它。我将在SAP配置中逐步解释配置。在此之前要理解采购的两种模式,库存物料采购和消耗型物料采购之间的区别。 1.1、库存采购 库存采购的物料,在收货后做库存管理&…

java WebSocket带参数处理使用

1、webSocket实现代码 Component public class WebSocketStompConfig {//这个bean的注册,用于扫描带有ServerEndpoint的注解成为websocket// ,如果你使用外置的tomcat就不需要该配置文件Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpoi…

NDIS协议驱动开发指南

文章目录 NDIS协议驱动开发指南1. 技术概览2. NDIS协议驱动2.1 BindAdapterHandlerEx2.2 SendNetBufferListsCompleteHandler2.3 ReceiveNetBufferListsHandler2.4 ProtocolNetPnpEvent 3. NET_BUFFER_LIST4. ndisprot实例5. 总结 NDIS协议驱动开发指南 我们知道,在…

【Proteus】绘制简单的电路图

参考书籍:微机原理与接口技术——基于8086和Proteus仿真(第3版)(作者:顾晖等),p111 1.放置元件 以8086为例: 确保处于元件模式,点击对应的按钮: 在元件库中…

PyQt6 QGroupBox分组框控件

​锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计37条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话…

Python自动化测试selenium核心技术处理弹框

页面上的弹框一般有三种: (1)alert:用来提示 (2)confirm:用来确认 (2)prompt:输入内容 示例网站:Sahi Tests 示例场景:打开Sahi T…