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

【ETCD】【Linearizable Read OR Serializable Read】ETCD 数据读取:强一致性 vs 高性能,选择最适合的读取模式

ETCD 提供了两种不同类型的读取操作方式,分别是 Linearizable Read(线性化读取)和 Serializable Read(可串行化读取)。这两种方式主要区分在读取数据时对一致性的要求不同。

目录

      • 1. Linearizable Read(线性化读取)
        • 特点:
        • 优点:
        • 缺点:
      • 2. Serializable Read(可串行化读取)
        • 特点:
        • 优点:
        • 缺点:
      • 总结:

1. Linearizable Read(线性化读取)

线性化读取保证了读取到的数据是 最新的,即保证了对所有客户端的一致性视图。它确保每次读取操作都能返回所有前一个写操作的结果。简单来说,线性化读取保证了客户端读取到的数据至少是写入的数据的“最新值”,并且该值是经过共识协议(如 Raft)确认的。

特点:
  • 严格一致性:每次读取的数据都来自一个已经提交的写操作,并且该操作在集群中是被一致认可的。
  • 阻塞读取:在进行线性化读取时,ETCD 会确保客户端从最新的数据源中读取数据,因此可能需要等待 Raft 协议完成数据的一致性同步,导致读取操作可能会有延迟。
优点:
  • 数据一致性:保证读取到的是最新的数据,满足强一致性要求,适用于对数据一致性要求高的场景。
缺点:
  • 性能较低:由于线性化读取需要跨节点的共识来保证数据一致性,可能导致较高的延迟和较低的吞吐量,尤其是在高并发情况下。

2. Serializable Read(可串行化读取)

可串行化读取是一个更宽松的读取模式,它允许读取到的数据在某些情况下可能并不是最新的,但仍然保证读取的数据满足一定的序列化规则。换句话说,ETCD 会确保多个并发的读取操作不会造成数据冲突或不一致,但可能会读取到稍微过时的数据。

特点:
  • 顺序一致性:可串行化读取保证多个操作(无论是写操作还是读操作)是可以按顺序串行化的。即使不同客户端的操作并发发生,也会确保没有冲突。
  • 不需要强一致性:与线性化读取不同,可串行化读取不一定要求读取到最新的数据。它保证数据在逻辑上是顺序一致的。
优点:
  • 较高的性能:由于不要求强一致性,读取操作的延迟较低,性能更好,适合高吞吐量的场景。
  • 支持并发操作:可串行化读取适合对一致性要求较低但对并发性要求高的场景。
缺点:
  • 一致性不强:读取的数据可能是过时的,无法保证读取到最新的数据。适用于对一致性要求不高的场景。

总结:

特性Linearizable Read (线性化读取)Serializable Read (可串行化读取)
一致性保证强一致性,读取的数据是最新的顺序一致性,读取的数据可能稍微过时
性能性能较低,可能导致较高延迟和吞吐量降低性能较高,读取操作响应较快
适用场景对数据一致性要求高的场景(如配置管理、分布式锁)对并发性能要求高、一致性要求相对较低的场景
数据时效性保证读取到最新的数据可能读取到过时的数据
操作复杂度需要通过 Raft 协议保证一致性,通常需要等待数据同步不强制要求最新数据,可接受延迟或旧数据
写入延迟影响写入操作和读取操作紧密相关,写入延迟可能影响读取写入操作可能不会直接影响读取,系统更容错
Leader 节点的影响读取操作需要通过 Leader 节点进行,Leader 节点可能成为性能瓶颈,影响整体吞吐量和响应时间读取操作可以从 Follower 节点进行,减轻了 Leader 节点的负担,提供更好的负载均衡和性能
优点- 确保读取到的是最新的数据- 较高的性能,低延迟
- 强一致性,适用于对一致性要求高的场景- 更适合高并发的场景
缺点- 性能较低,可能会增加延迟和降低吞吐量- 读取的数据可能是过时的,不能保证最新数据
- Leader 节点可能成为瓶颈,影响整体性能- 无法保证数据总是最新的
http://www.lryc.cn/news/508200.html

相关文章:

  • 【CSS in Depth 2 精译_089】15.2:CSS 过渡特效中的定时函数
  • 不常用命令指南
  • spring mvc | servlet :serviceImpl无法自动装配 UserMapper
  • STM32 HAL库之串口接收不定长字符
  • Pyqt6的tableWidget填充数据
  • ASP.NET Core - 依赖注入 自动批量注入
  • UVM 验证方法学之interface学习系列文章(十一)virtual interface 再续篇
  • 面试题整理5----进程、线程、协程区别及僵尸进程处理
  • OpenTK 中帧缓存的深度解析与应用实践
  • 第2节-Test Case如何调用Object Repository中的请求并关联参数
  • 【HarmonyOS NEXT】Web 组件的基础用法以及 H5 侧与原生侧的双向数据通讯
  • Android学习(六)-Kotlin编程语言-数据类与单例类
  • CV-OCR经典论文解读|An Empirical Study of Scaling Law for OCR/OCR 缩放定律的实证研究
  • 力扣274. H 指数
  • 挑战一个月基本掌握C++(第五天)了解运算符,循环,判断
  • Python的sklearn中的RandomForestRegressor使用详解
  • ReactPress 1.6.0:重塑博客体验,引领内容创新
  • 人脸生成3d模型 Era3D
  • kubeadm搭建k8s集群
  • centOS系统进程管理基础知识
  • STM32中ADC模数转换器
  • 初学stm32 --- 外部中断
  • wordpress调用指定分类ID下 相同标签的内容
  • SQL语法基础知识总结
  • css 实现呼吸灯效果
  • IMX6ULL开发板如何关掉自带的QT的GUI界面和poky的界面的方法
  • 几种广泛使用的 C++ 编译器
  • 《Vue进阶教程》第十六课:深入完善响应式系统之单例模式
  • C语言版解法力扣题:将整数按权重排序
  • Unity ECS和OOP优劣对比