锁定老帖子 主题:EC2介绍(四)
精华帖 (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 到这个value。A 执行操作,在后面添加一个d,value 为 “a,b,c,d”。B 执行操作添加一个e,value 为”a,b,c,e”。如果不加控制,无论A 和B 谁先更新成功,它的更新都会被后到的更新覆盖。 由于Dynamo采用了最终一致性的原则,因而它无法法解决这个问题,但是引入了version 机制避免这样的问题。还是拿刚才的例子,A和B 取到数据,假设版本号为10,A 先更新,更新成功后,value 为”a,b,c,d”,与此同时,版本号会变为11。当B 更新时,由于其基于的版本号是10,服务器会拒绝更新,从而避免A的更新被覆盖。B 可以选择get 新版本的value,然后在其基础上修改,也可以选择强行更新。这就需要调用者来决定了。因而在这个意义上他对调用者是不透明的。 由于数据分布式管理,理论上每个节点的数据是不相同的,那么必然出现一个问题:万一某个节点失效了怎么办?因此需要有数据副本的管理。如下图所示:
一份数据有N个副本,N可配置,通常为3。保存副本的Node为当前Node的下一个至N-1个为止,如果当前节点的下一个节点为同在一个物理机的需节点,则跳过,寻找下一个物理节点。
• 容错的重要性:错误是常态 • 数据读写机制: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,并且写入的节点不重叠的话,则会存在写冲突。 至于分布式存储的其他方面,还有待深入研究,这会在以后再写。 (全文完)
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 1532 次