分布式哈希表
分布式哈希表(DHT)是P2P网络和分布式存储中常见的一项技术,是哈希表的分布式扩展。
DHT只是一种技术概念,具体的实现方式有很多种,一致性哈希是其中一种实现方式,本文主要讲述chord哈希算法,包括Dynamo和Cassandra在内很多分布式系统都采用了这种算法的变体版本。
Chord哈希算法
算法的基本思想是将哈希数值空间按照大小组成一个首尾相连的环状结构。对于每台机器,可以根据ip和端口号经过映射到哈希数值空间内,分别用Ni来表示,i代表其哈希空间内对应的数值。同时这台机器负责存储落在一段有序哈希空间内的数据,比如N14节点存储主键哈希后落在6~14范围内的键值数据。同时每个机器节点记录环中的前驱节点和后继节点地址位置。
如图为一个长度为5的二进制数值哈希算法示意图。
路由查找
算法规定在每个机器节点配置路由表(Finger Table),路由表存储m条路由信息(m为当前哈希空间二进制长度),其中第i项路由信息代表距离当前节点为2i的哈希空间数值所在的机器节点编号,上图中N14节点,其对应的路由表入如下:
距离 | 1 (20) | 2 (21) | 4 (22) | 8 (23) | 16 (24) |
---|---|---|---|---|---|
机器节点 | N20 | N20 | N20 | N25 | N5 |
对于查询主键为key的查询请求,有如下算法:
假设当前执行操作的节点为Nc,其初始值为Ni,Nc的后继节点为Ns,重复执行下列步骤:
1.判断是否c < j ≤ s,如果为真,说明key在Nc的后继节点Ns上,则Nc发送消息给Ns查找key的值value,并返回给Nc。
2.否则,Nc查找路由表,找到小于j的最大编号节点Nh,Nc向Nh发送消息,Nh重复步骤1和步骤2进行查找操作。
增加节点
当网络中增加新的节点Nnew,首先Nnew必须能够和目前网络中任意一个节点Nx建立联系,通过Nx按照路由查找算法查询Nnew对应哈希值H(Nnew)=new,找到Nnew的后继节点Ns,Ns当前的前趋节点为Np,做如下操作:
1. 将Nnew后继节点指向Ns,前趋节点置为null。
2. 周期进行稳定性检测算法(Stabilization),对网络中每个节点定期检测,同时更新路由表。
稳定性检测算法
对节点Nc执行稳定性检测流程如下:
1. 询问Nc的后继节点Ns的前驱节点Np
2. 如果Np介于Nc和Ns之间,Nc记录下Np为其后继节点。
3. 假设Nx为Nc当前的后继节点。如果Nx的前驱节点为空,或者Nc位于Nx和它的前驱节点之间,那么Nc给Nx发送消息,Nx将其前趋节点设置为Nc。
4. Nx将其部分数据迁移到Nc,即将Nx上哈希小于等于c的记录迁移到Nc上。
节点断开
节点断开分为正常离开和异常离开两种。
正常离开可以通过增加节点的方式进行节点和节点上路由表的更新。
异常离开往往是机器故障导致,此时可能导致数据丢失,可以采用保留数据副本的方式来避免。