网上学习,以作记录
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 。