负载均衡
介绍
简介
-
负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台ECS的流量分发控制服务。
-
负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。
-
负载均衡的主要功能点:
- 负载均衡服务通过设置虚拟服务地址(IP),将位于同一地域(Region)的多台云服务器(Elastic Compute Service,简称ECS)资源虚拟成一个高性能、高可用的应用服务池;根据应用指定的方式,将来自客户端的网络请求分发到云服务器池中。
- 负载均衡服务会检查云服务器池中ECS的健康状态,自动隔离异常状态的ECS,从而解决了单台ECS的单点问题,同时提高了应用的整体服务能力。在标准的负载均衡功能之外,负载均衡服务还具备TCP与HTTP抗DDoS攻击的特性,增强了应用服务器的防护能力。
- 负载均衡服务是ECS面向多机方案的一个配套服务,需要同ECS结合使用
-
作用:
- 服务器容灾, 流量分发
- 隐藏后端真实服务器,提高安全性
- 七层负载均衡可以屏蔽非法请求
-
实现方式
- 硬件实现:性能高,价格高,几万到几十万不等
- 软件级别:性价比高,可控性强
分类
二层负载均衡(mac)
- 根据OSI模型的二层进行负载,一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后,再分配后端实际的MAC地址响应
三层负载均衡(ip)
- 一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后,再分配后端实际的IP地址响应
四层负载均衡(tcp)
- 网络运输层面的负载均衡:在三层负载均衡的基础上,用ip+port接收请求,再转发到对应的机器
- 软件实现:LVS、HAProxy、Nginx(1.9及以上版本)
七层负载均衡(http)
- 智能型负载均衡:主机接收请求,再转向(反向代理)相应的处理服务器
- 实现方式:Nginx、HAProxy
四层&七层对比
四层 | 七层 | |
---|---|---|
基于 | 基于IP+Port | 基于虚拟的URL或主机IP |
类似于 | 路由器 | 代理服务器 |
握手次数 | 1次 | 2次 |
复杂度 | 低 | 高 |
性能 | 高:无需解析内容 | 中:需要算法识别URL ,Cookie和HTTP head等 |
安全性 | 低:无法识别DDos攻击 | 高:可以防御SYN cookie和SYN flood等 |
额外功能 | 五 | 会话保持,图片压缩,防盗链等 |
Nginx负载均衡
负载均衡算法
- Round-Robin(轮询):RR ,默认算法,每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响
- weight(轮询权值):weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或 者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源
- ip_hash:每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器, 并且可以有效解决动态网页存在的session共享问题
- fair:比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。 Nginx本身不支持fair,如果需要这 种调度算法,则必须安装upstream_fair模块
- url_hash:按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装 Nginx的hash软件包
配置
- 通过server02克隆server04
主机名 | ip地址 | 虚拟机 |
---|---|---|
web1.master | 192.168.139.128 | server01 |
web2.backup | 192.168.139.129 | server02 |
mysql | 192.168.139.130 | server03 |
lb | 192.168.139.131 | server04 |
- 基础环境配置
[root@lb ~]# sed -i 's/web2.backup/lb/' /etc/sysconfig/network
[root@lb ~]# cd /etc/udev/rules.d/
[root@lb ~]# rm -rf 70-persistent-net.rules
[root@lb ~]# reboot
cat >> /etc/hosts <<EOF
192.168.139.131 lb
EOF
- 域名解析到负载均衡服务器上
- 负载均衡配置
配置
[root@lb html]# vim /usr/local/nginx/conf/nginx.conf
#http段
upstream shop {
server 192.168.139.128;
server 192.168.139.129;
}
#upstream中server的关键字
backup:其他的没有backup标识的服务器都无响应,才分发到backup
down:不会被分发到
#示例:server 192.168.139.127 backup;
weight:weight的值越大分配到的访问概率越高
#server 192.168.139.128 weight=5;
#server 192.168.139.129 weight=3;
#8次中,128分发5次,129分发3次
#upstream中配置项
ip_hash;
#每个请求按访问IP的哈希结果分配
#server段
server {
listen 80;
server_name www.server01.com;
location / {
proxy_pass http://shop; 代理转发到shop段,匹配到上面的upstream
proxy_set_header Host $host;传输域名给后端服务器,方便匹配对应server虚拟主机
}
}
[root@lb html]# service nginx restart
查看(在web1和web2节点上配置)
[root@web1 ~]# vim /usr/local/nginx/html/tp5shop/application/home/controller/Base.php
26 echo gethostname();在页面上方显示主机名(仅调试用)
负载均衡后获取客户端ip
- 基于ngx_http_realip_module模块,默认此模块没有安装,需要编译时添加编译参数
- 官网:http://nginx.org/en/docs/http/ngx_http_realip_module.html
模块编译安装(略)
[root@lb html]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.20.1
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --add-module=/root/soft/ngx-fancyindex-0.4.3/ --add-module=/root/soft/echo-nginx-module-0.61/
负载均衡服务器上配置ip转发(-->web服务器)
[root@lb html]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.server01.com;
location / {
proxy_pass http://shop;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;发送客户端IP,给后端服务器,用来方便后端服务器识别用户真实IP
}
}
[root@lb ~]# service nginx reload
web服务器配置ip来源
[root@web1/2 ~]# vim /usr/local/nginx/conf/nginx.conf
#推荐配置到相应的server段
set_real_ip_from 192.168.139.131;
[root@web1/2 ~]# service nginx reload
查看日志
[root@web1 ~]# tail -1 /usr/local/nginx/logs/server01.lnmp.com_access.log
192.168.139.1 - - [13/Oct/2021:00:44:45 +0800] "GET /static/home/img/wx_cz.jpg HTTP/1.0" 304Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36
#获取客户端ip:192.168.139.1
session一致性问题
- 访问后端页面,登录发现验证码不通过
- 原因:请求被分发到web1上,在web1上生成验证码,存储到服务器的session中。但是校验时,请求被轮训分发到web2上,所以验证码校验不通过
[root@lb ~]# cd /tmp/
[root@lb tmp]# ls
sess_m5nh62mo90nlkl56t876uf4pl9 sess_2ipocqqjnd5lb1a0gfiv1h57b0 sess_odi5t61oskdrak5c8ieoqht9k0 sess_67fh48m2272n5q3be7qh71j1hk sess_okjcaftj5qr45apsenb6t1ht6e sess_7fi8louv43omu913gt82982r3r sess_vpmcf7uv2oevgle1pfrqc6p042 sess_ek3driitk3iq3ct9em1mnh1hes
sess_ftvk56k6nd9vb3debnau4jhts9 sess_jmftk8tlam2boi7mhbq40ri8ir
负载均衡高可用
-
所有的请求流量,都要经过负载均衡服务器,负载均衡服务器压力很大,防止它宕机,导致后端服务所有都不可用,需要对负载均衡服务器,做高可用
-
基于keepalived
-
克隆lb服务器
主机名 | ip地址 | 虚拟机 |
---|---|---|
lb1.master | 192.168.139.131 | server04 |
ld2.backup | 192.168.139.132 | server05 |
- 基础环境配置
配置server04
[root@lb ~]# sed -i 's/lb/lb1.master/' /etc/sysconfig/network
[root@lb ~]# reboot
配置server05
[root@lb ~]# sed -i 's/lb/lb2.backup/' /etc/sysconfig/network
[root@lb ~]# cd /etc/udev/rules.d/
[root@lb ~]# rm -rf 70-persistent-net.rules
[root@lb ~]# reboot
cat >> /etc/hosts <<EOF
192.168.139.131 lb1.master
192.168.139.132 lb2.backup
EOF
- master的keepalived配置
[root@lb1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 52 虚拟路由ID,不要之前的冲突
priority 100
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.139.201 添加新VIP
}
track_script {
check_nginx
}
unicast_src_ip 192.168.139.131 修改单播地址
unicast_peer