文档介绍:。硬件驱动力,网络驱动力,作为两个重要的内在动力在不同的时期起着重要的作用2~,:哈希算法是一种从稀疏值到紧密值范围的映射方法,在存储和计算定位时可以被看做是一种路由算法。通过这种路与哦算法文件块能被唯一的定位到一个节点的位置。传统的hash算法容错性和扩展性都不好,无法有效的适应面向数据系统节点的动态变化。意思就是当集群需要增加节点,传统的hash算法不容易检测到新增加的节点,此为扩展性不好,而一致性hash算法增加一个节点只会影响增加的这个节点到前一个节点之间的数据。容错性就是如果不幸一个机器C宕机了,那么机器B和C之间的数据都会被D执行,那么受影响的数据只是机器B和C之间的数据。当然,容错性和扩展性对于节点数较多的集群是比较有意义的,对于节点较少的集群似乎这两个特性并没有什么诱惑力。一致性hash的实际目的就是解决节点频繁变化时的任务分配问题,一致性hash将整个hash值空间组织成一个虚拟圆环,我们这里假设某hash函数H值空间为0~(2^32-1),即32位无符号整形。下面简述一下一致性hash的原理:这是一致性hash的整个值空间0~(2^32-1)下一步将各个服务器使用Hash进行一个哈希,具体可以选择服务器的ip或主机名作为关键字进行哈希,这样每台机器就能确定其在哈希环上的位置,假设使用四台机器进行hash:将数据key使用相同的函数Hash计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器。例如我们有ObjectA、ObjectB、ObjectC、ObjectD四个数据对象,经过哈希计算后,在环空间上的位置如下:根据一致性哈希算法,数据A会被定为到NodeA上,B被定为到NodeB上,C被定为到NodeC上,D被定为到NodeD上下面我们看看当集群机器比较少的情况例如系统中只有两台服务器,其环分布如下,此时必然造成大量数据集中到NodeA上,而只有极少量会定位到NodeB上。为了解决这种数据倾斜问题,一致性哈希算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。具体做法可以在服务器ip或主机名的后面增加编号来实现。例如上面的情况,可以为每台服务器计算三个虚拟节点,于是可以分别计算“NodeA#1”、“NodeA#2”、“NodeA#3”、“NodeB#1”、“NodeB#2”、“NodeB#3”的哈希值,于是形成六个虚拟节点:同时数据定位算法不变,只是多了一步虚拟节点到实际节点的映射,例如定位到“NodeA#1”、“NodeA#2”、“NodeA#3”三个虚拟节点的数据均定位到NodeA上。这样就解决了服务节点少时数据倾斜的问题。在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。: