添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

一致性hash设计出来的目的是: 根据数据的hash值把数据分布在n个节点上,当新增一个节点或者删除一个节点后根据算法重新计算,可以保证大部分数据都分布在原来节点上,只需要移动少部分数据即可。

再具体一点,当删除一个节点,只要把属于这个节点上的数据移动到其它节点上,当增加一个节点,只要从其它节点上把属于这个节点的数据自动过来。而保持不动的节点之间不需要数据移动。

下面是具体原理:

Cassandra的对数据key的hash值范围是long的最小值到long的最大值。每个节点默认负责这个单位内的256个范围。我们这里用4个范围代替。首先我们用一个圆(hash环)来表示整个hash范围。然后每个节点随机取4个点,假设我们当前有三个节点(A,B,C),如下图所示:

整个hash环就被分割为了12段,顺时针去看,A和B之间的hash段就属于A,B和C之间的hash段就属于B,以此类推。

一条数据的分区key的hash值落在哪个段里,就存到对应的机器上。

现在看如果要增加一个节点。我们同样在圆上增加随机的4个点。
​这样整个圆被分割成了16个段,同样顺时针看,我们发现大多数分段仍然属于原来的节点,只有四个小段属于了新节点D,也就是说只要移动这四个小段的数据到新节点D上,我们就完成了数据的再均衡,完成了节点扩容。

同样的如果用想退役D节点,只要把对应的分段的数据再挪回去,就完成了缩容。而大部分数据不需要移动。

这个算法就叫做一致性hash算法。

分类: 软件技术 | 标签: | 作者: 大岩不灿
  • AngularJS 最常用的八种功能 (290,344)
  • elasticsearch三个重要的优化 (76,865)
  • 使用curl命令操作elasticsearch (73,570)
  • elasticsearch的实现全文检索 (68,258)
  • java实现cassandra的增删改查 (58,615)
  • AngularJS ng-repeat下使用ng-model (58,564)
  • elasticsearch的java搜索语法 (50,604)
  • cassandra2.0 如何实现分页查询 (44,691)
  • slf4j、log4j 的使用 (35,016)
  • elasticseach日常维护之shard管理 (28,860)
  • elasticsearch如何安全重启节点 (28,226)
  • 关于cassandra集群的数据一致性问题 (27,568)
  •