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在分段的位置,定位该次访问的节点,此时整体不再受节点数量变化的影响,变化节点只会影响最近的下一个节点。
如果节点数太少,可能会出现分段不均匀导致倾斜,此时可以采用虚拟节点的办法