分析&回答


一般来说,数据一致性模型可以分为强一致性和弱一致性,强一致性也叫做线性一致性,除此以外,所有其他的一致性都是弱一致性的特殊情况。弱一致性根据不同的业务场景,又可以分解为更细分的模型,不同一致性模型又有不同的应用场景。

强一致性

当更新操作完成后,任何多个后续进行访问时都会返回最新的值,就是用户刚提交就能看到更新了的数据,这对用户是最友好的。但根据CAP理论,这势必也要牺牲可用性。

弱一致性

系统在写入数据成功后,不承诺立即能读到最新的值,也不承诺什么时候能读到,但是过一段时间之后用户可以看到更新后的值。那么用户读不到最新数据的这段时间被称为“不一致窗口时间”。 「最终一致性」 最终一致性作为弱一致性中的特例,强调的是所有数据副本,在经过一段时间的同步后,最终能够到达一致的状态,不需要实时保证系统数据的强一致性。

最终一致性

Base 理论中我们讲过:最终一致性要求系统中数据副本最终能够一致,而不需要实时保证数据副本一致。

最终一致性可以分为客户端和服务端两个不同的视角。

从客户端的角度看

从客户端来看,一致性主要指的是多并发访问时更新过的数据如何获取的问题,最终一致性有以下 4 个变种。

一致性变种 说明
因果一致性 如果进程 A 通知进程 B 它已更新了一个数据项,那么,进程 B 的后续访问将返回更新后的值,且一次写入将保证取代前一次写入。与进程 A 无因果关系的进程 C 的访问遵守一般的最终一致性规则。
会话一致性 这是上一个模型的实用版本,它把访问存储系统的进程放到会话的上下文中。只要会话还存在,系统就保证“读己之所写”一致性。如果由于某些失败情形令会话终止,就要建立新的会话,而且系统保证不会延续到新的会话。
单调读一致性 如果进程已经看到过数据对象的某个值,那么任何后续访问都不会返回在那个值之前的值。
单调写一致性 系统保证来自同一个进程的写操作顺序执行。

从服务器的角度看

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

分布式数据系统有以下特性:

  • N 为数据复制的份数。
  • W 为更新数据时需要进行写操作的节点数。
  • R 为读取数据的时候需要读取的节点数。
  1. 如果 W+R>N,写的节点和读的节点重叠,则是强一致性。例如,对于典型的一主一备同步复制的关系型数据库(N=2, W=2,R=1),则不管读的是主库还是备库的数据,都是一致的。
  2. 如果 W+R≤N,则是弱一致性。例如,对于一主一备异步复制的关系型数据库(N=2,W=1,R=1),如果读的是备库,则可能无法读取主库已经更新过的数据,所以是弱一致性。对于分布式系统,为了保证高可用性,一般设置 N≥3。设置不同的N、W、R 组合,是在可用性和一致性之间取一个平衡,以适应不同的应用场景。
  3. 如果N=W 且 R=1,则任何一个写节点失效,都会导致写失败,因此可用性会降低。但是由于数据分布的 N 个节点是同步写入的,因此可以保证强一致性。
  4. 如果 N=R 且 W=1,则只需要一个节点写入成功即可,写性能和可用性都比较高。但是读取其他节点的进程可能不能获取更新后的数据,因此是弱一致性。在这种情况下,如果 W<(N+1)/2,并且写入的节点不重叠,则会存在写冲突。

反思&扩展


说说Base 理论是什么


为了大家更加方便的刷题,我们对文章进行了分类和整理,免费为大家提供刷题服务。程序员不欺骗程序员,赶紧扫码小程序刷起来!

为了一站式解决面者刷题问题,部分内容可能存在摘录情况,如有侵权辛苦您留言联系我们,我们会删除文章或添加引用文案,Thanks!

