分布式系统之一致性

分布式系统一致性概念

在分布式系统中,数据一致性往往指的是由于数据的复制,不同数据节点中的数据内容是否完整并且相同。

一致性的重要性

任何一个分布式系统都无法同时满足Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性) 这三个基本需求。最多只能满足其中两项。 但是,一个分布式系统无论在CAP三者之间如何权衡,都无法彻底放弃一致性(Consistency),如果真的放弃一致性,那么就说明这个系统中的数据根本不可信,数据也就没有意义,那么这个系统也就没有任何价值可言。所以,无论如何,分布式系统的一致性问题都需要重点关注。

这里先简单提一下,由于一个分布式系统不可能放弃一致性,那么为什么有的架构师还说在某些场景中可以牺牲一致性呢?通常这里说的放弃一致性指的是放弃数据的强一致性。

一致性问题出现原因

将数据复制到分布式部署的多台机器中,可以消除单点故障,防止系统由于某台(些)机器宕机导致的不可用。 通过负载均衡技术,能够让分布在不同地方的数据副本全都对外提供服务,有效提高系统性能。

引入复制机制后,不同的数据节点之间由于网络延时等原因很容易产生数据不一致的情况。

一致性模型

强一致性
当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。这种是对用户最友好的,就是用户上一次写什么,下一次就保证能读到什么。但是这种实现对性能影响较大。

弱一致性
系统并不保证续进程或者线程的访问都会返回最新的更新过的值。系统在数据写入成功之后,不承诺立即可以读到最新写入的值,也不会具体的承诺多久之后可以读到。但会尽可能保证在某个时间级别(比如秒级别)之后,可以让数据达到一致性状态。

最终一致性
弱一致性的特定形式。最终一致性,就是不保证在任意时刻任意节点上的同一份数据都是相同的,但是随着时间的迁移,不同节点上的同一份数据总是在向趋同的方向变化。也可以简单的理解为在一段时间后,节点间的数据会最终达到一致状态。

目前分布式系统中广泛实现的是最终一致性

最终一致性模型的变种
因果一致性:如果A进程在更新之后向B进程通知更新的完成,那么B的访问操作将会返回更新的值。如果没有因果关系的C进程将会遵循最终一致性的规则。

读己所写一致性:因果一致性的特定形式。一个进程总可以读到自己更新的数据。

会话一致性:读己所写一致性的特定形式。进程在访问存储系统同一个会话内,系统保证该进程读己之所写。

单调读一致性:如果一个进程已经读取到一个特定值,那么该进程不会读取到该值以前的任何值。

单调写一致性:系统保证对同一个进程的写操作串行化。

猜你喜欢

转载自blog.csdn.net/qq_33394088/article/details/80095271