AWS入门指南之三:一致性问题

最近比较忙,很少来更新博客。这一次我们简单聊一聊一致性的问题。对于一个分布式系统来讲,一致性问题是一个非常重要,非常基础的问题。对于分布式系统的框架设计者,可以说是一个需要考虑的基本问题。在分布式系统中一个基础理论是CAP,具体说就是一致性(Consistency),可用性(Availability),分区容错(Partition tolerance)。一个个具体解释一下:

一致性:每一个读操作可以接收到最新的数据或者是错误

可用性:每一个请求可以接收到一个没有错误的相应,但是不保证该相应包含最后写的数据

分区容错:在网络的节点间发生任意数量的错误,比如延迟或者丢包,系统仍然可以正常工作。

从理论上讲,CAP是不可能完全实现的,为了拥有其中两个特性必须要损害第三个性能。对于分布式系统一般认为分区容错是一个必须支持的特性,原因在于分布式系统必然基于网络构建,而网络上的传输错误是不可避免的。在这里多说一句,partition的概念在AWS里很多服务中都会涉及,是一个非常普遍的需要了解的概念。以后再谈到具体的服务时再讨论。在我们只能选择两个而放弃一个的情况下,可用性和一致性只能二选一了。我们如果仔细看AWS的服务,会发现有些服务是允许用户选择那个特性优先的,比如DynamoDB,也有很多系统是不可选择的。当不可选择时,也就是说系统已经默认了哪个优先,大多数情况下是可用性优先,也有些服务是一致性优先。

当可用性优先时,又会涉及到另一个话题,这个时候什么样的系统行为是可以接受的?对于AWS来说这涉及到幂等(idempotent)和最终一致性(eventually consistency)的问题。其实这些也可以展开很多话题讲,这里我们就简单说一下幂等的意思对于写请求的顺序是不敏感的,也就是无论是怎样的顺序,最终的结果都保证是一样的。而最终一致性是说系统在一定时间后可以达到一致性的状态,也就是说在一定时间后所有client读到的数据都是一致的。幂等一般需要client特别的设计,AWS服务是没有办法保证的,但是AWS的很多关键服务会提供方法来辅助client做出幂等的设计。而最终一致性是AWS服务在保证可用性前提下的一般普遍性的选择。

在这里我们具体看一下AWS里两个最为流行的服务,S3和DynamoDB的一致性是如何设计的。对于S3和DynamoDB还不熟悉的同学,可以看一下AWS的文档。简单说S3是一个对象存储服务。DynamoDB是一个NoSQL数据库。关于它们都有不少有意思的话题可以讨论。现在我们先看看和一致性有关的内容。

S3的一致性模型:当我们在S3中创建一个对象时(PUTS new objects),S3提供的read-after-write一致性。也就是当新对象被建立并被同步到所有的AZ以后,所有的client都可以看到;而在此之前所有的client都看不到。当我们覆盖或者删除一个对象时(overwrite PUTS and DELETES),S3提供最终一致性。这意味着如果有两个client同时对一个对象做出覆盖写请求,在一定的时间内如果多个client去读这个对象,他们可能会得到不同的结果。而在一定时间后,可以保证所有client最终读到的内容是一样的。当然,这个时间一般都很短,绝大多数情况可以在2秒内达到一致性的状态。

DynamoDB一致性模型:DynamoDB对于写操作是不提供选项,而默认使用最终一致性写操作的。而对于读操作,client是可以选择是使用最终一致性读还是强一致性读的,默认是最终一致性读。如果我们还记得CAP理论的话,我们会意识到选择强一致性读会损害可用性。具体来说,可能会出现系统返回500(Internal System Error)的情况。这是为什么呢?原因在于如果我们选择强一致性读,DynamoDB会在所有的服务节点中选择一个作为主节点(Master Node),而其他的节点叫做从节点(slave node)。而Master Node会收集所有slave node的数据更新状况来判断哪个数据作为当前系统的一致性结果。一般情况下,如果有超出一半的节点选择了同一个数据作为最终结果,Master Node就会选择该结果作为当前系统的最终结果。而一旦Master Node出现任何问题,整个系统会进入暂时的不可用状态,这个时候系统各个node会判断出Master Node出现问题,而重新选举新的Master Node。当新的Master Node选举出来以后系统就可以恢复工作了。这个时间一般会持续好几秒钟。如下图所示:

关于一致性的问题就先聊到这里。大家有什么问题欢迎留言交流。

参考文档:

CAP:https://cloudacademy.com/blog/consistency-models-of-amazon-cloud-services/

S3: https://aws.amazon.com/s3/

DynamoDB:https://aws.amazon.com/dynamodb/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章