一、负载均衡技术
1、介绍:
负载均衡技术(Load Balance)是一种概念,其原理就是把分发流量、请求到不同的服务器,平均分配用户请求。
2、作用:
① 流量分发,请求平均,提高系统处理能力,降低单例压力。
② 安全,隐藏后端真实服务。
③ 屏蔽非法请求。(七层负载均衡)
3、负载均衡分类:
① 二层负载均衡 (mac):二层负载均衡主要工作在网络的数据链路层,它通过虚拟MAC地址的方式实现。当外部请求到达时,负载均衡器接收这些请求,替换请求的目标MAC地址为实际服务器的MAC地址。
② 三层负载均衡 (ip):三层负载均衡工作在网络层,外部请求首先发送到虚拟IP地址,负载均衡器接收这些请求后,根据一定的算法(如轮询、权重等)选择一个后端服务器,并将请求的目标IP地址替换为所选服务器的实际IP地址。
③ 四层负载均衡 (tcp):四层负载均衡在三层的基础上增加了对传输层(TCP/UDP)信息的处理。它不仅根据IP地址进行转发,还考虑端口号。当请求到达时,负载均衡器会根据请求的IP地址和端口号来选择后端服务器,并转发请求。
④ 七层负载均衡 (http):七层负载均衡也称为应用层负载均衡,它工作在OSI模型的最高层——应用层。它不仅能够根据IP地址和端口号进行转发,还能解析应用层协议(如HTTP)的内容,并根据协议中的特定信息(如URL、Cookie等)来选择后端服务器。
4、四层与七层负载的区别:
(1) 四层负载均衡:
四层负载均衡根据报文中的目标地址和端口信息来选择后端服务器。当负载均衡设备接收到客户端的SYN请求时,它会根据预设的算法(如轮询、最少连接数等)选择一个最佳的服务器,并修改报文中的目标IP地址,将请求转发给该服务器。
在四层负载中,负载均衡设备只是起到一个类似路由器的转发动作,TCP的三次握手是客户端和服务器直接建立的。
(2) 七层负载均衡:
又称为“内容交换”,也就是通过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。例如对图片类的请求转发到特定的图片服务器;将对文字类的请求可以转发到特定的文字服务器。
在七层负载中,负载均衡设备更类似于一个代理服务器,负载均衡和前端的客户端以及后端的服务器都会分别建立TCP连接。
二、负载均衡器LB配置
1、停止web01/web02中的keepalived服务:
负载均衡器LB自带故障转移功能,当某个服务器出现故障时,负载均衡器能够自动将流量转移到其他健康的服务器上。因此不需要在web服务器上再配置keepalived。
2、准备负载均衡器LB:
克隆负载虚拟机LB,修改IP、UUID、hosts,关闭防火墙、selinux和NetworkManager
三、nginx负载均衡实现
1、把www.shop.com域名解析到LB:
2、在LB上编译安装Nginx:
(1) 安装依赖库和环境:
yum -y install pcre-devel zlib-devel openssl-devel
yum -y install gcc gcc-c++ autoconf automake make
(2) 编译安装nginx:
tar -zxf nginx-1.16.0.tar.gz
cd nginx-1.16.0
useradd -r -s /sbin/nologin www
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module
make && make install
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
3、nginx负载均衡配置:
upstream shop {server 10.1.1.11; server 10.1.1.13;
}server { listen 80;server_name www.shop.com;location / {proxy_pass http://shop;proxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
(1) 负载配置:
① upstream shop:定义了一个名为 shop 的后端服务器组,其中包含了两台服务器 web01 和 web02。
② server_name www.shop.com:指定服务器接受的请求针对的是域名www.shop.com。
③ proxy_pass http://shop:http://shop 是一个代理传递的目标,代理服务器将客户端的请求传递给shop组中定义的服务器,http://10.1.1.11
④ proxy_set_header HOST $host:代理服务器将原始请求中的Host请求头保留并传递给后端服务器。后端应用程序(如PHP)依赖Host请求头来确定如何响应请求,如果没有正确的Host请求头,后端应用程序可能无法正确运行。
完成了上述配置就已实现了负载均衡。
检验负载均衡效果:
vim /home/www/public/index.php
echo "web01"; / echo "web02";
(2) 获取客户端真实IP地址:
当查看web服务器的日志时,发现只能获取到代理服务器的访问信息。这是因为真实客户端请求通过代理服务器转发至后端服务器,因此后端服务器认为请求都是由代理服务器发出的。
① 修改LB配置:
想要后端服务器能够获取到真实的客户端IP地址,需要在LB的nginx配置文件中添加如下两条配置:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
② web01、web02修改日志格式:
http {……log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log logs/access.log main;……
}
access_log logs/access.log main:指定访问日志的位置
"$http_x_forwarded_for":获取负载均衡转发前的IP
查看日志:
4、负载均衡与反向代理的区别:
负载均衡(Load Balancing)的主要目的是根据不同的算法,在多个服务器之间分配工作负载,以确保每个服务器都能够有效地处理请求,提高整体系统的性能和可用性。
反向代理(Reverse Proxy)则位于客户端和服务器之间,客户端向反向代理发送请求,然后反向代理将请求转发给后端的服务器,反向代理可以用来隐藏服务器的真实信息。
5、分发请求关键字:
upstream中的分发之后有几个关键字:
backup:备用,当upstream中定义的其他服务器都不可用时,才会将请求分发至此服务器。
down:标记为down的服务器不会被用来处理任何请求,通常用于将某个已经出现故障的服务器从负载均衡中移除。
upstream {server 10.1.1.10 backup或down;server 10.1.1.12;
}
6、nginx 负载均衡算法:
① round robin轮询方式,默认的负载均衡方式,依次将请求分配到各个后台服务器中,适用于后台机器性能一致的情况。
② weight:根据权重来分发请求到不同的机器中,指定轮询几率,用于后端服务器性能不均的情况。
upstream {server 10.1.1.10 weight=8;server 10.1.1.12 weight=2;
}
③ IP_hash:根据请求者ip的hash值将请求发送到后台服务器中,可以保证来自同一ip的请求被分配固定的机器上。
upstream {ip_hash;server 10.1.1.10;server 10.1.1.12;
}
6、session持久性:
(1) cookies 与 session:
Cookies和Session是Web中常用的两种状态管理机制,用于跟踪用户会话和存储用户信息。
① Cookies存储在客户端上,Cookies可以设置过期时间,过期后自动删除,也可以选择不过期,由用户手动清除。
② Session通常存储在服务器上。Session的生命周期通常与用户的浏览器会话相关联,当用户关闭浏览器或会话超时后,Session会失效。
(2) 负载均衡出现的问题:
当负载均衡配置了轮询算法后,可能会出现验证码登录失败的问题。这是因为用户在一台服务器上输入了验证码,但随后的请求被负载均衡器路由到了另一台服务器,导致会话信息不同步,从而引发登录失败。
(3) 解决方案:
通过ip_hash算法,将生成验证码和验证都请求同一台服务器,实现session会话持久性。
upstream shop {ip_hash;server 10.1.1.11;server 10.1.1.13;
}
sbin/nginx -s reload
配置完成后即可成功登录: