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 的实现更加复杂但是讨巧,也充分利用到了每个节点的资源。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何从eureka-server上进行服务发现,负载均衡远程调用服务

在spring cloud的maven的pom文件中添加eureka-client的依赖坐标 <!--eureka-client依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependen…

Apache Kafka CVE-2023-25194(metasploit版)

Step1&#xff1a;用docker搭建环境 Step2&#xff1a;docker查看映射端口 Step3&#xff1a;访问特定端口&#xff0c;然后靶标应用。 Step4&#xff1a;用metasploit进行攻击&#xff1a; 首先&#xff0c;打开metasploit&#xff0c;然后查询需要攻击的板块&#xff0…

如何搭建软件测试环境?

关于如何搭建测试环境&#xff0c;也是面试会经常问到的一个问题&#xff0c;一般常见于一些创业公司&#xff0c;因为测试环境不够完善&#xff0c;可能会遇到搭建环境这个问题。 一般来说&#xff0c;测试环境搭建都属于运维的工作范畴&#xff0c;但是可能有些创业公司就没有…

103.进程概述

目录 1.并行和并发 区别&#xff1a; 2.PCB 3.进程状态 4. 进程命令 从严格意义上来讲&#xff0c;程序和进程是两个不同的概念&#xff0c;他们的状态&#xff0c;占用的系统资源都是不同的。 程序&#xff1a;程序是一种静态实体&#xff0c;是存储在计算机存储介质上的…

Python通过 psd-tools 解析 PSD 文件

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com PSD&#xff08;Photoshop Document&#xff09;是Adobe Photoshop软件中使用的图像文件格式&#xff0c;包含图层、通道、蒙版等信息。在Python中&#xff0c;我们可以使用 psd-tools 库来解析和处理PSD文件。本…

开发者的福音:TinyVue 组件库文档大优化!类型更详细,描述更清晰!

你好&#xff0c;我是 Kagol。 前言 从今年2月份开源以来&#xff0c;有不少朋友给我们 TinyVue 组件库提了文档优化的建议&#xff0c;这些建议都非常中肯&#xff0c;我们也在持续对文档进行优化&#xff0c;并且从中总结出了大家对于文档优化的一些共性问题&#xff0c;形…

YOLOv8改进 | TripletAttention三重注意力机制(附代码+机制原理+添加教程)

一、本文介绍 本文给大家带来的改进是Triplet Attention三重注意力机制。这个机制&#xff0c;它通过三个不同的视角来分析输入的数据&#xff0c;就好比三个人从不同的角度来观察同一幅画&#xff0c;然后共同决定哪些部分最值得注意。三重注意力机制的主要思想是在网络中引入…

云上守沪 | 云轴科技ZStack成功实践精选(上海)

为打造国际数字之都&#xff0c;上海发布数字经济发展“十四五”规划&#xff0c;围绕数字新产业、数据新要素、数字新基建、智能新终端等重点领域&#xff0c;加强数据、技术、企业、空间载体等关键要素协同联动&#xff0c;加快进行数字经济发展布局&#xff1b;加快基础软件…

指针(三)

函数指针 定义&#xff1a;整型指针是指向整形的指针,数组指针式指向数组的指针,其实函数指针就是指向函数的指针。 函数指针基础&#xff1a; &#xff08;&#xff09;优先级要高于*&#xff1b;一个变量除去了变量名&#xff0c;便是它的变量类型&#xff1b;一个指针变量…

SQL手工注入漏洞测试(Access数据库)-墨者

———靶场专栏——— 声明&#xff1a;文章由作者weoptions学习或练习过程中的步骤及思路&#xff0c;非正式答案&#xff0c;仅供学习和参考。 靶场背景&#xff1a; 来源&#xff1a; 墨者学院 简介&#xff1a; 安全工程师"墨者"最近在练习SQL手工注入漏洞&#…

Linux详解—环境变量

