提供的服务主要包括:
- 弹性计算云EC2
- 简单存储服务S3
- 简单数据库服务Simple DB
- 简单队列服务SQS
- 弹性MapReduce服务
- 内容推送服务CloudFront
- 电子商务服务DevPay
- FPS
一、基础存储架构Dynamo
(一)Dynamo概况
为了保证其稳定性,Amazon的系统采用完全的分布式、去中心化的架构。
- 作为底层存储架构的Dynamo也同样采用了无中心的模式
- Dynamo只支持简单的键/值(key/value)方式的数据存储,不支持复杂的查询
- Dynamo中存储的是数据值的原始形式,即按位存储,并不解析数据的具体内容
(二)Dynamo架构的主要技术
Dynamo在设计时被定位为一个基于分布式存储架构的,高可靠、高可用且具有良好容错性的系统。下表列举了Dynamo设计时面临的主要问题及所采取的解决方案。
问题 | 采取的相关技术 |
---|---|
数据均衡分布 | 改进的一致性哈希算法 |
数据备份 | 参数可调的弱quorum机制 |
数据冲突处理 | 向量时钟(Vector Clock) |
成员资格及错误检测 | 基于Gossip协议的成员资格和错误检测 |
临时故障处理 | Hinted handoff(数据回传机制) |
永久故障处理 | Merkle哈希树 |
Dynamo中的存储节点呈无中心的环状分布。包含两个基本概念:preference list 是存储与某个特定键值相对应的数据的节点列表;coordinator 是执行一次读或写操作的节点。通常,coordinator 是 preference list 上的第一个节点。
1、数据均衡分布的问题
Dynamo采用了分布式的数据存储架构,均衡的数据分布可以保证负载平衡和系统良好的扩展性。因此,如何在各个节点上数据的均衡性是影响Dynamo性能的关键问题。Dynamo中使用改进后的一致性哈希算法,并在此基础上进行数据备份,以提高系统的可用性。
(1)一致性哈希算法
一致性哈希算法是目前主流的分布式哈希表(Distributed Hash Table,DHT)协议之一,于1997年由麻省理工学院提出。一致性哈希算法通过修正简单哈希算法,解决了网络中的热点问题,使得DHT可以真正地应用于P2P环境中。
一致性哈希算法除了能够保证哈希运算结果充分分散到整个环上外,还能保证在添加或删除设备节点时只会影响到其在哈希环中的前驱设备节点,而不会对其他设备节点产生影响。
一致性哈希算法可以大大降低在添加或删除节点时引起的节点间的数据传输开销。
(2)改进的一致性哈希算法
Dynamo中引入了虚拟节点的概念。每个虚拟节点都隶属于某一个实际的物理节点,一个物理节点根据其性能的差异被分为一个或多个虚拟节点。各个虚拟节点的能力基本相当,并随机分布在哈希环上。
Dynamo将整个哈希环划分成Q等份,每个等份称为一个数据分区(Partition)。在存储数据时,每个数据会被先分配到某个数据分区,再根据负责该数据分区的虚拟节点,最终确定其所存储的物理节点。
数据分区的好处:
- 减小数据分布不均衡的可能性
- 添加或删除设备节点时引起较小的数据传输
2、数据备份
在Dynamo中,每个数据的副本备份存储在哈希环顺时针方向上该数据所在虚拟节点的后继节点中。数据备份在存储数据的同时进行,会使每次写操作的延时变长。
Dynamo中对写操作进行了优化,保证一个副本必须写入硬盘,其他副本只要写入节点的内存即返回写成功。每个虚拟节点上实际存储了分配给它以及分配它的前N-1个前驱虚拟节点的数据。
3、数据冲突问题
Dynamo选择通过牺牲一致性来保证系统的可靠性和可用性,没有采用强一致性模型而采用了最终一致性模型。由于Dynamo中可能出现同一个数据被多个节点同时更新的情况,且无法保证数据副本的更新顺序,这有可能会导致数据冲突。
Dynamo中采用了向量时钟技术(Vector Clock),Dynamo中的向量时钟通过 [node, counter] 对 来表示。node表示操作节点;counter是其对应的计数器,初始值为0,节点每进行一次更新操作则计数器加1。
4、成员资格及错误检测
由于Dynamo采用了无中心的架构,每个成员节点都需要保存其他节点的路由信息。为了保证每个节点都能拥有最新的成员节点信息,Dynamo中采用了一种类似于Gossip(闲聊)协议的技术。
Dynamo中还通过Gossip来实现错误检测任何节点向其他节点发起通信后,如果对方没有回应,则认为对方节点失效。
为了避免新加入的节点之间不能及时发现其他节点的存在,Dynamo中设置了一些种子节点(Seed Node)。种子节点和所有的节点都有联系。当新节点加入时,它扮演一个中介的角色,使新加入节点之间互相感知。
- 自底向上每一层代表一次随机通信
- 第一层节点1将信息交换给节点2
- 第二层节点1和2同时开始随机选择其他节点交换信息
- 直到N个节点全部传遍
结论:Dynamo中的节点数不能太多;Amazon采用了分层Dynamo结构来解决该问题。
5、容错机制
(1)临时故障处理机制
为了处理临时失效的节点,Dynamo中采用了一种带有监听的数据回传机制(Hinted Handoff)。当虚拟节点A失效后,会将数据临时存放在节点D的临时空间中,并在节点A重新可用后,由节点D将数据回传给节点A。
(2)永久性故障处理机制
Dynamo采用Merkle哈希树技术来加快检测和减少数据传输量。
二、弹性计算云EC2
(一)EC2的基本架构
主要包括了Amazon机器映象、实例、存储模块等组成部分,并能与S3等其他Amazon云计算服务结合使用。
1、Amazon机器映象(AMI)
Amazon机器映像(Amazon Machine Image,AMI)是包含了操作系统、服务器程序、应用程序等软件配置的模板。当用户使用EC2服务去创建自己的应用程序时,首先需要构建或获取相应的AMI。
构建好的AMI分为Amaznon EBS支持和实例存储支持两类。
2、实例(Instance)
EC2中实例由AMI启动,可以像传统的主机一样提供服务。同一个AMI可以用于创建具有不同计算和存储能力的实例。Amazon提供了多种不同类型的实例,分别在计算、GPU、内存、存储、网络、费用等方面进行了优化。Amazon还允许用户在应用程序的需求发生变更时,对实例的类型进行调整,从而实现按需付费。
Amazon EC2还为实例提供了许多附加功能,帮助用户更好地部署和管理应用程序。
3、弹性块存储(EBS)
EBS存储卷的设计与物理硬盘相似,其大小由用户设定,目前提供的容量从1GB到1TB不等。
EBS存储卷适用于数据需要细粒度地频繁访问并持久保存的情形,适合作为文件系统或数据库的主存储。快照功能是EBS的特色功能之一,用于在S3中存储Amazon EBS卷的时间点副本。
(二)EC2的关键技术
1、地理区域和可用区域
EC2系统中包含多个地理区域,而每个地理区域中又包含多个可用区域。为了确保系统的稳定性,用户最好将自己的多个实例分布在不同的可用区域和地理区域中。
2、EC2的通信机制
EC2的实例一旦被创建就会动态地分配公共IP地址和私有IP地址。私有IP地址由动态主机配置协议(DHCP)分配产生。
3、弹性负载平衡
弹性负载平衡功能允许EC2实例自动分发应用流量,从而保证工作负载不会超过现有能力,并且在一定程度上支持容错。弹性负载平衡功能可以识别出应用实例的状态,当一个应用运行不佳时,它会自动将流量路由到状态较好的实例资源上,直到前者恢复正常才会重新分配流量到其实例上。
4、监控服务
用户只需要选择EC2实例,设定监视时间,CloudWatch就可以自动收集和存储检测数据。
5、自动缩放
自动缩放可以按照用户自定义的条件,自动调整EC2的计算能力:
- 需求高峰期:确保EC2实例的处理能力无缝增大
- 需求下降时:自动缩小EC2实例规模以降低成本
自动缩放功能特别适合周期性变化的应用程序,它由CloudWatch自动启动。
6、服务管理控制台
各项技术通过互相配合来实现EC2的可扩展性和可靠性。
(三)EC2的安全及容错机制
安全组是一组规则,用户利用这些规则来决定哪些网络流量会被实例接受,其他则全部拒绝。当用户的实例被创建时,如果没有指定安全组,则系统自动将该实例分配给一个默认组。默认组只接受组内成员的消息,拒绝其他消息。当一个组的规则改变后,改变的规则自动适用于组中所有的成员。
SSH是目前对网络上传输的数据进行加密的一种很可靠的协议,当用户创建一个密钥对时,密钥对的名称(Key Pair Name)和公钥(Public Key)会被存储在EC2中。
EC2引入了弹性IP地址的概念。弹性IP地址和用户账号绑定而不是和某个特定的实例绑定;弹性IP地址和用户账号绑定而不是和某个特定的实例绑定;通过弹性IP地址改变映射关系总可以保证有实例可用。