Amazon的Dynamo中用到的几种技术

先占个位置

动态哈希表

第一种简单的动态哈希方法

  假使一开始的数值空间大小为4,即0~3slot,每个slot可以存3个元素,那么假使0号slot存放有4,16,20;当12想进入哈希表的时候,发现冲突,那么此时将哈希表的数值空间翻倍,新的空间为0~7,那么12mod8=4,则12进入4号slot,原来0号slot中的mod8等于4的元素也需要移动到4号slot,称0号slot为4号slot的兄弟(buddy)slot,则当新增一个元素并且发生冲突时,做出的改动、也是优点:空间翻倍,buddy slot中的部分元素移动到新slot

  优点

  一个冲突只会引起小部分元素的移动,减少了响应时间。

  缺点:

  • 一开始可能有较多的空间浪费,在这个例子中,5,6,7号slot是空闲的,但是是为其分配了内存空间的。但这也是动态哈希出现的原因,就是存储设备价格降低而产生的空间换时间的思想。
  • 如果数据有一定的偏斜性,也就是数据几种到几个slot中时,缺点1会被放大,slot的利用率较低。
  • 查询元素的时候需要进行两次或更多(根据扩容次数而定)hash,例如,如果查找元素4,则需要先4 mod 8查看是否在4号slot中,发现没有,然后再4 mod 4 查看是否在0号slot中

如果使用静态哈希的方法,当新增一个元素并且遇到冲突时,需要增加哈希slot空间,修改hash函数,然后移动原来的所有元素。动态哈希使得1个冲突只会影响到部分slot。

加表

当slot满的时候就增加一个同样的哈希表。

好处是简单,缺点是,空间浪费大,利用率低,当表增长到数量很多时,查找效率会降低,此时可采用多线程来提高查找效率

 

一致性哈希

版本(versioning)

矢量时钟(vector clocks)

仲裁(quorum)

仲裁就是延迟更新,如果有N个节点,一次选择K个节点,那么只需要更新N-K+1个节点即可,因为选择的这K个节点中肯定最少有一个是最新版本,然后根据版本(versioning)可以得到最新版本数据

posted @ 2014-03-15 15:21  我就是熊吉  阅读(454)  评论(0编辑  收藏  举报