目录 前言 一、基本概念 二、常见环境变量 三、查看环境变量方法 四、和环境变量相关的命令 1. echo: 显示某个环境变量值​编辑 2. export: 设置一个新的环境变量​编辑 3. env: 显示所有环境变量​编辑 4. unset: 清除环境变量​编辑 5. set: 显示本地定义的shell变…

python将时间戳转换为时间

python将时间戳转换为时间 import datetime timestamp 1701862813779 # 将时间戳转换为秒&#xff08;因为Python的timestamp通常是以秒为单位的&#xff09; timestamp_seconds timestamp / 1000 # 将时间戳转换为UTC时间 utc_time datetime.datetime.utcfromti…

Java第二十一章网络通信

一、网络程序设计基础 1、局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机&#xff0c;如下图所示。 2、网络协议 1.IP协议 IP指网际互连协议&#xff0c;Internet Protocol的缩写&#xff0c;是TCP/IP体系中的网络层协议。设计IP的目的…

0基础学java-day15

一、泛型 1 泛型的理解和好处 1.1 看一个需求 【不小心加入其它类型&#xff0c;会导致出现类型转换异常】 package com.hspedu.generic;import java.util.ArrayList;/*** author 林然* version 1.0*/ public class Generic01 {SuppressWarnings("all")public st…

VMware 虚拟机 电脑重启后 NAT 模式连不上网络问题修复

问题描述&#xff1a; 昨天 VMware 安装centos7虚拟机&#xff0c;网络模式配置的是NAT模式&#xff0c;配置好后&#xff0c;当时能连上外网&#xff0c;今天电脑重启后&#xff0c;发现连不上外网了 检查下各个配置&#xff0c;都没变动&#xff0c;突然就连不上了 网上查了…

mmc频率配置

代码路径及功能 以zync的 sd mmc来解读 涉及到的设备驱动文件&#xff1a; 文件说明\drivers\mmc\host\dw_mmc-pltfm.c 作为mmc的驱动的入口\drivers\mmc\host\dw_mmc.c dw mmc的通用驱动。虽然各个芯片厂家都有自己的外设接口&#xff0c;但是这些接口通常用的同一个I…

1.2 C语言简介

一、为什么要讲C语言 C语言是编程界的长青藤&#xff0c;可以查看语言排名发现&#xff0c;虽然现在语言很多&#xff0c;但是C语言一直占有一定地址 来源网站&#xff1a;https://www.tiobe.com/tiobe-index/ 在系统、嵌入式、底层驱动等领域存在一定的唯一性&#xff08;C语…

GNSEC 2022年第8届全球下一代软件工程线上峰会-核心PPT资料下载

一、峰会简介 新一代软件工程是指利用新的理论、方法和技术&#xff0c;在软件开发、部署、运维等过程中&#xff0c;实现软件的可控、可预测、可维护的软件生产方式。它涵盖了多个领域&#xff0c;如软件开发、测试、部署、运维等&#xff0c;旨在提高软件生产效率和质量。 …

Qt-Q_OBJECT宏使用与“无法解析的外部符号qt_metacall/metaObject/qt_metacast“

有时候我们编写Qt类的时候&#xff0c;修改代码时直接加上Q_OBJECT宏&#xff0c;然后直接构建&#xff0c;会报如下错误&#xff1a; 这里的几个函数的声明是由Q_OBJECT宏引入的&#xff0c;而其对应的实现是由moc实现的&#xff0c;如果我们更新了代码但是没有执行qmake&…

【Qt开发流程】之对象模型3:对象树及其所有权

描述 Qt对象树是一种基于父子关系的对象管理机制&#xff0c;用于管理Qt应用程序中的所有对象。在Qt中&#xff0c;每个对象都可以拥有一个或多个子对象&#xff0c;并且每个子对象只能属于一个父对象。每个对象的所有权&#xff08;也称为生存期&#xff09;由其父对象控制。…