小白学分布式程序开发3-分布式系统的数据一致性问题

今天我们来探讨一下分布式系统的数据一致性问题(What?Why?)

1.什么是数据的一致性

数据一致性其实是数据库系统中的概念。我们可以简单的把一致性理解为正确性或者完整性,那么数据一致性通常指关联数据之间的逻辑关系是否正确和完整。我们知道,在数据库系统中通常用事务(访问并可能更新数据库中各种数据项的一个程序执行单元)来保证数据的一致性和完整性。而在分布式系统中,数据一致性往往指的是由于数据的复制,不同数据节点中的数据内容是否完整并且相同。

比如:在集中式系统中,有一些关键的配置信息,可以直接保存在服务器的内存中,但是在分布式系统中,如何保存这些配置信息,又如何保证所有机器上的配置信息都保持一致,又如何保证修改一个配置能够把这次修改同步到所有机器中呢?

比如:在集中式系统中,进行一个同步操作要写同一个数据的时候,可以直接使用事务+锁来管理保证数据的ACID。但是,在分布式系统中如何保证多台机器不会同时写同一条数据呢?


小白学分布式程序开发3-分布式系统的数据一致性问题我们先带着疑问接下去看……


2、为什么会有数据一致性问题


虽然分布式系统有着诸多优点,但是由于采用多机器进行分布式部署的方式提供服务,必然存在着数据的复制。分布式系统的数据复制需求主要来源于以下两个原因

1、可用性:将数据复制到分布式部署的多台机器中,可以消除单点故障。防止系统由于某些机器宕机导致的不可用。

2、性能:通过负载均衡技术,能够让分布在不同地方的数据副本全都对外提供服务。有效提高系统性能。

在分布式系统引入复制机制后,不同的数据节点之间由于网络延时等原因很容易产生数据不一致和数据复制延迟的情况。复制机制的目的是为了保证数据的一致性。但是数据复制面临的主要难题也是如何保证多个副本之间的数据一致性。


下面我来举个例子:

>>小明和小白要回老家看奶奶去,两个人同时去两个不同的火车站买票(小明去A火车站,小白去B火车站),为了保证合理的卖票,需要在A火车站和B火车站之间共享关于剩余票数的数据。但是小明和小白要买的票只剩下一张。一张票当然只能卖给一个人。

小白学分布式程序开发3-分布式系统的数据一致性问题 


如果为了保证系统性能,那么小明和小白在买票的时候应该都可以买票成功(因为他们在买票过程中余票数据都显示还有一张余票)。两人在买完票之后,系统在做数据复制时发现一张票被卖出了两次,这时就要让小明和小白两人其中一人手中的票作废掉。这就要花费很大的力气来通知后买到这张票的人这个消息。 如果为了保证数据一致性,那么就需要在小明买票的过程中,小白只能等着。等小明买票结束,并且把余票结果同步到B火车站的售票窗口,然后小白才能知道还有没有余票可以购买。


上面的例子可以简单的说明一个系统如果想保证数据一致性很有可能影响其性能。因为并发的写请求需要在前一个写请求结束之后才能进行。

因此,如何能既保证数据一致性,又保证系统的性能,是每一个分布式系统都需要重点考虑和权衡的。一致性模型可以在做这些权衡的时候给我们很多借鉴和思考。下一课我们将重点讲一下一致性模型。


顺便关注一下我们的微信公众号呗^o^

小白学分布式程序开发3-分布式系统的数据一致性问题