一致性哈希算法
一致性哈希,是一种比较特殊的hash算法,它的核心思想是解决分布式环境下,hash表中可能存在动态扩容和缩容的问题。
一般情况下,我们会使用hash表的方式key-value的方式存储数据,但当数据量大时,我们就会存储于多个节点,然后通过hash取模的方式来决定当前key存储于哪个节点。但这里会有一个非常明显的问题,就是当存储节点增加或者减少的时候,原本的映射关系就会发生变化。也就是需要重新对所有数据重新hash映射,这样比较麻烦涉及大量数据迁移和重新映射。
一致性hash算法就是应对这种情况,它的具体工作原理是这样,通过一个hash环实现,起始点为0,终点为2^32-1,然后把存储节点的ip作为key进行hash之后,会在Hash环上确认一个位置。
接下来,把所有需要存储的数据key使用hash算法落入hash环后,然后这个目标key按顺时针方向找到最近的一个节点,进行数据存储。
这时候新增一个节点,也就只有少部分数据需要重新映射,而某个节点故障,也只需要将故障的节点重新分配到下一个节点就行了。
所以在我看来,一致性hash算法的好处就是扩展性很强,在增加或者减少服务器的时候,数据迁移范围比较小。
另外,在一致性hash算法中,为了避免hash倾斜导致数据分配不均匀的情况,我们可以使用虚拟节点的方式解决。
一致性哈希算法hash倾斜
将实际的物理节点分成多个虚拟节点,在缓存读写的时候,原本直接找对应的物理节点,现在是先找到虚拟节点,再找对应的物理节点,最后再进行读写
常见应用的技术
-
分布式缓存系统(如 Memcached)
-
原理和作用:
- 在分布式缓存系统中,一致性哈希用于将缓存数据均匀地分布在多个缓存节点上。当客户端请求缓存数据时,通过对数据的键进行哈希计算,根据一致性哈希算法确定数据存储在哪个缓存节点。例如,在一个有多个 Memcached 服务器节点的分布式缓存环境中,数据的存储和读取操作依据一致性哈希算法来定位节点,这样可以避免在增加或减少节点时,大量缓存数据的重新分布。
-
节点变化时的数据迁移优势:
- 当有新的缓存节点加入或旧节点离开时,一致性哈希算法能够使只有少部分数据需要重新分配存储节点。比如,从一个包含 3 个缓存节点的系统扩展到 4 个节点时,只有在新节点插入位置附近的数据需要迁移,其他大部分缓存数据的存储位置不受影响,从而减少了数据迁移的工作量和对系统性能的影响。
-
原理和作用:
-
内容分发网络(CDN)
-
原理和作用:
- CDN 使用一致性哈希来决定用户请求的内容(如网页、图片、视频等)应该从哪个边缘服务器(靠近用户的服务器)获取。通过对内容的 URL 等标识信息进行哈希计算,将内容映射到 CDN 网络中的边缘服务器上。例如,当用户请求一个网页资源时,CDN 系统根据一致性哈希算法快速确定距离用户最近且存储该资源的边缘服务器,提高用户访问内容的速度。
-
应对节点和内容变化的灵活性:
- 随着互联网内容的不断更新和 CDN 节点的动态调整(如新增节点以覆盖新的区域或删除性能不佳的节点),一致性哈希算法能够有效地处理这些变化。它可以保证在节点和内容变化过程中,内容到节点的映射能够相对稳定地过渡,减少因重新分配导致的服务中断和性能下降的风险。
-
原理和作用:
-
分布式存储系统(如一些分布式文件系统)
-
原理和作用:
- 在分布式存储系统中,一致性哈希用于确定数据块在存储节点上的分布。对于存储的文件,系统会将文件分割成多个数据块,通过一致性哈希算法将这些数据块分配到不同的存储节点。例如,在一个分布式文件系统中,文件的数据块被均匀地分布在多个存储节点上,当用户请求读取或写入文件时,系统根据一致性哈希算法找到对应的存储节点进行操作,提高了存储系统的读写性能和扩展性。
-
扩展性和数据均衡方面的优势:
- 这种算法有助于系统的扩展,当添加新的存储节点时,新的数据块可以按照一致性哈希规则分配到新节点上,同时只有部分旧数据块可能需要重新分布,从而实现存储系统的平滑扩展。并且,它能够在一定程度上保证数据在存储节点之间的均衡分布,避免出现某些节点存储过多数据而其他节点闲置的情况。
-
原理和作用: