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

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

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

相关文章:

etcd 与 Consul 的一致性读对比

本文分享和对比了 etcd 和 Consul 这两个存储的一致性读的实现。 作者:戴岳兵,爱可生研发中心工程师,负责项目的需求开发与维护工作。 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 本…...

Docker 安装Apache Superset 并实现汉化和快速入门

什么是Apache Superset Apache Superset是一个现代化的企业级商业智能Web应用程序。Apache Superset 支持用户的各种数据类型可视化和数据分析,支持简单图饼图到复杂的地理空间图表。Apache Superset 是一个轻量级、简单化、直观化、可配置的BI 框架。 Docker 安…...

差异计算基础知识 - 了解期末业务操作、WIP 和差异

原文地址:Basics of variance calculation-Understanding Period End activities, WIP and Variances | SAP Blogs 大家好, 这是我在成本核算方面的第六份文件,旨在解释期末的差异计算和相关活动。 我将引导您完成期末活动和差异计算。在本文…...

spring boot定时器实现定时同步数据

文章目录 目录 文章目录 前言 一、依赖和目录结构 二、使用步骤 2.1 两个数据源的不同引用配置 2.2 对应的mapper 2.3 定时任务处理 总结 前言 一、依赖和目录结构 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifa…...

第一百九十六回 通过蓝牙发送数据的细节

文章目录 1. 概念介绍2. 实现方法3. 代码与效果3.1 示例代码3.2 运行效果4. 经验总结我们在上一章回中介绍了"分享三个使用TextField的细节"沉浸式状态样相关的内容,本章回中将介绍SliverList组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 通过蓝牙设备…...

26.Python 网络爬虫

目录 1.网络爬虫简介2.使用urllib3.使用request4.使用BeautifulSoup 1.网络爬虫简介 网络爬虫是一种按照一定的规则&#xff0c;自动爬去万维网信息的程序或脚本。一般从某个网站某个网页开始&#xff0c;读取网页的内容&#xff0c;同时检索页面包含的有用链接地址&#xff0…...

Spring Boot 在启动之前还做了哪些准备工作?

目录 一:初始化资源加载器 二:校验主要源 三:设置主要源 四:推断 Web 应用类型<...

SQL语句常用语法(开发场景中)

一、SQL语句常用小场景 1.查询某个表信息&#xff0c;表中某些字段为数据字典需要进行转义 SELECTt.ID,CASEWHEN t.DINING_TYPE 1 THEN早餐WHEN t.DINING_TYPE 2 THEN午餐WHEN t.DINING_TYPE 3 THEN晚餐END AS diningTypeStr from student t 2.联表查询语法 select si.*…...

HarmonyOS应用开发者认证:开启全新的智能设备开发之旅

随着科技的不断发展&#xff0c;人工智能、物联网等技术逐渐渗透到我们的日常生活中。在这个智能化的时代&#xff0c;华为推出了一款全新的操作系统——HarmonyOS&#xff0c;旨在为各种智能设备提供统一的操作系统&#xff0c;实现设备之间的无缝连接和协同工作。作为开发者&…...

Python 模板引擎 Jinja2 的安装和使用

目录 一、概述 二、安装 Jinja2 三、使用 Jinja2 四、Jinja2的强大功能和优点 五、总结 一、概述 Jinja2 是 Python 中广泛使用的一种模板引擎&#xff0c;它具有灵活的语法、强大的控制结构、方便的 API&#xff0c;以及高效的渲染速度。通过使用 Jinja2&#xff0c;开发…...

案例063:基于微信小程序的传染病防控宣传系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder …...

53. Protocol buffer 的Go使用

文章目录 一、介绍二、安装三、protoc3语法1、 protoc3 与 protoc2区别2、proto3生成go代码包Message内嵌Message字段单一标量字段单一message字段可重复字段slicemap字段枚举 一、介绍 Protobuf是Google旗下的一款平台无关&#xff0c;语言无关&#xff0c;可扩展的序列化结构…...

如何访问内部网络做内网穿透

项目&#xff1a;https://github.com/ehang-io/nps 有个公网服务器&#xff0c;搭建服务端。 然后客户端使用&#xff1a; -server是服务端的访问方式。-vkey是秘钥。 ./npc -server192.227.19.12:8024 -vkeyoies8gq3wml -typetcp然后在服务端配置TCP隧道即可。...

git常用命令总结

生成公钥并在github添加公钥 ssh-keygen -t rsa -C **********测试是否可用 ssh -T gitgithub.com本地初始化 git init添加远程库 格式&#xff1a;git remote add [shortname] [url] git remote add origin gitgithub.com:TonyBeen/eular.git拉取指定仓库的代码 git pull orig…...

Apollo新版本Beta技术沙龙

有幸参加Apollo开发者社区于12月2日举办的Apollo新版本(8.0)的技术沙龙会&#xff0c;地址在首钢园百度Apollo Park。由于去的比较早&#xff0c;先参观了一下这面的一些产品&#xff0c;还有专门的讲解&#xff0c;主要讲了一下百度无人驾驶的发展历程和历代产品。我对下面几个…...

数据结构第二次作业——递归、树、图【考点罗列//错题正解//题目解析】

目录 一、选择题 ——递归—— 1.【单选题】 ——递归的相关知识点 2.【单选题】——递归的应用 3.【单选题】——递归的实现结构 4.【单选题】——递归的执行与实现 5.【单选题】 ——递归算法 ——树—— 6.【单选题】 ——树的结构 *7.【单选题】——树的知识点 …...

Redis--12--Redis分布式锁的实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Redis分布式锁最简单的实现如何避免死锁&#xff1f;锁被别人释放怎么办&#xff1f;锁过期时间不好评估怎么办&#xff1f;--看门狗分布式锁加入看门狗 redissonRe…...

MongoDB简介与安装

目录 1. MongoDB简介 2. 安装MongoDB 3. 基本命令行操作 4. Java代码实践 MongoDB是一种NoSQL数据库&#xff0c;以其灵活的文档存储模型和高度可扩展性而闻名。这篇文章将简单介绍一下MongoDB的基本概念&#xff0c;包括其特点和优势&#xff0c;并提供安装MongoDB的步骤。…...

Avaya Aura Device Services 任意文件上传漏洞复现

0x01 产品简介 Avaya Aura Device Services是美国Avaya公司的一个应用软件。提供一个管理 Avaya 端点功能。 0x02 漏洞概述 Avaya Aura Device Services 系统PhoneBackup接口处存在任意文件上传漏洞&#xff0c;攻击者可绕过验证上传任意文件获取服务器权限。 0x03 影响范围…...

C#注册表技术及操作

目录 一、注册表基础 1.Registry和RegistryKey类 &#xff08;1&#xff09;Registry类 &#xff08;2&#xff09;RegistryKey类 二、在C#中操作注册表 1.读取注册表中的信息 &#xff08;1&#xff09;OpenSubKey()方法 &#xff08;2&#xff09;GetSubKeyNames()…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...

电脑桌面太单调,用Python写一个桌面小宠物应用。

下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡&#xff0c;可以响应鼠标点击&#xff0c;并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...