说说数据一致性有哪几种?相关推荐

  1. mysql集群数据一致性校验

    目前,mysql在互联网行业使用地如火如荼,很多大型网站都在使用MySQL数据库,通过搭建mysql主备集群,实现高性能,高可用的存储方案.mysql集群的共同特性是通过复制来实现主备间的同步,保证主 ...

  2. mysql集群保证数据一致性

    mysql集群配置在网站负载均衡中是必不可少的: 首先说下我个人准备的负载均衡方式: 1.通过nginx方向代理来将服务器压力分散到各个服务器上: 2.每个服务器中代码逻辑一样: 3.通过使用redi ...

  3. 翻译翻译:什么叫架构?

    以下文章来源方志朋的博客,回复"666"获面试宝典 作者:Yrion | 链接:cnblogs.com/wyq178/p/12151160.html 这个知识分享的爆炸时代,鉴于 ...

  4. 分布式缓存的选择及问题

    现如今,缓存系统的应用非常广泛,能够用来提高并发数.数据吞吐量,提高快速响应能力.那么当数据量达到一定程度,单机环境可能就显得有些力不从心了,就需要一个分布式缓存系统.分布式缓存能够处理大量的动态数据 ...

  5. 如何搞定分库后数据冗余

    2019独角兽企业重金招聘Python工程师标准>>> 概述 当单个数据库数据量达到一定程度后,我们可以采用多个从库解决读请求的系统瓶颈. 而写请求的系统瓶颈往往需要通过分库解决. ...

  6. 字节跳动Java面试:java软件工程师简历描述项目

    一.网络原理 OSI 与 TCP/IP 各层的结构与功能,都有哪些协议 TCP 建立连接的过程,为什么要三次握手? TCP.UDP 协议的区别,各自的应用场景 打开浏览器,输入 URL 地址,访问主页 ...

  7. 微服务架构设计模式读书笔记

    1.总览 2.单体架构 2.1 单体架构好处 主要体现在早期 应用开发简单 易于对应用程序进行大规模的更改 测试相对简单直观 部署简单明了 横向扩展不费吹灰之力 2.2 局限性 过度的复杂性会吓退开发 ...

  8. 浅析Postgres中的并发控制(Concurrency Control)与事务特性(上)

    转载:https://www.cnblogs.com/flying-tiger/p/9567213.html#4121483#undefined PostgreSQL为开发者提供了一组丰富的工具来管理 ...

  9. 深入理解分布式技术 - 分布式事务总结回顾

    文章目录 常见问题 常见问题 数据一致性和分布式事务是互联网分布式系统设计中必须要考虑的,所以对分布式事务的考察是中高级工程师面试必须跨过的一道门槛. 面试官通常会通过一个实际的系统设计题来展开提问, ...

  10. 如何解决分布式系统中的“幽灵复现”?

    简介: "幽灵复现"的问题本质属于分布式系统的"第三态"问题,即在网络系统里面,对于一个请求都有三种返回结果:成功,失败,超时未知.对于超时未知,服务端对请求命 ...

最新文章

  1. matlab设置数组输出到文件中,Matlab将元胞数组输出到txt或者dat文件中
  2. 国外创意网站设计欣赏的200佳网站推荐(系列十)
  3. oracle如何复制dept,[oracle]表复制的sql语句
  4. OS--进程间通信详解(二)
  5. 使用HANA Web-based Development Workbench创建最简单的Server Side JavaScript
  6. 带Quarkus的Qute模板
  7. linux tomcat守护_linux-非root用户运行tomcat(示例代码)
  8. logisticregression参数_通俗地说逻辑回归【Logistic regression】算法(二)sklearn逻辑回归实战...
  9. 【OpenCV 例程200篇】93. 噪声模型的直方图
  10. php环境Unknown column ‘*‘ in ‘field list‘解决方案
  11. 如何取得GridView被隐藏列的值
  12. M3U8下载,直播源下载,FLASH下载(三)-直播源下载
  13. 计算机操作系统第四章测试题及答案
  14. 实用的chrome插件
  15. amd显卡用黑苹果输出黑屏_黑苹果XFX讯景显卡刷vBIOS教程,使其黑苹果显卡更稳定完美,不再黑屏...
  16. 数据中心能效管理系统有哪些平台功能?一分钟了解
  17. 膜片联轴器市场现状及未来发展趋势
  18. bfm人脸模型和3DDFA及其变种
  19. COSO内部控制框架
  20. 移远NBIOT模块选型指南

热门文章

  1. 算法篇----求两数的最大公约数和最小公倍数
  2. jpg转pdf怎么转换?
  3. 如何做好会员营销 三步教你看懂会员管理
  4. 记一次编写刷浏览量,刷查看次数脚本(内附代码)
  5. 碎碎念No.03 我这个程序员终于去看了心理医生做了心理咨询
  6. matlab 股票分时图_matlab画股票走势图 急急急!
  7. Oracle JDK究竟从哪个版本开始收费?
  8. WPS(Word)中图注、域的使用基础
  9. 计算机中常用计算公式,计算机常用计算公式汇总.doc
  10. Flutter小说APP