负载均衡中的Hash与一致性Hash(小记)

570 阅读1分钟

Hash:

    对请求的ip或者url取Hash值,对Hash(h)值根据节点数(n)取模(r=mod(h,n)),

    得到的结果r即为该次请求最终访问的节点

    弊端:节点数变化后会影响全部节点的定位

ps:

mod(h,n)取模: c=h/n  r=h-c*n 

符号相同时,c向0处取整,此时取模=取余 ,符号不同时,c向负无穷处取整,此时取模!=取余,取余时c总是向0处取整

例如: 

mod(5,3): c=5/3=1 r=5-1*3=2  等于取余 5%3

mod(-5,-3):c=-5/-3=1 r=-5-1*(-3) = -2  等于取余 -5%-3

mod(-5,3): c=-5/3=-2 (注意) r=-5-(-2)*3=1  不等于取余 -5%3=-2

mod(5,-3):c=5/-3=-2 (注意) r=5-(-2)*-3 = -1 不等于取余 5%-3 = -2


一致性Hash:

对Hash的取值范围进行分段,根据一定规则对每个节点计算Hash,每一段范围代表一个节点,根据相同的Hash算法对请求计算Hash,根据请求的hash在分段的位置,定位该次访问的节点,此时整体不再受节点数量变化的影响,变化节点只会影响最近的下一个节点。

如果节点数太少,可能会出现分段不均匀导致倾斜,此时可以采用虚拟节点的办法