负载均衡-加权随机算法
由于访问概率大致相同,所以如果部分服务器性能不一致的话,容易导致性能差的服务器压力过大,所以要根据服务器性能不一致的情况,给性能好的服务器多处理请求,给差的少分配请求(能者多劳)所以就需要在随机算法的基础上给每台服务器设置权重,延伸为加权随机算法
- 1、将应用服务器集群的IP存到Map里,每个IP对应有一个权重
- 2、创建一个List,来将所有权重下的IP存到list里面 如:192.168.1.100 权重为3,则需要加入3个IP,192.168.1.102权重为4,则需要加入4个IP
- 3、在0~所有权重之和的范围中选出一个随机数,这个随机数对应List的位置即是当前选取出来的IP地址
- 4、在调用量越大的情况下,每台服务器的流量分配处理概率越均衡(性能好的能分配较多的流量)
package nginx; import java.util.*; /** * 负载均衡 * 加权随机算法 * <P>由于访问概率大致相同,所以如果部分服务器性能不一致的话,容易导致性能差的服务器压力过大,所以要根据服务器性能不一致的情况,给性能好的服务器多处理请求,给差的少分配请求(能者多劳)所以就需要在随机算法的基础上给每台服务器设置权重,延伸为加权随机算法</P> * * <li>1、将应用服务器集群的IP存到Map里,每个IP对应有一个权重</li> * <li>2、创建一个List,来将所有权重下的IP存到list里面 如:192.168.1.100 权重为3,则需要加入3个IP,192.168.1.102权重为4,则需要加入4个IP </li> * <li>3、在0~所有权重之和的范围中选出一个随机数,这个随机数对应List的位置即是当前选取出来的IP地址 </li> * <li>4、在调用量越大的情况下,每台服务器的流量分配处理概率越均衡(性能好的能分配较多的流量)</li> * * @author Administrator */ public class RandomJava { /** * 服务器列表<服务器地址,权重> */ public static Map<String, Integer> map = new HashMap<String, Integer>() { { put("192.168.1.100", 3); put("192.168.1.102", 4); put("192.168.1.103", 5); } }; static Random random = new Random(); /** * 获取IP * @return */ public static String getServer() { List<String> ipList = new ArrayList<String>(); for (Map.Entry<String, Integer> item : map.entrySet()) { //将每个权重W 下的IP添加 W次,来满足随机权重 for (int i = 0; i < item.getValue(); i++) { ipList.add(item.getKey()); } } //当前服务器IP地址的权重之和 int allWeight = map.values().stream().mapToInt(a -> a).sum(); System.out.println(allWeight + ""); //随机选取一个IP int number = random.nextInt(allWeight); System.out.println(Arrays.toString(ipList.toArray())); return ipList.get(number); } public static void main(String[] args) { //三台服务器IP的调用概率 double a = 0, b = 0, c = 0; int size = 100000; String ip = ""; for (int i = 0; i < size; i++) { ip = getServer(); if (ip.equals("192.168.1.100")) { a++; } if (ip.equals("192.168.1.102")) { b++; } if (ip.equals("192.168.1.103")) { c++; } } System.out.println(a / size + "\n" + b / size + "\n" + c / size + ""); } }
权重之和:12 List: [192.168.1.103, 192.168.1.103, 192.168.1.103, 192.168.1.103, 192.168.1.103, 192.168.1.100, 192.168.1.100, 192.168.1.100, 192.168.1.102, 192.168.1.102, 192.168.1.102, 192.168.1.102] 概率: 0.25059 0.33183 0.41758