企业网站建设开始起步文章,自己做个网站,网站的性能特点,让网站排名下降前言#xff1a;
在分布式系统中#xff0c;数据的分布和负载均衡是至关重要的问题。一致性哈希算法是一种解决这些挑战的有效工具#xff0c;它在分布式存储、负载均衡和缓存系统等领域得到了广泛应用。
随着互联网规模的不断扩大#xff0c;传统的哈希算法在面对大规模…前言
在分布式系统中数据的分布和负载均衡是至关重要的问题。一致性哈希算法是一种解决这些挑战的有效工具它在分布式存储、负载均衡和缓存系统等领域得到了广泛应用。
随着互联网规模的不断扩大传统的哈希算法在面对大规模数据时往往会遇到性能瓶颈和负载不均衡的问题。一致性哈希算法的出现填补了这一空白它能够将数据分布到不同的节点上同时保证在节点的增减时最小化数据迁移从而提高了系统的可扩展性和稳定性。
目录
前言
传统的Hash算法
一致性Hash算法
解决传统的Hash算法的问题
应用场景
总结 无论是传统的Hash算法还是一致性Hash算法解决的都是分布式缓存下 多节点 之间 的问题
传统的Hash算法
我们直接用场景举例当我们有多台缓存中间件来缓存数据的时候比如Redis集群当一个数据发送过来的时候我们要面临一个问题这个数据应该存到哪台服务器中
我们用图片说明 比如现在有一个文件hash之后得到的值是7463322然后我们用 服务器台数 取余。 7463323 % 3 1 那么我们就把这个文件放到编号为1的服务器中。
因为对同一个文件做相同的hash时得到的hash值时不变的所以当需要访问图片的时候我们可以再次Hash找到目标服务器读取文件。
这种算法就是Hash算法但是这种Hash算法有两个明显的缺点
1.Hash算法散列度不够导致单个服务器堆积多个文案 2. 变化服务器台数之后原文件可能无法在正确的服务器中获得文件。 这样就导致缓存系统无法起到替代数据库分担一部分访问压力的作用可能会导致大量的请求直接打到数据库导致数据库崩溃。
通过简单的介绍我们看到了传统的Hash算法的弊端那么在不断的改进之下一致性Hash算法 横空出世。
一致性Hash算法
我们可以构想现在有一个 2^32个点所组成的圆环我们把它叫做Hash环 圆环的正上方的点代表00点右侧的第一个点代表1以此类推2、3、4、5、6……直到2^32-1,也就是说0点左侧的第一个点代表2^32-1我们把这个由 2^32 个点组成的圆环称为hash环。
假设我们现在有三台缓存服务器 服务器A 服务器B 服务器C 。现在我们可以将这三台服务器编号Hash值 与 2 ^ 32 次方进行取余。得到的结果可以 映射 在 我们设计的这个Hash环 上 当我们在选择把文件存储到哪一个缓存服务器中的时候采用以下算法 1.对文件Hash值用 2 ^ 32 次方进行取余。得到的结果也能在当前Hash环中有一个映射点。
2.我们选择从顺时针触发 把文件存储在 距离当前结果映射点 最近的服务器。 比如 当前文件结果映射点距离 B 缓存服务器最近那么我们就把文件存储在B服务器上。 解决传统的Hash算法的问题
1.传统Hash算法在添加服务器后缓存失效的场景
假设我们的A 和 B 缓存服务器中新增了一个 缓存服务器D 之前我们A-B这段这段范围的所有缓存映射点的缓存本来都是存储在缓存B服务器的 但是由于新增的缓存服务器D 插进了A和B之间导致缓存集合1 会 映射到 缓存服务器D中但是我们的缓存集合2仍然是可用它依然会被映射到缓存服务器B中。
这样可以减少新增服务器所带来的缓存失效波及范围。通过Hash环的设计我们在新增缓存服务器的时候仍然保存了部分可用文件。
也就是说使用Hash环之后当我们新增服务器的时候不会导致所有的缓存失效而是部分缓存失效 而原生的Hash环并不能够解决大量资源堆积在同一个缓存服务器的场景这是因为在实际缓存服务器映射的时候并不一定会像我们理想化的三分Hash环。
我们把这种缺陷叫做Hash偏斜。 当出现Hash偏斜的时候大量的文件仍然会存储在服务器A中。而一致性Hash算法给出的解决方案是虚拟节点。 虽然物理节点只有三台但是我们可以映射出很多虚拟节点当前待存储的文件距离哪一个虚拟节点最近就把数据存储到哪一个虚拟节点对应的物理节点中。 其实Hash偏斜的解决方案可以简单总结为创建虚拟节点 尝试均分 Hash环虚拟节点越多我们的映射就越均匀。
应用场景 分布式缓存: 一致性哈希算法常用于分布式缓存系统中例如在Memcached和Redis等分布式缓存系统中。通过一致性哈希可以将缓存数据均匀地分布到不同的缓存节点上提高缓存系统的扩展性和容错性。 分布式数据库: 大规模分布式数据库系统也会使用一致性哈希算法来实现数据分片和负载均衡。例如Cassandra、MongoDB等数据库系统都利用一致性哈希来实现数据的分布存储和查询路由。 分布式消息队列: 一致性哈希算法可以用于分布式消息队列系统确保消息能够被均匀地发送到不同的消息队列节点提高系统的吞吐量和可用性。比如Kafka等消息队列系统可以使用一致性哈希来确定消息的存储位置和消费者组的分布。 分布式文件系统: 在分布式文件系统中一致性哈希算法可以用于确定文件块的存储位置和访问路由例如Hadoop的HDFSHadoop Distributed File System和GlusterFS等。 负载均衡: 一致性哈希算法也可以用于负载均衡将请求分布到多个服务器上保证系统的稳定性和性能。 分布式计算: 在分布式计算中一致性哈希算法可以用于任务调度和数据分片例如MapReduce任务的分布式计算框架。
总的来说一致性哈希算法在分布式系统中的应用非常广泛能够有效地解决数据分布、负载均衡和容错性等问题提高系统的可扩展性和可靠性。
总结 总的来说一致性哈希算法是一种用于分布式系统中的数据分布和负载均衡的重要技术。通过将数据映射到一个固定范围的哈希空间并将节点映射到同样的空间一致性哈希算法能够保证在节点的增减或者网络分区等情况下最小化数据迁移并保持系统的平衡性。该算法已经在多个领域得到实际应用包括分布式缓存、分布式数据库、分布式消息队列、分布式文件系统、负载均衡以及分布式计算等方面。通过了解一致性哈希算法我们可以更好地设计和构建高可用、高性能的分布式系统。 如果我的内容对你有帮助请点赞评论收藏。创作不易大家的支持就是我坚持下去的动力