一致性hash算法

来源:互联网 发布:seo每日工作 编辑:程序博客网 时间:2024/06/05 00:56
基本知识1,一致性哈希算法是分布式系统中常用算法,如,一个分布式存储系统,要将数据存储到具体的节点上,如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是数据,N是机器节点数,如果一个机器加入或退出这个集群,則所有的数据映射都无效了,如果持久化存储则要做数据迁移,如果是分布式缓存,则其他缓存失效2,一致性哈希算法的解决方法(变动最小,最优化),把数据用hash函数(MD5),映射到一个很大的空间里,并把这个哈希值空间组织成一个虚拟圆环,如假设某哈希函数H的值空间为0-2^32-1,即哈希值为一个32位无符号整形。单调性(衡量指标)如果已经有一些内容通过哈希分派到相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能保证原有已分配的内容可以被映射到新的缓冲区中区,而不会映射到旧的缓冲集合中的其他缓冲区。基本原理1,环形hash空间,顾名思义,hash的数值空间是个首尾相接的环。2,把对象映射到hash空间,如IPURL3,把cache映射到hash空间,如服务器IP4,把对象映射到cachecache和对象都已经通过统一个hash算法映射到hash数值空间中,沿着顺时针方向,从对象的key出发,直到遇见一个cache,那么就将这个对吸纳给存储到这个cache上,5,考察cache的变动a,移除cache假设cacheB挂掉了,根据以上方法,受到影响的数据仅是cacheB顺时针遍历直到下一个cache之间的对象,即是本来映射到cacheB上的那些对象b,添加cache增加一台cache D,受到影响的数据是沿cache D逆时针遍历直到下一个cache之间的对象虚拟节点(考察hash算法的另一个衡量指标)平衡性:指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使用所有的缓冲空间都得到利用。一般的hash算法,不能保证绝对的平衡,如果cache较少的话,对象并不能均匀的映射到cache上,于是一致性hash算法引入了虚拟节点的概念虚拟节点:是实际节点在hash空间的复制品,一个实际节点对应了若干个“虚拟节点”,这个对应个数也成为复制个数,“虚拟节点在hash空间中以hash值排列“虚拟节点”的hash计算可以采用对应节点的IP地址加数字后缀的方式。例如假设cache AIP地址为202.168.14.241。引入“虚拟节点”前,计算cache Ahash值:Hash(“202.168.14.241”);引入“虚拟节点”后,计算“虚拟节”点cache A1cache A2hash值:Hash(“202.168.14.241#1”);// cache A1Hash(“202.168.14.241#2”);// cache A2这里可以把hash函数当作是MD5
原创粉丝点击