1、什么是负载均衡
负载均衡指多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。
通过某种负载分担任务,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接受到的请求的服务器独立地回应客户的请求。
负载均衡能够平均分配客户请求到服务器阵列,借此提供快速获取重要数据,解决大量并发访问服务问题,这种集群技术可以用最少的投资获得接近于大型主机的性能。
负载均衡方式:
软件负载均衡:Nginx、LVS、HAProxy
硬件负载均衡:Array、F5
2 随机算法实现
2.1 最简单版本:
随机平均选择服务器
import java.util.Arrays;
import java.util.List;
public class ServerIps {
public static final List LIST = (List) Arrays.asList(
"192.168.0.1",
"192.168.0.2",
"192.168.0.3",
"192.168.0.4",
"192.168.0.5",
"192.168.0.6",
"192.168.0.7",
"192.168.0.8",
"192.168.0.9",
"192.168.0.10"
);
}
import java.util.Random;
public class RandomChoose{
public static String getServer() {
Random random = new Random();
return ServerIps.LIST.get(random.nextInt(ServerIps.LIST.size()));
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(getServer());
}
}
}
2.2 考虑权重的影响
但是每台机器的性能可能不同,性能强的机器能够处理更多的业务量,这种情况平均轮询不是很合理。
这样的话,需要给不同的机器设置不同的权重。
public class ServerIps {
public static final Map WEIGHT_MAP = new HashMap<>();
static {
WEIGHT_MAP.put("192.168.0.1", 2);
WEIGHT_MAP.put("192.168.0.2", 8);
WEIGHT_MAP.put("192.168.0.3", 1);
WEIGHT_MAP.put("192.168.0.4", 9);
WEIGHT_MAP.put("192.168.0.5", 4);
WEIGHT_MAP.put("192.168.0.6", 6);
}
}
2.2.1 暴力解法
创建一个新的List将所有的IP地址装入List,注意根据权重来选择装入几次IP地址,比如“198.168.0.1”这个IP地址的权重是2,那么就装入2次该IP地址
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class WeightRandom{
public static String getServer() {
List ips = new ArrayList<>();
for(String ip: ServerIps.WEIGHT_MAP.keySet()) {
Integer weight = ServerIps.WEIGHT_MAP.get(ip);
for(int i=0; i
ips.add(ip);
}
}
Random random = new Random();
return ips.get(random.nextInt(ips.size()));
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(getServer());
}
}
}
2.2.2 优化
当权重很大的时候,将会存入很多次IP地址&