[摘译] Replication and the latency-consistency tradeoff

原文地址:http://dbmsmusings.blogspot.com/2011/12/replication-and-latency-consistency.html


CAP:在出现网络分区的时候,在consistency和availability之间做tradeoff
而在系统处于正常状态的时候,我们也需要对consistent和latency之间做tradeoff

agreement也叫做consensus

有三种做replication的技术:

1.数据的更新同时被送到所有的replicas。
  如果更新不是首先通过一个预处理层或者通过某种agreement协议,那么replica之间就会出现不一致(并发更新的场景),因为每个replica可能会选择不同的更新顺序。如果更新首先经过一个预处理层或者通过某种agreement协议来决定更新的顺序,那么能保证replica之间的一致性。但是这样latency就会增加。使用agreement协议时,协议本身就会产生latency。
   使用预处理器时:
     a. 将更新路由到一个额外的系统组件(预处理器)就会增加latency
     b. 预处理器要么由多台机器组成要么由单机组成。  如果由多台机器组成,那么仍然需要agreement协议来决定操作的顺序。如果由单机组成,那么来自全世界各地的更新都会先route到这台机器,即便更新需要操作的数据所在的replica离发起操作的机器很近。

2. 数据更新首先被发到一个master node(this location can be dependent on the actual data being updated)上,同一个data item的master node一样,不同的data item,master node可能不一样
 
master node 接收同一个data item的所有更新,然后决定更新顺序。master node 执行完这些更新后,将这些更新replicate 给其它的replicas。
     这里replicate有三种:
     a.  同步replication。master node等所有的replicas更新完所有的update后然后才提交此更新。这保证了consistency,但是latency较高,因为
不同的node之间需要同步需要在节点之间传递消息,latency取决于最慢的node
     b.  异步replication。这种情况下,master node的更新完成和至少一个replica更新完成(以防master node fail)后就返回给客户端,不保证更新已经被传播到了其它的replica。consistency和latency的tradeoff体现在读的处理上:
            i. 如果所有读操作route到master node,则保证了一致性。但是可能会有latency问题
                 1. 即使发起读操作的客户端离某个replica比较近,也需要route到物理位置可能相对较远的master node上去。
                 2. 如果master node overloads 或者fail,那么对这些数据的读不能被转移到其它的replicas。这会潜在的增大读的latency。
            ii.  如果读可以被replica处理,那么latency会更好。但是会产生一致性问题。
     c.   同步和异步相结合。更新被同步到replicas的子集,其它的异步更新。consistency和latency的tradeoff体现在读的处理上:
            如果读被route到至少一个同步更新到的节点(例如:R+W > N),那么一致性保证。但是有(a),(b)(i)(1),(b)(i)(2) 这样的latency问题。如果读被没有同步更新到的节点服务(例如 R +  W < N),那么就有一致性问题。
 
3. 数据更新操作被发送到任何一个replicas,对同一个data item的更新操作可能不会落到同一个node上。
           a.  如果同步replication,则会有(2)(a)的问题,同时还要检测和解决对同一个data item在不同机器上的replica的同时更新问题,也会增加latency。
           b.  如果异步replication,则有一致性问题,如(1),(2)(b)。
 
 
所以,如果replication发生在短距离之间,(2)(a)是不错的选择,因为同一个数据中心内网络通信latency低。当处于广域网时,没有什么很明显的好的方法。
 
 
Dynamo,Riak,Cassandra (2)(c) 和(3)的组合。更新一般来说route到master node,然后同步更新到W个node上( (2)(c) )。读会同步的send到R个节点,其中R+ W < N,会有读一致性问题。但是,对于同一个data item,更新不会一直都route到master node(例如,各种各样的fail 情况,或者 被负载均衡器重新route),产生(3)的情况。
 
 
PNUTS 选择(2)(b)(ii),牺牲了一些一致性。
HBase 在同一个集群内选择(2)(a),但是跨集群的replication选择(2)(b)


posted @ 2011-12-25 21:04  吴镝  阅读(637)  评论(0编辑  收藏  举报