云端磁盘:网络巨头如何存储数据(下)
jim 发表于:12年04月09日 09:47 [编译] 存储在线
当数据被写入到Dynamo时——通过一个“put”请求——系统会给要写入的数据分配一个键值。这个值是通过128位MD5哈希得到的;哈希的值 作为数据在环中的一个地址。负责该地址的数据节点会变成该数据的“协调节点”,负责处理对它的请求并把数据复制提交给环中的其他节点。
这将使请求散布到系统中的所有节点。在其中一个节点发生错误时,它在环上的虚拟相邻节点开始接受请求,用它们的副本填补空白。
接下来是Dynamo的一致性检查方案。当一个“get”请求由客户端程序发出时,Dynamo调查它的节点来找到谁有所请求数据的副本。带有副本 的每个节点响应,提供上次改动的信息,基于一个向量时钟——一个追踪数据变化依赖关系的版本控制系统。依照调查的设置,请求处理器可以等待第一个响应并返 回(如果应用程序数据繁忙而且冲突的风险很低——像Hadoop程序一样)或者可以等待两个,三个或者更多响应。对于存储节点的多个响应,处理器进行检查 从而找出哪一个是最新的并提醒陈旧节点从最新的节点处复制数据,或者合并无冲突的编辑的版本。该方案大多数情况下弹性很强——如果节点死了,而新的已经在 线,那么最新的数据将被复制到新节点上。
Dynamo最新的改进,DynamoDB的创立,就是为什么亚马逊内部开发者没有自己采用Dynamo作为他们应用的基础的结果,取而代之的则是,依靠建立在它之上的服务——S3,SimpleDB和Elastic Block Storage。亚马逊在2011年四月中断时所面临的问题就是安装在集群间的副本高于应用套件——在亚马逊Elastic Block Storage,副本超过了可用的额外容量,而不是Dynamo本身的问题。
Dynamo的总体稳定性使它成为开源界模仿者的灵感,就像GFS一样。Facebook依赖于Cassandra,一个基于Dynamo的Apache项目。Basho的Riak “NoSQL”数据库同样来源于Dynamo架构。