一
.
负载均衡
1.1.
什么是负载均衡
负载均衡:
Load Balance
,简称
LB
,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均
衡将特定的业务
(web
服务、网络流量等
)
分担给指定的一个或多个后端特定的服务器或设备,从而提高了
公司业务的并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态扩展
阿里云
SLB
介绍 :
https://yq.aliyun.com/articles/1803
1.2.
为什么用负载均衡
Web
服务器的动态水平扩展
-->
对用户无感知
增加业务并发访问及处理能力
-->
解决单服务器瓶颈问题
节约公网
IP
地址
-->
降低
IT
支出成本
隐藏内部服务器
IP-->
提高内部服务器安全性
配置简单
-->
固定格式的配置文件
功能丰富
-->
支持四层和七层,支持动态下线主机
性能较强
-->
并发数万甚至数十万
1.3.
负载均衡类型
1.3.1
硬件:
F5
美国
F5
网络公司
https://f5.com/zh
Netscaler
美国思杰公司
https://www.citrix.com.cn/products/citrix-adc/
、
Array
华耀
https://www.arraynetworks.com.cn/
AD-1000
深信服
http://www.sangfor.com.cn/
1.3.2.
四层负载均衡
1.
通过
ip+port
决定负载均衡的去向。
2.
对流量请求进行
NAT
处理,转发至后台服务器。
3.
记录
tcp
、
udp
流量分别是由哪台服务器处理,后续该请求连接的流量都通过该服务器处理。
4.
支持四层的软件
lvs
:重量级四层负载均衡器。
Nginx
:轻量级四层负载均衡器,可缓存。(
nginx
四层是通过
upstream
模块)
Haproxy
:模拟四层转发。
1.3.3.
七层负载均衡
1.
通过虚拟
ur|
或主机
ip
进行流量识别,根据应用层信息进行解析,决定是否需要进行负载均衡。
2.
代理后台服务器与客户端建立连接,如
nginx
可代理前后端,与前端客户端
tcp
连接,与后端服务器建立
tcp
连接
,
3.
支持
7
层代理的软件:
Nginx:
基于
http
协议
(nginx
七层是通过
proxy_pass)
Haproxy:
七层代理,会话保持、标记、路径转移等
1.3.4
四层和七层的区别
所谓的四到七层负载均衡,就是在对后台的服务器进行负载均衡时,
依据四层的信息或七层的信息来决
定怎么样转发流量
四层的负载均衡,就是通过发布三层的
IP
地址(
VIP
),然后加四层的端口号,来决定哪些流量需要做负
载均衡,对需要处理的流量进行
NAT
处理,转发至后台服务器,并记录下这个
TCP
或者
UDP
的流量是由哪
台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理
七层的负载均衡,就是在四层的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比
如同一个
Web
服务器的负载均衡,除了根据
VIP
加
80
端口辨别是否需要处理的流量,还可根据七层的
URL
、浏览器类别、语言来决定是否要进行负载均衡。
1.
分层位置
:
四层负载均衡在传输层及以下,七层负载均衡在应用层及以下
2.
性能
:
四层负载均衡架构无需解析报文消息内容,在网络吞吐量与处理能力上较高
:
七层可支持解析应用
层报文消息内容,识别
URL
、
Cookie
、
HTTP header
等信息。、
3.
原理
:
四层负载均衡是基于
ip+port;
七层是基于虚拟的
URL
或主机
IP
等。
4.
功能类比
:
四层负载均衡类似于路由器
;
七层类似于代理服务器。
5.
安全性
:
四层负载均衡无法识别
DDoS
攻击
;
七层可防御
SYN Cookie/Flood
攻击
二.haproxy
的基本配置信息
global
:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug
参数
proxies
:代理配置段
defaults
:为
frontend, backend, listen
提供默认配置
frontend
:前端,相当于
nginx
中的
server {}
backend
:后端,相当于
nginx
中的
upstream {}
listen
:同时拥有前端和后端配置
,
配置简单
,
生产推荐使用
2.1Proxies
配置
-defaults
defaults
mode http # HAProxy实例使用的连接协议
log global #指定日志地址和记录日志条目的
syslog/rsyslog日志设备
#此处的 global表示使用 global配置段中
设定的log值。
option httplog #日志记录选项,httplog表示记录与 HTTP
会话相关的各种属性值
#包括 HTTP请求、会话状态、连接数、源地
址以及连接时间等
option dontlognull #dontlognull表示不记录空会话连接日志
option http-server-close #等待客户端完整HTTP请求的时间,此处为等
待10s。
option forwardfor except 127.0.0.0/8 #透传客户端真实IP至后端web服务器
#在apache配置文件中加入:<br>%{XForwarded-For}i
#后在webserer中看日志即可看到地址透传
信息
option redispatch #当server Id对应的服务器挂掉后,强制定
向到其他健康的服务器,重新派发
option http-keep-alive #开启与客户端的会话保持
retries 3 #连接后端服务器失败次数
timeout http-request 1000s #等待客户端请求完全被接收和处理的最
长时间
timeout queue 60s #设置删除连接和客户端收到503或服务不可
用等提示信息前的等待时间
timeout connect 120s #设置等待服务器连接成功的时间
timeout client 600s #设置允许客户端处于非活动状态,即既不发
送数据也不接收数据的时间
timeout server 600s #设置服务器超时时间,即允许服务器处于既
不接收也不发送数据的非活动时间
timeout http-keep-alive 60s #session 会话保持超时时间,此时间段内
会转发到相同的后端服务器
timeout check 10s #指定后端服务器健康检查的超时时间
maxconn 3000
default-server inter 1000 weight 3
三.haproxy的算法
静态算法
1. static-rr
:基于权重的轮询调度
不支持运行时利用
socat
进行权重的动态调整
(
只支持
0
和
1,
不支持其它值
)
不支持端服务器慢启动
其后端主机数量没有限制,相当于
LVS
中的
wrr
慢启动是指在服务器刚刚启动上不会把他所应该承担的访问压力全部给它,而是先给一部分,当没
问题后在给一部分
2.first
根据服务器在列表中的位置,自上而下进行调度
其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
其会忽略服务器的权重设置
不支持用
socat
进行动态修改权重
,
可以设置
0
和
1,
可以设置其它值但无效
动态算法
1.roundrobin
1.
基于权重的轮询动态调度算法,
2.
支持权重的运行时调整,不同于
lvs
中的
rr
轮训模式,
3. HAProxy
中的
roundrobin
支持慢启动
(
新加的服务器会逐渐增加转发数
)
,
4.
其每个后端
backend
中最多支持
4095
个
real server
,
5.
支持对
real server
权重动态调整,
6. roundrobin
为默认调度算法
,
此算法使用广泛
2.
leastconn
eastconn
加权的最少连接的动态
支持权重的运行时调整和慢启动,即
:
根据当前连接最少的后端服务器而非权重进行优先调度
(
新客户
端连接
)
比较适合长连接的场景使用,比如:
MySQL
等场景。
其他算法
1 source
源地址
hash
,基于用户源地址
hash
并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一
个后端
web
服务器。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服
务器,默认为静态方式,但是可以通过
hash-type
支持的选项更改这个算法一般是在不插入
Cookie
的
TCP
模式下使用,也可给拒绝会话
cookie
的客户提供最好的会话粘性,适用于
session
会话保持但不支持
cookie
和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法
和一致性
hash
map-base
取模法
map-based
:取模法,对
source
地址进行
hash
计算,再基于服务器总权重的取模,最终结果决定将此请
求转发至对应的后端服务器。
此方法是静态的,即不支持在线调整权重,不支持慢启动,可实现对后端服务器均衡调度
缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因总权重发生变化而导致调度结果 整体改变
一致性
hash
一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动
hash
(
o
)
mod n
该
hash
算法是动态的,支持使用
socat
等工具进行在线权重调整,支持慢启动
uri
基于对用户请求的
URI
的左半部分或整个
uri
做
hash
,再将
hash
结果对总权重进行取模后
根据最终结果将请求转发到后端指定服务器
适用于后端是缓存服务器场景
默认是静态算法,也可以通过
hash-type
指定
map-based
和
consistent
,来定义使用取模法还是一致性
hash
haproxy
1.基础服务的搭建
#基础服务的搭建
##haproxy服务器172.25.254.151
yum install haproxy -y
[root@rhel9 ~]# vim /etc/haproxy/haproxy.cfg
#利用前端和后端一起配合使用
frontend webcluster
bind *:80 #监听端口
mode http
use_backend webcluster-host #使用哪个后端
backend webcluster-host
balance roundrobin #使用哪个算法
server web1 172.25.254.152:80
server web2 172.25.254.153:80
################
#使用简洁方法
listen webserver_80
bind 172.25.254.151:80
mode http
balance roundrobin
server webserver1 172.25.254.152:80
server webserver2 172.25.254.153:80
systemctl start haproxy
#web1服务器172.25.254.152
[root@rhel9 ~]# echo webserver1-152 > /usr/share/nginx/html/index.html
[root@rhel9 ~]# systemctl enable --now nginx
#web2服务器172.25.254.153
[root@rhel9 ~]# echo webserver2-153 > /usr/share/nginx/html/index.html
[root@rhel9 ~]# systemctl enable --now nginx
haproxy的全局配置和日志管理
[root@rhel9 ~]# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
nbproc 2 #多进程
cpu-map 1 0 #多进程绑定cpu
cpu-map 2 1
#nbthread 2 #多线程,注意多线程和多进程互斥
stats socket /var/lib/haproxy/stats
ssl-default-bind-ciphers PROFILE=SYSTEM
ssl-default-server-ciphers PROFILE=SYSTEM
日志管理
[root@rhel9 ~]#systemctl start haproxy
[root@rhel9 ~]# pstree -p | grep haproxy
|-haproxy(37784)-+-haproxy(37786)
| `-haproxy(37787)
[root@rhel9 ~]# vim /etc/rsyslog.conf
32 module(load="imudp") # needs to be done just once
33 input(type="imudp" port="514")
68 local2.* /var/log/haproxy.log
[root@rhel9 ~]# systemctl restart rsyslog.service
[root@rhel9 ~]# systemctl restart haproxy
[root@rhel9 ~]# ll /var/log/haproxy.log
-rw------- 1 root root 9562 8月 12 00:04 /var/log/haproxy.log
[root@rhel9 ~]# vim /etc/httpd/conf/httpd.conf
Listen 9090
[root@rhel9 ~]# echo backup > /var/www/html/index.html
[root@rhel9 ~]# systemctl start httpd
[root@rhel9 ~]# curl 172.25.254.100:9090
backup
[root@rhel9 ~]# vim /etc/haproxy/haproxy.cfg
listen webserver_80
bind 172.25.254.151:80
mode http
balance roundrobin
server webserver1 172.25.254.152:80 check inter 2 fall 3 rise 5 weight 2 (disabled)
#disable 就是让服务器下线,一般用于服务器维护
server webserver2 172.25.254.153:80 check inter 2 fall 3 rise 5 weight 1 maxconn 3
server websorry 172.25.254.151:9090 backup
#当web1和web2服务器坏掉了,用户再去访问172.25.254.151的时候会指定到172.25.254.151:9090
redirect prefix http://www.baidu.com/
当web1和web2服务器坏掉了,,用户再去访问172.25.254.151的时候会指定到//www.baidu.com/
haproxy-proxies中的常用配置参数
[root@rhel9 ~]# vim /etc/httpd/conf/httpd.conf
Listen 9090
[root@rhel9 ~]# echo backup > /var/www/html/index.html
[root@rhel9 ~]# systemctl start httpd
[root@rhel9 ~]# curl 172.25.254.100:9090
backup
[root@rhel9 ~]# vim /etc/haproxy/haproxy.cfg
listen webserver_80
bind 172.25.254.151:80
mode http
balance roundrobin
server webserver1 172.25.254.152:80 check inter 2 fall 3 rise 5 weight 2 (disabled)
#disable 就是让服务器下线,一般用于服务器维护
server webserver2 172.25.254.153:80 check inter 2 fall 3 rise 5 weight 1 maxconn 3
server websorry 172.25.254.151:9090 backup
#当web1和web2服务器坏掉了,用户再去访问172.25.254.151的时候会指定到172.25.254.151:9090
redirect prefix http://www.baidu.com/
当web1和web2服务器坏掉了,,用户再去访问172.25.254.151的时候会指定到//www.baidu.com/
haproxy的热更新(不停服更新)
[root@rhel9 ~]# vim /etc/haproxy/haproxy.cfg
36 stats socket /var/lib/haproxy/stats mode 600 level admin
#用户提权
[root@rhel9 ~]# dnf install socat -y
[root@rhel9 ~]# echo "show info" | socat stdio /var/lib/haproxy/stats
#查看haproxy的状态
[root@rhel9 ~]# echo "show servers state" | socat stdio /var/lib/haproxy/stats
#查看server的状态
[root@rhel9 ~]# echo get weight webserver_80/webserver1 | socat stdio /var/lib/haproxy/stats
2 (initial 2)
#得到server1的权重,注意集群名称和服务名不要写错
[root@rhel9 ~]# echo set weight webserver_80/webserver1 3 | socat stdio /var/lib/haproxy/stats
#修改webserver1的权重为3,但是/etc/httpd/conf/httpd.conf还是原来的值
[root@rhel9 ~]# echo disable server webserver_80/webserver1 | socat stdio /var/lib/haproxy/stats
#webserver1 下线
[root@rhel9 ~]# echo enable server webserver_80/webserver1 | socat stdio /var/lib/haproxy/stats
#启动webserver1
###################################################################
多进程热更新,修改配置文件以后。操作和单进程用于,只要使用热更新操作的时候修改路径
[root@rhel9 ~]# vim /etc/haproxy/haproxy.cfg
global
nbproc 2 #多进程
cpu-map 1 0 #多进程绑定cpu
cpu-map 2 1
stats socket /var/lib/haproxy/stats1 mode 600 level admin
stats socket /var/lib/haproxy/stats2 mode 600 level admin
[root@rhel9 ~]# systemctl restart haproxy.service
[root@rhel9 ~]# echo disable server webserver_80/webserver1 | socat stdio /var/lib/haproxy/stats1
#webserver1 下线
haproxy的状态页
[root@rhel9 ~]# vim /etc/haproxy/haproxy.cfg
listen stats
mode http
bind 172.25.254.151:9999
stats enable
stats refresh 10
stats uri /status
stats auth aaa:aaa
[root@rhel9 ~]# systemctl restart haproxy.service
haproxy高级设置基于cookie的会话保持
相对于源地址hash,对浏览器缓存,当同一个浏览器访问时,缓存以后,你刷新很多次以后,还是会指定到同一realserver主机;
[root@rhel9 ~]# vim /etc/haproxy/haproxy.cfg
listen webserver_80
bind 172.25.254.151:80
mode http
balance roundrobin
#redirect prefix http://www.baidu.com/
cookie webcookie insert nocache indirect
server webserver1 172.25.254.152:80 cookie aaa check inter 2 fall 3 rise 5 weight 1
server webserver2 172.25.254.153:80 cookie bbb check inter 2 fall 3 rise 5 weight 1
#server websorry 172.25.254.151:9090 backup
[root@rhel9 ~]# systemctl restart haproxy.service