Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4079942
  • 博文数量: 251
  • 博客积分: 11197
  • 博客等级: 上将
  • 技术积分: 6862
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-05 14:41
个人简介

@HUST张友东 work@taobao zyd_com@126.com

文章分类

全部博文(251)

文章存档

2014年(10)

2013年(20)

2012年(22)

2011年(74)

2010年(98)

2009年(27)

分类: LINUX

2011-10-13 22:26:41

典型情况:三个副本构成一个group

 

1. 强一致性:所有的副本更新成功才返回。

                  

如上图C表示Client,【PS1S2】构成一个同步组,P表示Primary nodeS1S2是两个secondary node,强同步模型的工作流程为CP写数据,PS1S2转发,只有3个都写成功,才向C返回成功,否则写失败。这种模型对于append操作很容易实现,如果副本没有全部更新成功,向C返回失败即可,不必重新同步P和两个S的数据;但如果是overwrite,则如果在同步过程中部分成功,还要考虑数据的正确性。


同时,PS1S2同步的过程,可以进行优化,借鉴GFS的流水线复制方式(P->S1 &S1->S2),以便充分利用每个node的带宽资源。

 

2. 最终一致性:在经过一个不一致窗口后,副本最终处于一致的状态。

 


如上图是一种简单的最终一致性实现模型,通过增加一组Uupdate)节点来实现。具体做法是,C的每次更新以binlog的方式顺序的追加到Update节点(多台来避免单点),然后Update节点定期(如10ms)的将binlog重放到三个副本上(N1,N2,N3)。三个副本可以同时提供读服务,读到的数据可能不是最新的,这就要求上层业务能容忍或者在上层做一些容错(如上层的业务每次会等待不一致窗口过去后再读取数据)。

 

最终一致性的实现方式还包括大名鼎鼎的Dynamo,使用读写成功的副本数RW来控制,当R+W > N(副本数)时,即可保证最终一致性。

 

如果在最终一致性的基础上要保证每次读能读到最新的数据,可在上述模型上做点小改进。

 

  

每次C更新到U上后,必须至少同步到一个group中的P上,即P上的数据一定是最新的,系统的读请求由P节点来满足以保证每次读到的数据是最新的,付出的代价就是,两个从副本不能分担负载,使得P易成为热点,当P挂掉时,选择一个S成为新的P

 

 

阅读(9857) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

zyd_cu2013-07-13 10:30:38

sunjiankirk:强一致性讨论的有点简单了吧?多客户异步并发写的情况下,强一致性实在复杂

更新支持强一致性的确太麻烦了

回复 | 举报

sunjiankirk2013-02-28 21:35:17

强一致性讨论的有点简单了吧?多客户异步并发写的情况下,强一致性实在复杂

Bean_lee2011-10-15 12:18:58

我们关心的领域几乎重合,和兄台比,我是徒增马齿啊。

Bean_lee2011-10-15 12:18:48

我们关心的领域几乎重合,和兄台比,我是徒增马齿啊。