最近碰到两种环,它们所要解决的问题并不属于同一范畴,之所以放在一起,只因为都是环,呵呵。
[size=large][b]1、一致性hash算法的环[/b][/size]
解决的是:更好的解决数据集合散列的问题;多使用于分布式存储场景。
普通的hash算法,数据是按照存储、桶来做hash,hash值与桶的位置对应起来,这样有一个缺点:数据的hash值会受桶的变化影响,桶的增加、减少会改变绝大多数数据的hash值和对应桶的位置。一致性hash算法可以解决这个问题。
解决办法:一致性hash算法固定hash函数的“分母”,“待写入的数据”和“被写入的存储节点”使用同一套hash函数,并且从0到分母的数值串成了环形。这样,待写入和被写入的数据经过hash函数后,都会被散列到这个环形的具体数值点上。
这样“写入的数据”不依赖“被写入的存储节点”的个数做hash计算,即“写入的数据”的hash值不受“被写入的存储节点”个数影响。“写入的数据”在环中按顺时针找离它最近的“存储节点”,并存储进去即可。
[img]http://dl.iteye.com/upload/attachment/266413/b74dac88-c0fc-3b25-a5e1-6777683582d8.bmp[/img]
[img]http://dl.iteye.com/upload/attachment/266415/acb1d627-73d7-3ce4-b674-8f5ae87c2519.bmp[/img]
如果简单的按照上述方法处理,那么在存储/桶的数据比较少的情况下,很容易出现数据散列不均衡的情况(Hash 算法的另一个指标是平衡性Balance)。平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。
为了解决这种情况, consistent hashing 引入了“虚拟节点”的概念,它可以如下定义:
“虚拟节点”( virtual node )是实际节点在 hash 空间的复制品( replica ),一个实际节点对应了若干个“虚拟节点”,这个对应个数也成为“复制个数”,“虚拟节点”在 hash 空间中以 hash 值排列。
[img]http://dl.iteye.com/upload/attachment/266422/a9ca3689-e700-31ff-b33b-afd6922622bb.bmp[/img]
[img]http://dl.iteye.com/upload/attachment/266424/49e53530-f44c-3e00-a266-e9772bdbaa72.bmp[/img]
[size=large][b]2、令牌环[/b][/size]
解决的是:网络通讯中的资源竞争问题。避免无序网状数据传输的情况发生,电信的基站也是按照这个方式搭建。
详述:一个称为令牌(Token)的特殊模式,使其沿着环路循环。规定只有获得令牌的站点才有权发送数据帧,完成数据发送后立即释放令牌以供其它站点使用。由于环路中只有一个令牌,因此任何时刻至多只有一个站点发送数据,不会产生冲突。而且,令牌环上各站点均有相同的机会公平地获取令牌。
[img]http://dl.iteye.com/upload/attachment/266444/61fa033f-fbce-3025-8a61-8b3905bfb1ce.bmp[/img]
[size=large][b]1、一致性hash算法的环[/b][/size]
解决的是:更好的解决数据集合散列的问题;多使用于分布式存储场景。
普通的hash算法,数据是按照存储、桶来做hash,hash值与桶的位置对应起来,这样有一个缺点:数据的hash值会受桶的变化影响,桶的增加、减少会改变绝大多数数据的hash值和对应桶的位置。一致性hash算法可以解决这个问题。
解决办法:一致性hash算法固定hash函数的“分母”,“待写入的数据”和“被写入的存储节点”使用同一套hash函数,并且从0到分母的数值串成了环形。这样,待写入和被写入的数据经过hash函数后,都会被散列到这个环形的具体数值点上。
这样“写入的数据”不依赖“被写入的存储节点”的个数做hash计算,即“写入的数据”的hash值不受“被写入的存储节点”个数影响。“写入的数据”在环中按顺时针找离它最近的“存储节点”,并存储进去即可。
[img]http://dl.iteye.com/upload/attachment/266413/b74dac88-c0fc-3b25-a5e1-6777683582d8.bmp[/img]
[img]http://dl.iteye.com/upload/attachment/266415/acb1d627-73d7-3ce4-b674-8f5ae87c2519.bmp[/img]
如果简单的按照上述方法处理,那么在存储/桶的数据比较少的情况下,很容易出现数据散列不均衡的情况(Hash 算法的另一个指标是平衡性Balance)。平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。
为了解决这种情况, consistent hashing 引入了“虚拟节点”的概念,它可以如下定义:
“虚拟节点”( virtual node )是实际节点在 hash 空间的复制品( replica ),一个实际节点对应了若干个“虚拟节点”,这个对应个数也成为“复制个数”,“虚拟节点”在 hash 空间中以 hash 值排列。
[img]http://dl.iteye.com/upload/attachment/266422/a9ca3689-e700-31ff-b33b-afd6922622bb.bmp[/img]
[img]http://dl.iteye.com/upload/attachment/266424/49e53530-f44c-3e00-a266-e9772bdbaa72.bmp[/img]
[size=large][b]2、令牌环[/b][/size]
解决的是:网络通讯中的资源竞争问题。避免无序网状数据传输的情况发生,电信的基站也是按照这个方式搭建。
详述:一个称为令牌(Token)的特殊模式,使其沿着环路循环。规定只有获得令牌的站点才有权发送数据帧,完成数据发送后立即释放令牌以供其它站点使用。由于环路中只有一个令牌,因此任何时刻至多只有一个站点发送数据,不会产生冲突。而且,令牌环上各站点均有相同的机会公平地获取令牌。
[img]http://dl.iteye.com/upload/attachment/266444/61fa033f-fbce-3025-8a61-8b3905bfb1ce.bmp[/img]