网上学习, 以作记录
1. 随机算法: 根据权重随机请求, 如果请求量较大, 可以实现请求均衡分布
2. 权重轮询: 根据所有权重的公约数计算 轮流访问. 如果权重大的机器处理较慢, 会堆积大量请求
3. 最少活跃数: 相当于服务处理请求的速度越快, 其活跃数越小. 则说明该服务处理任务较快
参考 https://blog.csdn.net/tjsahwj/article/details/82884410
4. hash 一致性算法 参考 https://www.jianshu.com/p/6f13156573f4
1. 假设有 3 台机器:
2. 对每个请求进行 hash(可以根据 ip , 主机名等) , 然后对 3 求余数. 得到 0,1,2 分别对应请求上诉三台机器.
3. 但是有一个问题: 如果有一台机器挂了, 或者服务压力太大, 我想加一台服务器. 那么算法就要修改 (对 2 或对 4 求余数), 那么原来这三台机器的缓存就无法和原来请求做映射了. 违背了容错性和扩展性
4. 假设我对每台服务器也进行 hash, 然后放置在 0 到 (2 的 32 方 - 1) 的圆环上, 每次请求使用同样的 hash 算法计算请求的 hash 值. 然后对圆环顺时针找遇到的第一台服务器.
5. 如何加机器或者减机器, 都只会影响到离这台机器最近的那些请求. 其他机器不会受影响.
6. 上述算法会出现一种问题: 如何很多请求的 hash 值 都很小, 那么这些请求都会落到 hash 值较小的那台服务器, 导致后面的两台服务器没有实际分担到请求.
7. 用虚拟节点解决上述问题: 所谓虚拟节点就是对服务器 hash 的时候加一些后缀 (或其他), 如 A 服务器 ip#1...... A 服务器 ip#32 , 通常会很多, 目的就是让圆环上的服务器足够多, 使每个请求能均匀的发送到服务器上.
比如 dubbo 的默认是 160 .
来源: http://www.bubuko.com/infodetail-2949997.html