场景

由于memcached集群各节点之间都是独立的,互不通信,集群的负载均衡是基于客户端来实现的,因此需要客户端用户设计实现负载均衡算法。

取模算法

N个节点,从0->N-1编号,key对N 取模,余i,则key落在第i台服务器上
image

有 N 台服务器, 变为 N-1 台,
每 N(N-1)个数中, 只有(n-1)个单元,%N, %(N-1)得到相同的结果
所以 命中率在服务器 down 的短期内, 急剧下降至 (N-1)/(N
(N-1)) 所以: 服务器越多, 则 down 机的后果越严重!
= 1/(N-1)

一致性hash算法

  • 把各服务器节点映射放在钟表的各个时刻上, 把 key 也映射到钟表的某个时刻上. 该 key 沿钟表顺时针走,碰到的第 1 个节点即为该 key 的存储节点
    image

  • 某节点宕机对其他节点的影响
    当某个节点宕机后,只影响该节点顺时针之后的 1 个节点,而其他节点
    不受影响.因此,一致哈希 最大限度地抑制了键的重新分布
    image

一致性hash算法+虚拟节点

  1. 节点在圆环上分配分配均匀,因此承担的任务也平均,但事实上, 一般的 Hash 函数对于节 点在圆环上的映射,并不均匀.
  2. 当某个节点 down 后,直接冲击下 1 个节点,对下 1 个节点冲击过大,能否把 down 节点上的 压力平均的分担到所有节点上?
  3. 可以引入虚拟节点来达到目标
    虚拟节点即----N 个真实节点,把每个真实节点映射成 M 个虚拟节点, 再把 M*N 个虚拟节点, 散列在圆环上. 各真实节点对应的虚拟节点相互交错分布
    这样,某真实节点 down 后,则把其影响平均分担到其他所有节点上
    image
posted on 2017-05-31 15:34  行走在云端的愚公  阅读(381)  评论(0编辑  收藏  举报