云端磁盘:网络巨头如何存储数据(下)
jim 发表于:12年04月09日 09:47 [编译] 存储在线
相关阅读: 云端磁盘:网络巨头如何存储数据(上)
亚马逊S3和Dynamo
当亚马逊开始建立其网络服务平台时,该公司比谷歌有更多不同的应用问题。
直到最近,像GFS一样,Dynamo还没有直接暴露给客户。如同亚马逊首席技术官Werner Vogels在其2007年的博客的解释,它是存储服务和其他高度公开给亚马逊客户的亚马逊云计算服务的基础,包括亚马逊的简单存储服务(S3)和 SimpleDB。但在今年1月18日,亚马逊推出了一个叫做DynamoDB的数据库服务,基于最新改进的Dynamo。它给客户一个如“NoSQL” 数据库的直接接口。
Dynamo与GFS和HDFS有一些相同的地方:它同样是设计成为了高可用性而不关注数据在跨系统交换时的一致性,还为了运行在亚马逊大量集合的硬件上。但是相似性到此为止,因为对Dynamo的要求完全不同。
亚马逊需要一种可以处理更多用途的数据访问的文件系统——比如像是亚马逊自己的电子商务功能,包括顾客购物车,和其他交易型的系统。公司需要更细微和动态的对数据的访问。比起对大数据流的优化,需求更倾向于对稍小元素的更随机的访问,比如类似网页的访问。
根据Vogels和他的团队在2007年10月操作系统原理大会的座谈会上发表的报告,“Dynamo面向那种需要储存相对小的(通常小于1M)目标的应用。”比起为读取的优化,Dynamo更是被设计成“随时可写的”,数据输入高度可用——正好与谷歌的模型相反。
“对于一些亚马逊的服务”,亚马逊Dynamo开发组在报告中写道,“拒绝客户更新可能导致很差的用户体验。例如,购物车服务必须允许顾客从购物车中添加和移除物品即使是在网络和服务器发生故障时。”与此同时,基于Dynamo的服务可以应用到更大的数据集——事实上,亚马逊提供了比Dynamo更好的以S3为基础的基于Hadoop的Elastic MapReduce服务。
为了达到这些要求,Dynamo的架构几乎与GFS有天壤之别——它更接近与一个对等系统而不是主从方式。Dynamo同样逆转了对一致性的处理,去除了让系统在数据写入后解决复制问题,取而代之的是在执行读取数据时解决冲突问题。因此,Dynamo从不拒绝数据写入,不管是新数据还是对现有数据的改动,副本立即更新。
由于担心中央主服务器出错而造成麻烦(根据以往服务中断的经验)和亚马逊为其云服务添加设备的速度,Vogel的团队选择了一种分散的复制方法。它是基于自管理的数据分割方案,使用了一致性哈希的概念。每个Dynamo集群内的资源都被映射成一个连续的环状地址空间,系统中的每个存储节点在被添加到集群中时都被赋予一个随机值——在Dynamo环中表示其“位置”的值。在集群内存储节点数量的基础上,每个节点根据其位置负责地址空间中的一个块。当存储节点被添加到环中时,它们接管了地址空间中的块,环中在它们两侧的节点调整它们所负责的部分。由于亚马逊担心当更新更好的硬件加入集群后存储系统的不平衡负载问题,Dynamo允许将多个虚拟节点分配到每个物理节点上,让集群中的更好的系统更好地分享地址空间。