`

笔记--强一致性、若一致性、最终一致性

阅读更多
这两天在准备面试,今天学习了下CAP原理,顺便做个笔记加深印象:
在分布式系统中会涉及到CAP原理,来保证数据的一致性,
1.什么是CAP:
一致性(Consistency)
可用性(Availability)
分区容忍性(Partition tolerance)
CAP原理是说这三个要素最多只能同时满足两点,不可能同时兼顾三点,因此在分布式架构设计时必须进行取舍,而分布式数据系统,分区容忍性是最基本的要求,否则就失去了价值,因此只能在一致性和可用性之间取一个平衡。其实对于大多数web系统并不需要强一致性,因此牺牲一致性,换取高可用性是现在多数分布式数据库产品的方向。
牺牲一致性并不是完全不管数据的一致性,否则数据混乱了可用性再高,分布式再好也就没有了意义。牺牲一致性只是不再要求关系型数据库中的强一致性,而是只要系统能达到最终一致性即可。考虑到客户体验,这个最终一致性的时间窗口要尽可能的对用户透明,也就是需要保障‘用户感知到的一致性’。通常通过数据的异步复制来达到系统的高可用和数据的最终一致性。‘用户感知到的一致性’的时间窗口取决于数据复制到一致性状态的时间。
最终一致性(eventually consistent)
对于一致性,可以分为从客户端和服务端两个不同的视角。从客户端来看,一致性主要指的是多并发访问时更新过的数据如何获取的问题。从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。一致性是因为有并发读写才有的问题,因此在理解一致性的问题时,一定要注意结合考虑并发读写的场景。
强一致性
对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性,如果能容忍后续的部分或者全部访问不到,则是弱一致性。如果经过一段时间后要求能访问到更新后的数据,则是最终一致性。

从服务端角度,如何尽快将更新后的数据分布到整个系统,降低达到最终一致性的时间窗口,是提高系统的可用度和用户体验非常重要的方面。对于分布式数据系统:

  • N — 数据复制的份数
  • W — 更新数据是需要保证写完成的节点数
  • R — 读取数据的时候需要读取的节点数

如果W+R>N,写的节点和读的节点重叠,则是强一致性。例如对于典型的一主一备同步复制的关系型数据库,N=2,W=2,R=1,则不管读的是主库还是备库的数据,都是一致的。

如果W+R<=N,则是弱一致性。例如对于一主一备异步复制的关系型数据库,N=2,W=1,R=1,则如果读的是备库,就可能无法读取主库已经更新过的数据,所以是弱一致性。

对于分布式系统,为了保证高可用性,一般设置N>=3。不同的N,W,R组合,是在可用性和一致性之间取一个平衡,以适应不同的应用场景。

  • 如果N=W,R=1,任何一个写节点失效,都会导致写失败,因此可用性会降低,但是由于数据分布的N个节点是同步写入的,因此可以保证强一致性。
  • 如果N=R,W=1,只需要一个节点写入成功即可,写性能和可用性都比较高。但是读取其他节点的进程可能不能获取更新后的数据,因此是弱一致性。这种情况下,如果W<(N+1)/2,并且写入的节点不重叠的话,则会存在写冲突  
 原文地址:https://blog.csdn.net/aosica321/article/details/48769913
分享到:
评论

相关推荐

    STM32 L1Cache一致性探讨笔记

    ### STM32 L1Cache一致性探讨笔记 #### 1. STM32 L1Cache的基本概念和作用 STM32F7系列和STM32H7系列微控制器包含了高达16KB的L1缓存,用于指令和数据缓存。L1缓存的作用是将CPU附近的数据或指令集中存储,这样CPU...

    学习笔记--zookeeper

    - **最终一致性**:所有服务器最终都能达到数据一致的状态。 - **可靠性**:保证消息的送达,只要多数服务器存活,服务就能正常运行。 - **实时性**:客户端能在一定时间内获取最新的数据,但不保证绝对实时。 - **...

    笔记----------sql语句.pdf

    3. 完整性约束:描述事物内部及事物间的约束关系,确保数据的一致性和准确性。 在概念数据模型中,实体-关系模型(E-R模型)是一个重要的工具。E-R模型由实体、关系和属性构成: - 实体:表示现实世界中的对象,用...

    笔记----------sql语句 (2).pdf

    3. 完整性约束:描述事物内部和事物之间的约束性关系,确保数据的准确性和一致性。 在概念数据模型中,常见的术语有: - 实体:现实世界中的具体对象,如“学员”。 - 实体集:多个同类实体的集合。 - 属性:描述...

    j2ee笔记--很有用的东西

    5. **JTA(Java Transaction API)**:JTA提供了跨多个资源的事务管理,确保在分布式环境中的数据一致性。 6. **JNDI(Java Naming and Directory Interface)**:JNDI提供了一个接口来查找和管理命名和目录服务,...

    SSM笔记-缓存

    一级缓存的工作原理是,当执行了插入、更新、删除等操作后,会清空当前SqlSession的一级缓存,确保数据的一致性。但需要注意的是,如果在多个SqlSession之间共享数据,一级缓存并不能满足需求,这时就需要利用到二级...

    有关路由的中文笔记--精简版

    1. **链路状态更新:** OSPF通过周期性地发送链路状态更新信息来维护其数据库的一致性和准确性。 2. **最优路径计算:** 使用Dijkstra算法计算出到每个目的地的最佳路径。 3. **无环路:** 由于其链路状态的设计,...

    CMMI标准文档阅读笔记--CM相关

    在软件开发和项目管理中,配置管理对于保持产品质量、跟踪变更、维护版本一致性以及确保交付物的准确性和可靠性至关重要。 在CMMI的第二级成熟度中,配置管理包括以下关键过程域: 1. **识别配置项** (Identify ...

    读书笔记----设计模式

    如果需要重写父类方法,应当确保子类方法的约束条件更宽松,返回值更严格,以保持接口的一致性。 3. **依赖倒置原则**:该原则提倡依赖于抽象而不是具体实现。它建议我们编写代码时,依赖于接口或者抽象类,而不是...

    AutoCAD Civil 3D-教师笔记-02

    这不仅有助于保持设计的一致性和完整性,也方便了数据的查询和修改。 **3. “设置”选项卡** “设置”选项卡同样位于工具空间窗口内,提供了对各种设置和样式的访问途径。在这里,用户可以识别并修改不同类型的...

    Redis非关系型数据库笔记-数据持久化-主从同步-缓存-笔记-五大数据类型-三大特殊数据类型

    - 一致性保证: 在单线程环境下,无需担心并发导致的数据不一致问题。 #### 总结 Redis作为一种高性能的非关系型数据库,不仅支持多种数据类型,还能通过数据持久化和主从同步等机制确保数据的安全性和系统稳定性...

    SSH笔记-事务管理

    在Spring 4版本中,事务管理是核心功能之一,它允许开发者在应用中实现事务的一致性和原子性,确保数据的完整性。 事务管理在数据库操作中至关重要,它定义了一组操作,这些操作要么全部成功,要么全部失败,遵循...

    MYSQL学习资源及笔记-入门必备

    - **ACID属性**:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),保证了数据库操作的可靠性和一致性。 - **COMMIT和ROLLBACK**:提交事务保存更改,回滚事务撤销更改。...

    [网盘]算法笔记-上机训练实战指南-胡凡 完整版.2018_03_19

    根据提供的文件信息,本文将对《算法笔记-上机训练实战指南》这本书进行详细的知识点梳理,主要包括但不限于:算法基础知识、数据结构应用、经典算法详解、编程实践技巧等内容。 ### 一、算法基础知识 #### 1.1 ...

    SpringCloud笔记-images

    Spring Cloud Config支持配置的集中管理和版本控制,确保配置的一致性和可管理性。Spring Cloud Bus则可以用来广播配置变化或其他系统事件,实现分布式系统的协调。 通过阅读这些图像资料,开发者可以更直观地掌握...

    课堂笔记-第一次课1

    互联网公司通常采用最终一致性而非强一致性,以牺牲部分即时性换取更高的系统可用性和性能。 总结来说,分库分表和MySQL主从复制是解决大数据量和高并发问题的关键技术。通过垂直和水平切分优化数据结构,利用Mycat...

    SSH笔记-Mapping

    - 为了保持数据一致性,通常会在映射关系中加入级联操作,如`CascadeType.ALL`,使得操作一个实体时会自动影响到关联的实体。 - 需要注意懒加载和急加载的区别,懒加载只在真正访问关联对象时才执行SQL,而急加载...

    petalinux创建笔记-长期维护版1

    【PetaLinux 创建笔记-长期维护版1】 PetaLinux 是一个专为Xilinx FPGA(现场可编程门阵列)系统芯片设计的嵌入式Linux系统开发工具包。该工具包提供了一整套流程,包括从项目初始化到构建完整的Linux系统镜像。...

Global site tag (gtag.js) - Google Analytics