最近比较忙,很少来更新博客。这一次我们简单聊一聊一致性的问题。对于一个分布式系统来讲,一致性问题是一个非常重要,非常基础的问题。对于分布式系统的框架设计者,可以说是一个需要考虑的基本问题。在分布式系统中一个基础理论是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/

AWS入门指南之三:一致性问题相关推荐

  1. Redis入门指南之三(入门)

    本节主要介绍Redis的5种数据类型,同时使用Python API来操作Redis,其中python版本为3.5, redis版本为4.0.2. redis-py 的API的使用可以分类为: (1)连 ...

  2. AWS入门指南之一:怎样创建免费的AWS账号

    从今天起,打算慢慢写一系列关于aws的文章.主要集中于AWS的一些基本知识和操作指南.这其中会穿插于介绍一些云和分布式系统的知识,但是以AWS的实现为主.可能会带有少量的代码,但是主体操作应该会使用A ...

  3. aws python库_适用于Alexa的新AWS Python SDK入门指南

    aws python库 by Ralu Bolovan 由Ralu Bolovan 适用于Alexa的新AWS Python SDK入门指南 (A Beginner's guide to the ne ...

  4. Kubernetes入门指南-基础篇

    Kubernetes入门指南-基础篇 基础入门 kubernetes简介 kubernetes是一个平台 kubernetes架构 kubernetes不是什么 核心组件 kubernetes基本概念 ...

  5. RMAN快速入门指南

    RMAN快速入门指南   1. What is RMAN? 什么是RMAN?    4 2. Terminology 专业词汇解释    4 2.1. Backup sets 备份集合    4 2. ...

  6. docker ubuntu镜像_Docker 入门指南 | Linux 中国

    该教程包含了如何创建一个新的 Docker 容器,如何运行该容器,如何从现有的 Docker 容器中创建自己的 Docker 镜像等 Docker 的一些基础知识.操作.-- Sk 在我们的上一个教程 ...

  7. Consul 入门指南

    一.安装 Consul Consul 下载地址:https://www.consul.io/downloads.html,下载后解压就是一个可执行的二进制文件consul,配置好环境变量,检查 con ...

  8. 后台产品经理入门指南(下)

    上篇指路-->后台产品经理入门指南(上),本篇继续介绍后台产品经理入门的剩余几章内容. 5.后台产品设计要点 6.分析复杂业务的几个思考维度 7.后台与中台的关系 8.后台产品的未来 05 后台 ...

  9. Steeltoe 2.4新增代码生成工具、全新入门指南等,助力.NET微服务开发

    Steeltoe框架现可帮助.NET开发人员创建云原生应用.随着其功能的扩充,该框架越来越受欢迎,下载量达到580万(并且仍在增加),这其中大部分的功能创新都源自于用户反馈.社区贡献和.NET运行环境 ...

最新文章

  1. 关​于​h​i​b​e​r​n​a​t​e​中​双​向​外​键​关​联​o​n​e​-​t​o​-​o​n​e​的​p​r​o​p​e​r​t​y​-​r​e​f​=​的​问​题(转)...
  2. python网课百度网盘-我的“便(bian)宜”Python网课第一课
  3. object-c中的bool
  4. linux安装php7.2.7
  5. 用For循环加cat按顺序合并文件
  6. 医院计算机管理工资,医院工资管理系统的设计与开发
  7. BCALV* 查看所有ALV DEMO
  8. Opencv ORC——文字定位与切割
  9. Android系统优化(65)---MTK 平台开关机、重启时间优化
  10. python变量设置为true_如果为true,则从现在起在Python中忽略变量
  11. Facebook 推机器视觉方案,能轻易读懂图片信息
  12. 怎么隐藏自己电脑上的IP地址
  13. 滴滴资深分析专家:数据如何驱动业务增长
  14. mac FileZilla下载与安装
  15. 关于kali中base64的加解密使用
  16. 查看php安装路劲,如何查看php安装位置
  17. matlab网页制作代码
  18. android 蓝色阴影,android – BottomNavigationView – 阴影和涟漪...
  19. iOS中static静态全局变量
  20. 原始Radix Tree与路径压缩

热门文章

  1. 新浪实时股票接口大全
  2. String为什么无法在方法中修改原有string变量的值
  3. spring boot security oauth2 认证服务器搭建
  4. ARM单进程脱壳之FtpRush v1.0
  5. 虚拟机WIN98操作系统下安装trw显示不正常的处理方法
  6. 2021-10-21千锋教育学习日志
  7. 用一个智能魔方,转动IP网络的时代变局
  8. 什么是L1行情接口?
  9. 《JS高级程序设计》第二遍读书笔记
  10. R语言:rvest 包