1. 最终一致性:
最终一致性是一种使数据存储具有高可用性的一致性模型。它也被称为乐观复制,是分布式系统的关键。那么,它究竟是如何工作的呢?让我们借助一个用例来理解这一点。
真实世界用例:
- 想想一个流行的微博网站,它部署在世界各地的不同地理区域,如亚洲、美洲、欧洲。此外,每个地理区域都有多个数据中心区域:北、东、西、南。
- 此外,每个区域都有多个集群,这些集群有多个服务器节点在运行。因此,我们有许多数据存储节点分布在世界各地,微博站点使用这些节点来持久化数据。由于有如此多的节点在运行,因此不存在单点故障。
- 数据存储服务是高可用的。即使有几个节点宕机了,持久化服务仍然在运行。假设一个名人在网站上发帖,全世界的人都开始喜欢这个帖子。
- 在某个时间点,日本用户喜欢帖子,将帖子的“喜欢”计数从 100 个增加到 101 个。同时,在不同地理区域的美国用户点击帖子,然后他认为“喜欢”算作 100,而不是 101。
上述用例的原因:
- 很简单,因为 Post “Like” 计数器的新更新值需要一些时间才能从日本移动到美国并更新在那里运行的服务器节点。尽管当时计数器的值为 101,但美国用户看到的旧值不一致。
- 但是当他几秒钟后刷新他的网页时,“Like”计数器值显示为 101。因此,数据最初不一致,但最终在部署在世界各地的服务器节点之间保持一致。这就是最终一致性。
2. 一致性强:
强一致性只是意味着数据必须始终保持强一致性。世界各地的所有服务器节点在任何时间点都应包含与实体相同的值。实现这种行为的唯一方法是在更新时锁定节点。
真实世界用例:
- 让我们继续上一课中相同的最终一致性示例。为了保证系统的强一致性,当日本用户喜欢发帖时,必须锁定跨不同地理区域的所有节点,以防止任何并发更新。
- 这意味着在某个时间点,只有一个用户可以更新帖子“赞”计数器值。因此,一旦日本用户将“Like”计数器从 100 更新为 101。该值将在所有节点上全局复制。一旦所有节点达成共识,锁定就会解除。现在,其他用户可以喜欢帖子了。
- 如果节点需要一段时间才能达成共识,他们必须等到那时。好吧,这在社交应用程序中肯定是不受欢迎的。但是想想股票市场应用程序,其中用户在一个时间点看到同一只股票的不同价格并同时更新它。这会造成混乱。因此,为了避免这种混淆,我们需要我们的系统高度一致。
- 必须锁定节点以进行更新。将所有请求排队是使系统高度一致的一种好方法。强一致性模型击中了系统高可用和执行并发更新的能力。这就是实现强一致性 ACID 事务的方式。
ACID 事务支持:
像 NoSQL 数据库这样动态横向扩展的分布式系统不支持全局 ACID 事务,这是由于它们的设计。开发 NoSQL 技术的全部原因是具有高可用性和可扩展性的能力。如果我们每次都必须锁定节点,它就会变得像 SQL 一样。因此,NoSQL 数据库不支持 ACID 事务,并且那些声称支持的事务对其应用了条款和条件。通常,事务支持仅限于地理区域或实体层次结构。技术开发人员确保所有强一致性实体节点都位于同一地理区域,从而使 ACID 事务成为可能。
结论 :
对于事务性的事情,请选择 MySQL,因为它提供了锁定功能并支持 ACID 事务。