一致性Hash在负载均衡中的应用.pdfVIP

  • 5
  • 0
  • 约1.68万字
  • 约 16页
  • 2021-11-25 发布于重庆
  • 举报
简介 一致性 Hash 是一种特殊的 Hash 算法,由于其均衡性、持久性的映射 特点,被广泛的应用于负载均衡领域,如 nginx 和 memcached都采用了一 致性 Hash 来作为集群负载均衡的方案。 本文将介绍一致性 Hash 的基本思路,并讨论其在分布式缓存集群负 载均衡中的应用。同时也会进行相应的代码测试来验证其算法特性,并给 出和其他负载均衡方案的一些对比。 一致性 Hash 算法简介 在了解一致性 Hash 算法之前,先来讨论一下 Hash 本身的特点。普通 的 Hash 函数最大的作用是 散列 ,或者说是将一系列在形式上具有相似性 质的数据,打散成随机的、均匀分布的数据。 比如,对字符串 abc 和 abcd 分别进行 md5计算,得到的结果如下: 可以看到,两个在形式上非常相近的数据经过 md5散列后,变成了完 全随机的字符串。负载均衡正是利用这一特性,对于大量随机的请求或调 用,通过一定形式的 Hash 将他们均匀的 散列 ,从而实现压力的平均化。 (当然,并不是只要使用了 Hash 就一定能够获得均匀的散列,后面会分 析这一点。) 举个例子,如果我们给每个请求生成一个 Key,只要使用一个非常简 单的 Hash 算法 Group = Key % N 来实现请求的负载均衡,如下: (如果将 Key 作为缓存的 Key,对应的 Group 储存该 Key 的 Value , 就可以实现一个分布式的缓存系统,后文的具体例子都将基于这个场景) 不难发现,这样的 Hash 只要集群的数量 N发生变化,之前的所有 Hash 映射就会全部失效。如果集群中的每个机器提供的服务没有差别,倒 不会产生什么影响,但对于分布式缓存这样的系统而言,映射全部失效就 意味着之前的缓存全部失效,后果将会是灾难性的。 一致性 Hash 通过构建环状的 Hash 空间代替线性 Hash 空间的方法解 决了这个问题,如下图: 整个 Hash 空间被构建成一个首尾相接的环,使用一致性 Hash 时需要 进行两次映射。 第一次,给每个节点(集群)计算 Hash,然后记录它们的 Hash 值, 这就是它们在环上的位置。 第二次,给每个 Key 计算 Hash,然后沿着顺时针的方向找到环上的第 一个节点,就是该 Key 储存对应的集群。 分析一下节点增加和删除时对负载均衡的影响,如下图: 可以看到,当节点被删除时,其余节点在环上的映射不会发生改变, 只是原来打在对应节点上的 Key 现在会转移到顺时针方向的下一个节点上 去。增加一个节点也是同样的,最终都只有少部分的 Key 发生了失效。不 过发生节点变动后,整体系统的压力已经不是均衡的了,下文中提到的方 法将会解决这个问题。 问题与优化 最基本的一致性 Hash 算法直接应用于负载均衡系统,效果仍然是不 理想的,存在诸多问题,下面就对这些问题进行逐个分析并寻求更好的解 决方案。 数据倾斜 如果节点的数量很少,而 hash 环空间很大(一般是 0 ~ 2^32 ),直 接进行一致性 hash 上去,大部分情况下节点在环上的位置会很不均匀, 挤在某个很小的区域。最终对分布式缓存造成的影响就是,集群的每个实 例上储存的缓存数据量不一致,会发生严重的数据倾斜。 缓存雪崩 如果每个节点在环上只有一个节点,那么可以想象,当某一

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档