分布式系统中的数据一致性问题
数据一致性
数据库系统中的数据一致性
数据一致性问题最初是存在于数据库系统中的一个概念,数据库系统中一致性问题通常指的是关联数据之间的逻辑是否完整和正确,通常数据库系统会通过使用事务来保证数据的一致性和完整性。事务本质上就是一个操作序列的有限集合,若事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态。
比如当你在淘宝中购买商品进行付款的时候,从宏观上看有以下最基本的步骤:付款成功—->发放商品,若用户付款成功之后,发放商品失败,这个时候会导致数据不一致。解决这种问题常用的方法就是使用事务,若付款成功,发放商品失败,此时将第一个操作回滚。
分布式系统中的数据一致性
在分布式系统中,为了达到系统容灾和提高系统性能,数据通常会冗余存储在不同机器,通过复制技术来进行主副本之间的数据同步。所以分布式系统中的数据一致性指的是集群中主副本数据内容的一致性
由于数据冗余在不同机器中,当集群中部分机器挂掉,也可以正常对外服务,消除单点故障
集群中的主副本同时对外提供服务,提高系统对外提供服务的性能
分布式系统数据一致性模型
根据对数据一致性的强弱可以将一致性划分为强一致性、弱一致性和最终一致性三种模型。可以通过一个例子来理解这三种一致性之间的区别与关联。
如某运营号在今日头条对一篇文章做了修改,文章存储于主副数据库,主副数据库均对外提供服务,如下:
强一致性
强一致性指的是当对数据完成更新操作之后,所有客户端访问到的数据均为更新之后的数据,这样可以保证客户端取到的总是最新的数据。要达到强一致性,将会牺牲较大的性能。
对应上述今日头条文章的例子,当运营号修改文章A之后,用户不管是通过应用服务器A访问还是通过应用服务器B访问文章都将访问到最新更新的文章。
弱一致性
弱一致性指的是当数据完成更新操作之后,系统并不保证所有的客户端访问到的数据为最新数据,但是会尽量保证在某个时间级别(如秒级或分钟级)之后,让数据达到一致性状态。
对应上述今日头条的例子,当运营号修改文章A之后,通过应用服务器B访问的用户并不能保证获取到的一定是最新的文章,但是可以保证在一段时间之后,访问的一定是最新的文章
最终一致性
最终一致性是弱一致性的一种特例。当对数据更新完之后,保证没有后续更新的前提下,系统最终返回的是上一次更新操作的值。
对应今日头条的例子,当运营号修改文章A之后,通过应用服务器A和B访问的用户最终获取到的文章一定是更新之后的文章。
最终一致性又衍生出以下几种一致性模型:
- 因果一致性:如果A进程在更新之后向B进程通知更新的完成,那么B的访问操作将会返回更新的值。如果没有因果关系的C进程将会遵循最终一致性的规则。
- 读己所写一致性:因果一致性的特定形式。一个进程总可以读到自己更新的数据。
- 会话一致性:读己所写一致性的特定形式。进程在访问存储系统同一个会话内,系统保证该进程读己之所写。
- 单调读一致性:如果一个进程已经读取到一个特定值,那么该进程不会读取到该值以前的任何值。
- 单调写一致性:系统保证对同一个进程的写操作串行化。