一、负载均衡简介
负载均衡(Load Balance),意思是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。是解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案。
图片.png
二、常见的几种负载均衡实现方式
2.1 软件负载与硬件负载
分类 | 常见方案 | 优点 | 缺点 |
---|---|---|---|
软件负载 | apach、nginx | 便宜而且简单灵活 | 性能不如硬件,支持万级并发 |
硬件负载 | F5、A10、深信服 | 1.功能强大,支持全局负载均衡提供全面的复杂均衡算法。2.性能强悍,支持百万以上的并发。3.提供安全功能,例如防火墙,防DDos攻击等。 | 贵,扩展能力差,不支持动态扩容 |
图片.png
2.2 客户端负载与服务端负载
分类 | 含义 | 常见方案 | 优点 | 缺点 |
---|---|---|---|---|
服务器负载 | 是指在服务器上游做服务分发 | DNS域名解析负载均衡、反向代理负载均衡 | / | / |
客户端负载 | 客户端自己维护一个可用服务器地址列表,在发送请求前先通过负载均衡算法选择一个将用来处理本次请求的服务器,然后再直接将请求发送至该服务器。 | Ribbon | / | / |
DNS域名解析负载均衡
假设我们的域名指向了多个IP地址,当一个域名请求来时,DNS服务器机进行域名解析将域名转换为IP地址是,在1:N的映射转换中实现负载均衡。DNS服务器提供简单的负载均衡算法,但当其中某台服务器出现故障时,通知DNS服务器移除当前故障IP。ribbon的默认负载均衡(轮询),当多次访问Eureka(注册中心)中同一个服务时(该服务有多个服务提供者),采用轮询方式,也可自定义配置。
三、Nginx 的4种负载均衡实现方式
3.1 轮询(默认)
//proxy.conf
upstream node {
server 你的IP:8081;
server 你的IP:8082;
server 你的IP:8083;
}
server {
server_name localhost;
listen 80;
location / {
proxy_pass http://node;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
3.2 权重
upstream node {
server 你的IP:8081 weight = 10;
server 你的IP:8082 weight = 20;
server 你的IP:8083 weight = 30;
}
3.3 ip hash
upstream node {
hash $request_uri;
server 你的IP:8081;
server 你的IP:8082;
server 你的IP:8083;
}
3.4 最少连接
least_conn指令实际的含义就是,选取活跃连接数与权重weight的比值最小者为下一个处理请求的server。当然,上一次已选的server和已达到最大连接数的server照例不在选择的范围。
upstream backend {
least_conn;
server 10.10.10.2 weight=2;
server 10.10.10.4 weight=1;
server 10.10.10.6 weight=1;
}
假如上一个请求选择了第二台10.10.10.4,下一个请求到来,通过比较剩下可用的server的conns/weight值来决定选哪一台。
如果10.10.10.2连接数为100,10.10.10.6连接数为80,因为权重分别是2和1,因此计算结果
100/2=50, 80/1 =80。因为 50 < 80 所以选择第一台而不选第三台。尽管连接数第一台要大于第三台。
参考博客:
https://www.cnblogs.com/fanBlog/p/10936190.html
https://www.cnblogs.com/gucb/p/11237765.html