Dynamo虚节点思想解决扩容问题

来源:互联网 发布:常见的网络传输协议 编辑:程序博客网 时间:2024/05/22 11:46

这个问题实际上是数据分布方式的问题(怎么分组)。最简单最容易想到的就是根据资源数目对数据进行哈希分布,比如算出一个哈希值,然后对资源数取模。这种简单处理的结果就是当资源数变化的时候,每个数据重新取模后,其分布方式都可能变化,从而需要迁移大量的数据。

  举个简单的例子来说明一下,假设我的数据是自然数(1-20),资源现在是三台主机(A,B,C),采用取模分配方式,那么分配后A主机的数据为(1,4,7,10,13,16,19),B为(2,5,8,11,14,17,20) C(3,6,9,12,15,18) 现在增加一台主机D,重新分布后的结果是A(1,5,9,13,17) B(2,6,10,14,18) C(3,7,11,15,19) D(4,8,12,15,20) 。

  可以看到,有大量的数据需要从一台主机迁移到另外一台主机。这个迁移过程是很消耗性能的。需要找到一种方式来尽可能减少对现存数据的影响(没有影响当然也不可能,那说明新添加的主机没有数据)。

  Dynamo 采用的是 consistent hashing 来解决这个问题的。那么我们先来了解一下什么是consistent hashing。先想象一个圆,或者你自己的手表表面,把它看成是一个首尾相接的数轴,现在我们的数据,自然数,已经分布到这个圆上了,我们可以把我们的资源采用某种方式,随机的分布到这个圆上(图1-1)。


  现在我们让每一个资源负责它和上一个资源之间的数据,就是说A来负责区间(C,A],B来负责区间(A,B],C负责区间(B,C]。采用这种策略,当我们增加一个资源主机的时候,比如D,那么我们只需要影响新节点相邻的节点A所负责的范围(只需要将A中(C,D]这个区间的数据迁移到D上)就可以了。

  因为资源节点是随机分布到数据圆上的,所以当资源节点的数量足够多的时候,可以认为每个节点的负载基本是均衡的。这是原始的consistent hashing。

  Dynamo并没有采用这个模型。这个理想的理论模型跟现实之间有一个问题,在这个理论模型上,每个资源节点的能力是一样的。我的意思是,他们有相同的cpu,内存,硬盘等,也就是有相同的处理能力。可现实世界,我们使用的资源却各有不同,新买的n核机器和老的奔腾主机一起为了节约成本而合作。如果只是这么简单的把机器直接分布上去,性能高的机器得不到充分利用,性能低的机器处理不过来。

  这个问题怎么解决呢?Dynamo 使用的方法是虚节点。把上面的A B C等都想象成一个逻辑上的节点。一台真实的物理节点可能会包含几个虚节点(逻辑节点),也可能只包含一个,看机器的性能而定。

  等等,好像我们的网站还没发展成 google 呢,我们能使用的硬件资源还不多,比如就4台主机。这个时候采用上面的方式,把资源随机分布上去,几乎一定会不均衡。这要怎么办呢?我们可以把那个数据圆分成Q等份(每一个等份就是一个虚节点),这个Q要远大于我们的资源数。

  现在假设我们有S个资源,那么每个资源就承担Q/S个等份。 当一个资源节点离开系统的时候,它所负责的等份要重新均分到其他资源节点上,一个新节点加入的时候,要从其他的节点"偷"到一定数额的等份。

  这个策略下,当一个节点离开系统的时候,虽然需要影响到很多节点,但是注意,迁移的数据总量只是离开那个节点的数据量。同样,一个新节点的加入,迁移的数据总量也只是一个新节点的数据量。之所以有这个效果是因为Q的存在,使得增加和减少机器的时候不需要对已有的数据做重新哈希。这个策略的要求是Q>>S(其实还有存储备份的问题,现在还没介绍到,假设每个数据存储N个备份 则要满足Q>>S*N)。如果业务快速发展,使得不断的增加主机,从而导致Q不再满足Q>>S,那么这个策略将不断的退化。

 

转自:http://hi.baidu.com/beibeiboo/blog/item/71654029e81001f498250a0f.html