数据一致性
在分布式环境下,为了避免设备与网络不可靠带来的影响,通常会存储多个数据副本。逻辑上的一份数据,同时存储在多个物理副本上,带来了数据已执行的问题。数据一致性问题的前提是发生读写操作,就是多个副本上的读写策略。
数据一致性从不同的视角,可以分为状态一致性 和 操作一致性。
状态一致性指数据所处的客观,实际状态体现的一致。
操作一致性指外部用户通过协议约定的操作,能够读到一致的数据。
从状态视角看,任何数据变更后,数据只有两种状态:所有副本一致 或 不一致。正常情况下,不一致是暂时的,状态会由不一致转变为一致。
由此衍生出强一致性 和 最终一致性。
以mysql举例,mysql的主从同步机制,有异步,全同步 和 半同步之分。
异步指mysql主库将事务信息写入binlog文件中的时候,此时主库会通过binlog dump线程给从库发送这些新的binlog变化,然后并不等待从库的响应继续提交事务并写入binlog,所以主库并不保证这些事务变化的binlog数据会传输并应用到任何从库。
全同步指当主库提交事务的binlog后,所有的从库节点必须全部收到事务并且apply并且提交这些内容之后,即io_thread和sql_thread完成所有binlog变化的接受的应用执行,主库的线程才可以继续进行后续操作,但是缺点是,主库完成一个事务的时间会被拉长,性能急剧降低。
半同步介于异步和全同步之间,主库只需要等待至少一个从节点,收到并且flush binlog到relay log文件即可,主库不需要等待所有从库给主库反馈,这里只是一个收到的反馈,而并不是从库已经完成并提交的反馈,即从库只应用完成io_thread内容即可无需等到sql_thread的执行完成。
全同步即强一致性,该模式存在比较大的问题:
1、性能差。需要将数据同步给从库,才给用户返回成功。主库的响应时间取决于从库中时延最长的那个。
2、可用性问题。任何设备都有可能出现故障。但在全同步复制模式下,集群中的节点被串联起来,如果单机可用性是 95%,那么集群整体的可用性就是 N个95%相乘,3个节点,可用性就是95%*95%*95%=85.7%,跟单机相比反而降低了。
所以再生产上很少会采用全同步这种方案。
最终一致性可以理解为主节点执行写操作并反馈成功时,不要求其他副本与主副本保持一致,但在经过一段时间后这些副本最终会追上主副本的进度,重新达到数据状态的一致。
从状态视角看,也存在很多问题,此时就需要从操作视角看。
最终一致性,在语义上包含了很大的不确定性,所以很多时候并不是直接使用,而是加入一些限定条件,也就衍生出了若干种一致性模型。
假设有一主两从三台数据库
1、写后读一致性
你发了一条朋友圈,你可以立刻看到这条消息,此时你刷新朋友圈,也应该看到这条消息,这就是写后读度一致性。从数据的角度来解析:
你发送的信息,保存在主库中,此时主库会同步给两个从库,数据都同步成功了,你一直刷新,自然都会看到。
如果只写入了主库,主库还没来得及同步给两个从库,此时你刷新一下,请求被分配到从库去读,这条消息就暂时看不到了。
如果主库成功同步给一个从库A,还有一个从库B在同步过程中,刷新请求落在从库A,你可以看到消息,然后再次刷新,请求落在从库B,又突然看不到你发的消息了,此时你不会崩溃吗?
写后读一致性要求我们写了一条数据进主库,之后不管有没有同步成功,我们都能看到自己写入的这条记录。
实现方式:可以将自己写后的读,指向主库。
2、单调读一致性
当你的朋友看到你发的朋友圈(从库A读取的数据)并点赞后,再刷新一次(从库B读取数据),结果发现消息没有了(从库A同步成功,从库B还在同步过程中),当从库A和B都同步成功,你朋友再刷新朋友圈,又看到你发的朋友圈,你朋友也会很懵逼。
单调读一致性就是说用户读到一个值,不会读到比这个值更旧的值。
假如X被赋值3次,分别是10,20,30,当你读到20时,后续只能读到20或30,不能再读到10。
实现方式:用户和副本做映射关系,比如通过hash把用户id固定在某一副本上。
3、前缀一致性
假如你朋友发了朋友圈,你在下面问他“中午吃的什么?”,你朋友在朋友圈回复你“中午吃的鱼”。你们远在国外的朋友看到朋友圈 评论是“中午吃的鱼”“中午吃什么”。两个评论顺序反了。这可能是因为数据同步时,网络传输问题,导致从节点接受顺序 和 写入顺序不一致。
问题和回答存在一定的因果关系,但是同步时,忽略了这种关系。所以需要前缀一致性,可以考虑在原有的评论数据上增加一种显式的因果关系,这样系统可以据此控制在其他进程的读取顺序。
4、线性一致性
前缀一致性是显式指定一种关联关系,但实际场景可能更加复杂,不可能显式的加关系,所以就有了线性一致性。
线性一致性(Linearizability)就是建立在事件的先后顺序之上的。在线性一致性下,整个系统表现得好像只有一个副本,所有操作被记录在一条时间线上,并且被原子化,这样任意两个事件都可以比较先后顺序。
但是,集群中的各个节点不能做到真正的时钟同步,这样节点有各自的时间线。那么,如何将操作记录在一条时间线上呢?这就需要一个绝对时间,也就是全局时钟。
5、因果一致性
线性一致性强依赖于时间,还是有其弊端,因此有了因果一致性。因果一致性弱于线性一致性,但是有更好的并发性能。
因果一致性的基础是偏序关系,也就是说,部分事件顺序是可以比较的。至少一个节点内部的事件是可以排序的,依靠节点的本地时钟就行了;节点间如果发生通讯,则参与通讯的两个事件也是可以排序的,接收方的事件一定晚于调用方的事件。
因果一致性没有依赖于全局时钟,但依赖于逻辑时钟,借助逻辑时钟仍然可以建立全序关系,当然这个全序关系是不够精确的。因为如果两个事件并不相关,那么逻辑时钟给出的大小关系是没有意义的。
© 著作权归作者所有
打赏
点赞 (0)
收藏 (0)
分享
微博
微信
打印
举报
上一篇:
docker笔记
下一篇:
Linux性能优化--针对CPU的一些指标
幽
幽冥领域
粉丝 2
博文 33
码字总数 21369
作品 0
成都
关注
私信
提问
加载中
请先登录后再评论。
删除一条评论
评论删除后,数据将无法恢复
取消
确定
相关文章
最新文章
开源数据访问组件--Smark.Data
Smark.Data是基于Ado.net实现的数据访问组件,提供基于强类型的查询表达式进行灵活的数据查询,统计,修改和删除等操作;采用基于条件驱动的操作模式,使数据操作更简单轻松;内部通过标准SQL...
泥水佬
2013/03/12
2.6K
0
数据中心生命周期管理--Foreman
Foreman是一个集成的数据中心生命周期管理工具,提供了服务开通,配置管理以及报告 功能,和Puppet Dahboard一样,Foreman也是一个Ruby on Rails程序.Foreman和 Dashboard不同的地方是在于,Fore...
匿名
2012/10/24
1.5W
0
Python数据分析工具包--Pandas
Python Data Analysis Library 或 pandas 是连接 SciPy 和 NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集...
匿名
2012/10/30
2.1W
2
轻量级数据存储服务--LLServer
LLServer是本人基于libevent和leveldb这两个开源软件,开发的轻量级数据存储服务器软件,借助libevent高效网络接口实现对leveldb的访问封装。 其支持http协议和memcached协议。也就是可以通过...
代震军
2012/11/06
1K
0
ORM数据访问组件--ELinq
ELinq 是一个轻量简单易用的开源Linq ORM数据访问组件,支持Nullable类型和枚举类型,对Linq的谓词提供了完美的支持,旨在让绝大部份的主流数据库都使用 Linq 来进行程序开发,让开发人员访问...
netcasewqs
2012/12/17
2K
2
没有更多内容
加载失败,请刷新页面
加载更多
下一页
自制超声波驱狗器(第三版)
文档标识符:Ultrasonic_Dog_Repellent_II_T-D-P7 作者:DLHC 最后修改日期:2020.8.13 本文链接: https://www.cnblogs.com/DLHC-TECH/p/Ultrasonic_Dog_Repellent_II_T-D-P7.html “威力”......
osc_t4kk3au7
21分钟前
0
0
测试框架mocha入门
单元测试 今天带你了解下测试框架mocha,这是一个js的测试框架,而且适用于node和浏览器环境。通过它,我们可以为我们模块、组件级别以上的代码编写单元测试用例,保证代码输出质量。 一、安...
字节逆旅
昨天
0
0
ElasticSearch 7.8.1集群搭建
通往集群的大门 集群由什么用? 高可用 高可用(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果系统每运行100个时间...
osc_hwc3munb
23分钟前
13
0
如何面对人生危机?
点击蓝字关注,回复“职场进阶”获取职场进阶精品资料一份 一名读者提问:洋哥,我7年前从大厂出来,创业多年。连续失败,没买车也没房,女朋友也和我分手了,父母也对我失望至极。最近我开始...
张善友
今天
0
0
手写AOP实现过程
一.手写Aop前基础知识 1.aop是什么? 面向切面编程(AOP):是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP)。 在进行OOP开发时,都是基于对组件(比如类)进行开发...
osc_qyg23ccq
23分钟前
0
0
没有更多内容
加载失败,请刷新页面
加载更多
下一页
OSCHINA 社区
关于我们
联系我们
合作伙伴
Open API
在线工具
码云 Gitee.com
企业研发管理
CopyCat-代码克隆检测
实用在线工具
微信公众号
OSCHINA APP
聚合全网技术文章,根据你的阅读喜好进行个性推荐
下载 APP
©OSCHINA(OSChina.NET)
工信部
开源软件推进联盟
指定官方社区
深圳市奥思网络科技有限公司版权所有
粤ICP备12009483号
顶部
以上是 数据一致性 的全部内容, 来源链接: utcz.com/z/535171.html