一致性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算法。
分类:
软件技术
| 标签:
cassandra
| 作者:
大岩不灿
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)