外观
一致性哈希与普通哈希的区别
数据映射方式
- 普通哈希:将输入通过哈希函数映射到固定范围内的一个值,比如对节点数量取模来确定数据存储位置,通常是将数据均匀地分布在一个固定的哈希空间,如数组或固定大小的存储单元中。
- 一致性哈希:将数据和节点都映射到一个环形的哈希空间上,数据通过计算哈希值,并在环上顺时针找到最近的节点来决定被存储的节点。
扩展性
- 普通哈希:在分布式系统中,当增加或减少节点时,由于是对节点数量取模等方式确定存储位置,会导致大量数据需要重新计算哈希值并重新分配存储位置,扩展性较差。
- 一致性哈希:增加或删除节点时,只会影响到哈希环上该节点附近的少量数据,只需要重新分配少量的数据,大大减少了数据迁移量,扩展性较好。
容错性
- 普通哈希:如果一个节点宕机,普通哈希并不会自动调整数据的分布,可能导致数据无法访问,也不能平衡负载,不具备自动容错机制。
- 一致性哈希:当某个节点出现故障时,数据会自动映射到它在哈希环上周围的其他节点,减少数据丢失的风险,提高了系统的容错性和可用性。
负载均衡
- 普通哈希:在节点数量固定时可以实现数据均匀分布,但在节点动态变化场景下,很难保证负载均衡,容易出现某些节点负载过高,而其他节点负载较低的情况。
- 一致性哈希:通常会引入虚拟节点技术,将一个物理节点映射到多个哈希位置,使数据能够更均匀地分布在各个节点上,有助于避免数据倾斜问题,实现更好的负载均衡。
适用场景
- 普通哈希:适用于节点数量固定、数据相对静态的场景,如哈希表、本地缓存等,这些场景对数据的快速查找和简单存储有需求,不需要频繁地进行节点的扩展或收缩。
- 一致性哈希:广泛应用于分布式系统,如分布式缓存系统(如
Redis
、Memcached
)、分布式存储系统、分布式数据库等,这些系统中节点数量经常会动态变化,需要在节点增减时保证数据的稳定性和系统的性能。