论坛首页 Java企业应用论坛

EC2介绍(四)

浏览 1517 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-06-29   最后修改:2011-06-29

一、可靠性、可用性和一致性

    可靠性也可称为partition tolerance。因而有CAP三者不可同时达到的说法(Consistency,Availability,Partition tolerance)。
    古人云:鱼和熊掌不可兼得,现在是鱼、熊掌和燕窝三者不可兼得了:)这个结论有严格的数学证明,具体证明可以参考相关文档。
    Dynamo牺牲一定的一致性来达到另外两者,他采用最终一致性(Eventual Consistency)。最终一致性指的是,一次数据更新操作后,系统不保证所有的读操作马上能读到最新信息,但是如果没有后续更新操作,过一段时间后,系统中的数据最终是一致的。

       Dynamo 保证的是最终一致性, 就是说, 如果一个更新操作正确的完成了, Dynamo 不保证所有的读操作都立刻能读到最新信息. 我们看看具体实现就明白了为什么是这个行为. dynamo有一层叫做coordinator, 是可以放到任意位置的, 我们假设放到了客户端. 那么一个写操作, coordinator 会根据一致性哈希算法选择三个节点(不妨设为 A B C), 同时发三个写操作的包, 然后等候回应. 假设规定时间内, 只有两个节点返回成功(不妨设为A B), 也就是说, 第三个节点没成功, 这个时候coordinator会再选择一个不同与上面三个的第四个节点, 发出写操作, ...直到写成功为止(不妨设这个节点是X). 这样保证了备份数. 额外被选择的节点(X)存储这个数据信息到一个单独的目录中, X节点负责不断的尝试把这部分数据写回到C节点. 这个过程叫做 hinted handoff. 在这样的策略下, 因为R=1, 读任何一个节点都是有效的, 假设客户读节点 A B, 那么读到的都是最新数据, 如果读节点C, 可能读到老的数据. 但是无论如何读不到脏数据. 因为在可期望的时间内, 所有的节点上的数据可以达到一致, 所以这种一致性叫做最终一致性.  二、数据冲突的解决

       在这样的模型下,数据冲突的解决可能需要调用者自己参与解决。

    Dynamo中的每个数据都包含版本号,版本号在每次更新后都会递增。这个特性有助于防止由于数据的幵发更新导致的问题。比如,系统有一个value “a,b,c”A B 同时get 到这个valueA 执行操作,在后面添加一个dvalue “a,b,c,d”B 执行操作添加一个evalue ”a,b,c,e”。如果不加控制,无论A B 谁先更新成功,它的更新都会被后到的更新覆盖。

    由于Dynamo采用了最终一致性的原则,因而它无法法解决这个问题,但是引入了version 机制避免这样的问题。还是拿刚才的例子,AB 取到数据,假设版本号为10A 先更新,更新成功后,value ”a,b,c,d”,与此同时,版本号会变为11。当B 更新时,由于其基于的版本号是10,服务器会拒绝更新,从而避免A的更新被覆盖。B 可以选择get 新版本的value,然后在其基础上修改,也可以选择强行更新。这就需要调用者来决定了。因而在这个意义上他对调用者是不透明的。

二、数据副本的管理

    由于数据分布式管理,理论上每个节点的数据是不相同的,那么必然出现一个问题:万一某个节点失效了怎么办?因此需要有数据副本的管理。如下图所示:



 

 

    一份数据有N个副本,N可配置,通常为3。保存副本的Node为当前Node的下一个至N-1个为止,如果当前节点的下一个节点为同在一个物理机的需节点,则跳过,寻找下一个物理节点。

 

三、Dynamo的容错处理

 

         容错的重要性:错误是常态

         数据读写机制:W+R>N

         临时故障处理:Sloppy quorum/数据回传

         永久故障恢复:Merkle 

 

 

    由于Dynamo采用普通PC作为存储节点,因此错误是常态。它的很多设计也正是基于这个出发点的,比如去中心化,支持动态的节点增减等。

    下面主要讲一下他的读写机制。

 

·                      N — 数据复制的份数

·                      W — 更新数据是需要保证写完成的节点数

·                      R — 读取数据的时候需要读取的节点数

如果W+R>N,写的节点和读的节点重叠,则是强一致性。例如对于典型的一主一备同步复制的关系型数据库,N=2,W=2,R=1,则不管读的是主库还是备库的数据,都是一致的。

如果W+R<=N,则是弱一致性。例如对于一主一备异步复制的关系型数据库,N=2,W=1,R=1,则如果读的是备库,就可能无法读取主库已经更新过的数据,所以是弱一致性。

对于分布式系统,为了保证高可用性,一般设置N>=3。不同的N,W,R组合,是在可用性和一致性之间取一个平衡,以适应不同的应用场景。

·                      如果N=W,R=1,任何一个写节点失效,都会导致写失败,因此可用性会降低,但是由于数据分布的N个节点是同步写入的,因此可以保证强一致性。

·                      如果N=R,W=1,只需要一个节点写入成功即可,写性能和可用性都比较高。但是读取其他节点的进程可能不能获取更新后的数据,因此是弱一致性。这种情况下,如果W<(N+1)/2,并且写入的节点不重叠的话,则会存在写冲突。

    至于分布式存储的其他方面,还有待深入研究,这会在以后再写。

(全文完)

 

 

 

 

  • 大小: 18.7 KB
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics