一.负载均衡
1.1负载均衡时什么
- 负载均衡:Load Balance,简称LB,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均网络流量等)分担给指定的一个或多个后端特定的服务器或设备,从而提高了衡将特定的业务(web服务、公司业务的并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态扩展
1.1.1四层负载均衡
1.1.1.1介绍
1.四层负载均衡是基于ip+port的负载均衡。
2.四层是基于三层负载均衡,发布三层的ip地址(虚拟ip),再加上四层的端口号,从而决定哪些流量需要做负载均衡。
3.四层负载均衡器也称为四层交换机,分析IP层及TCP/UDP层,但是无法解析应用层协议。
1.1.1.2原理
1.通过ip+port决定负载均衡的去向。
2.对流量请求进行NAT处理,转发至后台服务器
3.记录tcp、udp流量分别是由哪台服务器处理,后续该请求连接的流量都通过该服务器处理。
1.1.1.3支持4层代理的软件
1.F5:硬件负载均衡器,成本较高。
2.Nginx:轻量级四层负载均衡器,可缓存。(nginx四层是通过upstream模块)
3.Haproxy:模拟四层转发。
4.lvs:重量级四层负载均衡器。
1.1.2七层负载均衡
1.1.2.1介绍
1.七层负载均衡器是基于虚拟的url或主机ip的负载均衡。
2.七层负载均衡在于内容的交换,即应用层报文内容的交换解析。
3.七层负载均衡器也称为七层交换机,支持四层负载均衡器的功能,且可分析应用层信息,如HTTP协议、URI、Cookie等信息
1.1.2.2原理
1.通过虚拟url或主机ip进行流量识别,根据应用层信息进行解析,决定是否需要进行负载均衡。
2.代理后台服务器与客户端建立连接,如nginx可代理前后端,与前端客户端tcp连接,与后端服务器建立tcp连接,
1.1.2.3支持7层代理的软件
-
Nginx:基于http协议(nginx七层是通过proxy_pass)
-
Haproxy:七层代理,会话保持、标记、路径转移等
1.2.3四层和七层的区别
1.分层位置:四层负载均衡在传输层及以下,七层负载均衡在应用层及以下
2.性能:四层负载均衡架构无需解析报文消息内容,在网络吞吐量与处理能力上较高:七层可支持解析应用层报文消息内容,识别URL、Cookie、HTTP header等信息。
3.原理 :四层负载均衡是基于ip+port;七层是基于虚拟的URL或主机IP等。
4.功能类比:四层负载均衡类似于路由器;七层类似于代理服务器。
5.安全性:四层负载均衡无法识别DDoS攻击;七层可防御SYN Cookie/Flood攻击
三.haproxy简介
- HAProxy是法国开发者 威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计
haproxy安装(负载均衡软件)
实验环境
功能 | ip |
haproxy | eth0:172.25.254.100 |
RS | eth0:172.25.254.10 |
RS | eth0:172.25.254.20 |
3.1三台主机部署
webserver1
[root@webserver1 ~]# dnf install nginx -y
[root@webserver1 ~]# echo webserver1 - 172.25.254.10 > /usr/share/nginx/html/index.html
[root@webserver1 ~]# systemctl enable --now nginx.service
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
webserver2
[root@webserver22 ~]# dnf install nginx -y
[root@webserver2 ~]# echo webserver2 - 172.25.254.20 > /usr/share/nginx/html/index.html
[root@webserver2 ~]# systemctl enable --now nginx.service
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
安装haproxy并编辑配置文件
# 安装
[root@haproxy ~]# dnf install haproxy -y
[root@haproxy ~]# 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.10:80 # 后端server的ip
server web2 172.25.254.20:80
# 第二种写法
# listen webcluster
# bind *:80
# mode http
# balance roundrobin
# server web1 172.25.254.10:80
# server web2 172.25.254.20:80
[root@haproxy ~]# systemctl enable haproxy.service
[root@haproxy ~]# systemctl restart haproxy.service
测试
后端检测
[root@webserver1 ~]# systemctl stop nginx.service
四.haproxy的基本配置信息
4.1global配置
global
log 127.0.0.1 local2 # 日志级别为2 记录在本机
chroot /var/lib/haproxy # 设定haproxy运行目录
pidfile /var/run/haproxy.pid # PID文件
maxconn 100000 # 最大链接数
user haproxy # 运行的用户
group haproxy # 运行的组
daemon # 运行在后台
# turn on stats unix socket
stats socket /var/lib/haproxy/stats # 状态接口
# utilize system-wide crypto-policies
ssl-default-bind-ciphers PROFILE=SYSTEM # 支持ssl的加密认证
ssl-default-server-ciphers PROFILE=SYSTEM
4.1.1多进程和线程
启用查询多进程
# 默认为单进程
[root@haproxy ~]# pstree -p | grep haproxy
|-haproxy(1925)---haproxy(1927)---{haproxy}(1928)
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
global
###省略###
nbproc 2 # 启用多线程
cpu-map 1 0 # 进程和cpu核心绑定防止cpu抖动从而减少系统资源消耗
cpu-map 2 1 # 2 表示第二个进程,1表示第二个cpu核心
[root@haproxy ~]# systemctl restart haproxy.service
[root@haproxy ~]# pstree -p | grep haproxy
|-haproxy(2042)-+-haproxy(2045)
| `-haproxy(2046)
# 查看多进程
[root@haproxy ~]# pstree -p | grep haproxy
|-haproxy(2030)-+-haproxy(2032)
| `-haproxy(2033)
多线程对比
[root@haproxy ~]# cat /proc/2045/status | grep -i thread
Threads: 1 # 未开启多线程
Speculation_Store_Bypass: thread vulnerable
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
global
###省略###
nbthread 2 # 开启多线程
[root@haproxy ~]# systemctl restart haproxy.service
[root@haproxy ~]# pstree -p | grep haproxy
|-haproxy(2066)---haproxy(2068)---{haproxy}(2069)
[root@haproxy ~]# cat /proc/2068/status | grep -i thread
Threads: 2
Speculation_Store_Bypass: thread vulnerable
4.2proxies配置
4.2.1proxies参数说明
参数 | 类型 | 作用 |
---|---|---|
defaults[] | proxies | 默认配置项,针对以下的frontend、backend和listen生效,可以多个name也可以没有name |
frontend | proxies | 前端servername,类似于Nginx的一个虚拟主机 server和LVS服务集群。 |
backend | proxies | 后端服务器组,等于nginx的upstream和LVS中的RS服务器 |
listen | proxies | 将frontend和backend合并在一起配置,相对于frontend和backend配置更简洁,生产常用 |
4.2.1.1defaults
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
defaults
mode http # 使用七层
log global # 日志 根据global的设定
option httplog # 记录http的日志
option dontlognull # 空链接的日志不记录
option http-server-close # 等待客户端完整HTTP请求的时间,此处为等待10s
option forwardfor except 127.0.0.0/8 # 透传客户端真实IP至后端web服务器
# 在apache配置文件中加入:<br>%{x-Forwarded-For}i
# 后在webserer中看日志即可看到地址透传信息
option redispatch # #当server ID对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发
retries 3 # 连接后端服务器失败次数
timeout http-request 10s # 等待客户端请求完全被接收和处理的最长时问
timeout queue 1m # 设置删除连接和客户端收到503或服务不可用等提示信息前的等待时问
timeout connect 10s # 设置等待服务器连接成功的时间
timeout client 1m # 设置允许客户端处于非活动状态,即既不发送数据也不接收数据的时间
timeout server 1m # 设置服务器超时时间,即允许服务器处于既不接收也不发送数据的非活动时间
timeout http-keep-alive 10s # session会话保持超时时间,此时问段内会转发到相同的后服务器
timeout check 10s # 对后端服务器的默认检测超时时间
maxconn 3000 # 最大能够承受的并发链接
backup使用案例
web1
[root@webserver1 ~]# systemctl stop nginx.service
web2
[root@webserver2 ~]# systemctl stop nginx.service
### backup 示例
[root@haproxy ~]# dnf install httpd -y
[root@haproxy ~]# vim /etc/httpd/conf/httpd.conf
# 定位47行,修改端口号
46 #Listen 12.34.56.78:80
47 Listen 8080
[root@haproxy ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@haproxy ~]# echo sorry 下班了 > /var/www/html/index.html
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster
bind *:80
mode http
balance roundrobin
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_s 172.25.254.100:8080 backup
# web1和web2没有被调用的时候,调用web_s
[root@haproxy ~]# systemctl restart haproxy.service
[root@haproxy ~]# curl 172.25.254.100
sorry 下班了
[root@haproxy ~]# curl 172.25.254.100
sorry 下班了
# 开启其中一台
[root@webserver2 ~]# systemctl start nginx.service
# 检测
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
server配置
# 针对一个server配置
check #对指定rea1进行健康状态检査,如果不加此设置,默认不开启检査,只有check后面没有其它配置也可以启用检查功能
# 默认对相应的后端服务器IP和端口,利用TCP连接进行周期性健康性检查,注意必须指定端口才能实现健康性检查
addr <IP> # 可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量
port <num> # 指定的健康状态监测端口
inter <num> # 健康状态检查间隔时间,默认2000ms
fa11 <num> # 后端服务器从线上转为线下的检查的连续失效次数,默认为3
rise <num> # 后端服务器从下线恢复上线的检查的连续有效次数,默认为2
weight <weight> # 默认为1,最大值为256,0(状态为蓝色)表示不参与负载均衡,但仍接受持久连
接
backup # 将后端服务器标记为备份状态,只在所有非备份主机down机时提供服务,类似Sorry
Server
disabled # 将后端服务器标记为不可用状态,即维护状态,除了持久模式,将不再接受连接,状态为深黄色,优雅下线,不再接受新用户的请求
redirect prefix http://www.baidu.com/ # 将请求临时(302)重定向至其它URL,只适用于http模式
redir http://www.baidu.com # 将请求临时(302)重定向至其它URL,只适用于http模式
maxconn <maxconn> # 当前后端server的最大并发连接数
4.3socat工具
- 对服务器动态权重和其它状态可以利用 socat工具进行调整,Socat 是 Linux 下的一个多功能的网络工具,名字来由是Socket CAT,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向通道,且支持众多协议和链接方式。如IP、TCP、UDP、IPv6、Socket文件等
利用工具socat 对服务器动态权重调整
# 动态调整haproxy里面的参数
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
# turn on stats unix socket
stats socket /var/lib/haproxy/stats mode 600 level admin
# mode 600:stats文件权限是600
# level admin 表示管理员权限,通过stats文件来控制haproxy文件的配置,不加admin只能看不能写
[root@haproxy ~]# systemctl restart haproxy.service
[root@haproxy ~]# ll /var/lib/haproxy/stats
srw------- 1 root root 0 8月 9 11:55 /var/lib/haproxy/stats
# 安装socat动态调整haproxy的参数
[root@haproxy ~]# dnf install socat -y
# 查看当前集群的权重
[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats
2 (initial 2)
# 设置权重
[root@haproxy ~]# echo "set weight webcluster/web1 1 "| socat stdio /var/lib/haproxy/stats
# 查看修改成功
[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats
1 (initial 2)
[root@haproxy ~]# for i in {1..10}
> do
> curl 172.25.254.100
> done
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
# 设置一台主机下线
[root@haproxy ~]# echo "disable server webcluster/web1" | socat stdio /var/lib/haproxy/stats
[root@haproxy ~]# for i in {1..10}; do curl 172.25.254.100; done
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
# 重新启用
[root@haproxy ~]# echo "enable server webcluster/web1" | socat stdio /var/lib/haproxy/stats
[root@haproxy ~]# for i in {1..10}; do curl 172.25.254.100; done
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
针对多进程处理方法
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
global
###省略###
# turn on stats unix socket
stats socket /var/lib/haproxy/stats1 mode 600 level admin process 1 # haproxy多进程热处理
stats socket /var/lib/haproxy/stats2 mode 600 level admin process 2
# utilize system-wide crypto-policies
ssl-default-bind-ciphers PROFILE=SYSTEM
ssl-default-server-ciphers PROFILE=SYSTEM
nbproc 2 # 多进程
cpu-map 1 0
cpu-map 2 1
[root@haproxy ~]# systemctl restart haproxy.service
[root@haproxy ~]# ll /var/lib/haproxy
总用量 0
srw------- 1 root root 0 8月 11 19:22 stats
srw------- 1 root root 0 8月 11 19:25 stats1
srw------- 1 root root 0 8月 11 19:25 stats2