常见数据多副本一致性方案

在分布式系统中,选择采用多副本方案,就要面对数据一致性问题;数据一致性主要是指在多副本的情况下,如何保证各个副本间数据的一致性。数据的一致性是一个很难解决的问题,受CAP【C:一致性,A:可用性:,P:分区容忍性】原则的限制,同时只能满足其中两项指标。对于一致性我们需要根据不同的业务场景进行选择。

以数据为中心的一致性模型
1.严格一致性(strict consistency):对于数据项x的任何读操作将返回最近一次对x进行写操作的结果所对应的值。严格一致性是限制性最强的模型,但是在分布式系统中实现这种模型代价太大,所以在实际系统中运用有限。
2.顺序一致性:任何执行结果都是相同的,就好像所有进程对数据存储的读、写操作是按某种序列顺序执行的,并且每个进程的操作按照程序所制定的顺序出现在这个序列中。也就是说,任何读、写操作的交叉都是可接受的,但是所有进程都看到相同的操作交叉。顺序一致性由Lamport(1979)在解决多处理器系统的共享存储器时首次提出的。
3.因果一致性:所有进程必须以相同的顺序看到具有潜在因果关系的写操作。不同机器上的进程可以以不同的顺序看到并发的写操作(Hutto和Ahamad 1990)。
假设P1和P2是有因果关系的两个进程,例如P2的写操作信赖于P1的写操作,那么P1和P2对x的修改顺序,在P3和P4看来一定是一样的。但如果P1和P2没有关系,那么P1和P2对x的修改顺序,在P3和P4看来可以是不一样的。

以客户为中心的一致性模型
1.最终一致性:最终一致性指的是在一段时间内没有数据更新操作的话,那么所有的副本将逐渐成为一致的。例如OpenStack Swift就是采用这种模型。以一次写多次读的情况下,这种模型可以工作得比较好。
2.单调读:如果一个进程读取数据项x的值,那么该进程对x执行的任何后续读操作将总是得到第一次读取的那个值或更新的值
3.单调写:一个进程对数据x执行的写操作必须在该进程对x执行任何后续写操作之前完成。
4.写后读:一个进程对数据x执行一次写操作的结果总是会被该进程对x执行的后续读操作看见。
5.读后写:同一个进程对数据项x执行的读操作之后的写操作,保证发生在与x读取值相同或比之更新的值上。

多副本情况下的读写一致性:

  • 一主多从:只读副本保证强一致性
  • 对等副本:W+R>N保证绘画一致性
  • 提高可靠性: 增加副本数、提高副本修复速度

在实现数据一致性的方案中主要有以下几种:

这里写图片描述
采用链式请求,只有所有的副本都保存成功,才能返回成功;
优点:能够保证数据的强一致性
缺点:性能较差,整个更新过程依赖于所有节点的成功

这里写图片描述
采用多扇出的方式,主节点保存成功,然后同时向多个副本发送数据;
优点:性能较好,时间取决于主节点的保存时间和副本中最长的保存时间
确定:严重依赖主节点,高扇出,数据量大时对网络有压力
所以可以采用下图的方案,采用数据库采用的方式,先写日志再执行同步操作

这里写图片描述

由client负责向各个服务并行发送数据;
优点:速度最快,受限于最慢节点;可以采用变通的方案(如果节点中超过一定的阀值的数量已经成功,就认为成功)
缺点:client端扇出很大,如果数据量不是很大,这确实是不错的方案

实际使用过程中每种方案都是可以变通的,根据实际业务场景以及对数据一致性的要求来确定自己的方案。
在分布式系统的设计和开发中,工程师们有一个通病,起码大多数人都会犯的错,就是过度设计;在数据一致性方案中,不同的需求对方案的影响很大,过度设计和开发会造成资源的浪费。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值