解读NoSQL技术代表之作Dynamo( 二 )


进入的世界
有了上面一章里的两个基础介绍之后,我们开始进入的世界 。
的数据分区与作用
在的实现中提到一个关键的东西,就是数据分区 。假设我们的数据的key的范围是0到2的64次方(不用怀疑你的数据量会超过它,正常甚至变态情况下你都是超不过的,甚至像伏地魔等其他类系统是使用的 2的32次方),然后设置一个常数,比如说1000,将我们的key的范围分成1000份 。然后再将这1000份key的范围均匀分配到所有的节点(s个节点),这样每个节点负责的分区数就是1000/s份分区 。
如图二,假设我们有A、B、C三台机器,然后将我们的分区定义了12个 。
图二:三个节点分12个区的数据的情况
因为数据是均匀离散到这个环上的(有人开始会认为数据的key是从1、2、3、4……这样子一直下去的,其实不是的,哈希计算出来的值,都是一个离散的结果),所以我们每个分区的数据量是大致相等的 。从图上我们可以得出,每台机器都分到了三个分区里的数据,并且因为分区是均匀的,在分区数量是相当大的时候,数据的分布会更加的均匀,与此同时,负载也被均匀地分开了(当然了,如果硬要说你的负载还是只集中在一个分区里,那就不是在这里要讨论的问题了,有可能是你的哈希函数是不是有什么样的问题了) 。
为什么要进行这样的分布呢,分布的好处在于,在有新机器加入的时候,只需要替换原有分区即可,如图三所示:
图三:加入一个新的节点D的情况

解读NoSQL技术代表之作Dynamo

文章插图
同样是图二里的情况,12个分区分到ABC三个节点,图三中就是再进入了一个新的节点D,从图上的重新分布情况可以得出,所有节点里只需要转移四分之一的数据到新来的节点即可,同时,新节点的负载也伴随分区的转移而转移了(这里的12个分区太少了,如果是1200个分区甚至是12000个分区的话,这个结论就是正确的了,12个分区只为演示用) 。
从的NRW看CAP法则
在系统中,第一次提出来了NRW的方法 。
N:复制的次数;
R:读数据的最小节点数;
W:写成功的最小分区数 。
这三个数的具体作用是用来灵活地调整系统的可用性与一致性 。
举个例子来说,如果R=1的话,表示最少只需要去一个节点读数据即可,读到即返回,这时是可用性是很高的,但并不能保证数据的一致性,如果说W同时为1的 话,那可用性更新是最高的一种情况,但这时完全不能保障数据的一致性,因为在可供复制的N个节点里,只需要写成功一次就返回了,也就意味着,有可能在读的这一次并没有真正读到需要的数据(一致性相当的不好) 。如果W=R=N=3的话,也就是说,每次写的时候,都保证所有要复制的点都写成功,读的时候也是都读到,这样子读出来的数据一定是正确的,但是其性能大打折扣,也就是说,数据的一致性非常的高,但系统的可用性却非常低了 。如果R + W > N能够保证我们“读我们所写”,推荐使用322的组合 。
系统的数据分区让整个网络的可扩展性其实是一个固定值(你分了多少区,实际上网络里扩展节点的上限就是这个数),通过NRW来达到另外两个方 向上的调整 。
的一些增加可用性的补救
针对一些经常可能出现的问题,还提供了一些解决的方法 。
第一个是 数据的加入:在一个节点出现临时性故障时,数据会自动进入列表中的下一个节点进行写操作,并标记为数据,在收到通知需要原节点恢复时重新把数据推回去 。这能使系统的写入成功大大提升 。