HAProxy进阶之路:负载均衡与高级配置
文章目录
一、什么是Haproxy
在服务器集群中,如果后端服务器有设备宕机或停止工作。调度器VS 还是会根据策略将流量调度到不工作的后端服务器上,为了解决这个问题就出现了后端检测的技术。
当前的企业中已经不适用lvs进行后端检测,haproxy主要的功能是作为负载均衡器,而不是专门用于后端检测。但是它具备一些与后端检测相关的特性和功能,如果后端服务器出现故障或不可用,HAProxy 可以自动将流量切换到其他健康的服务器上。
1.1 负载均衡
- 四层负载均衡
主要根据三层的IP加上四层的端口判断流量递送到哪台后端服务器上,并记录该服务器的地址,后续该连接的所有流量都在该服务器上处理。
- 七层负载均衡
七层的负载均衡是在四层的基础上 实现的,不同的是七层的负载均衡可以根据请求报文中的URL或者IP实现负载均衡,将流量递送到相应的后端服务器上。
1.2 代理
- 正向代理
**原理:**客户端将请求发送给正向代理服务器,然后由正向代理服务器代表客户端向目标服务器发送请求。正向代理服务器隐藏了客户端的真实IP地址和身份,目标服务器只能看到正向代理服务器的IP地址。
**优点:**①隐藏用户信息②访问被墙的网站③可以做缓存,加速访问资源④对客户端访问授权,上网进行认证。
**缺点:**①可能会引入额外的延迟;②如果正向代理服务器出现故障,可能会导致客户端无法访问目标服务器。
- 反向代理
**原理:**代表服务器接收请求并将其转发到后端服务器的代理服务器。客户端发送请求到反向代理服务器,然后反向代理服务器根据一定的规则将请求转发到后端服务器。反向代理服务器隐藏了后端服务器的真实IP地址和身份,客户端只能看到反向代理服务器的IP地址。
**优点:**①隐藏后端服务器的真实IP地址,提高了服务器的安全性;
②可以实现负载均衡,提高系统的性能和可靠性;
③缓存静态内容,减轻后端服务器的负载,提高响应速度;
⑤可以对请求进行过滤和修改,实现内容过滤、重定向和URL重写等功能。
缺点:如果反向代理服务器出现故障,可能会导致整个系统无法正常工作。
1.3 haproxy基本信息
- 配置文件路径:
/etc/haproxy/haproxy.cfg
global 全局配置段
chroot #锁定运行目录
deamon #以守护进程运行
user, group, uid, gid #运行haproxy的用户身份
stats socket #套接字文件
nbproc N #开启的haproxy worker 进程数,默认进程数是一个
nbthread 1 (和nbproc互斥) #指定每个haproxy进程开启的线程数,默认为每个进程一个线程
cpu-map 1 0 #绑定haproxy worker 进程至指定CPU,将第1个work进程绑定至0号CPU
cpu-map 2 1 #绑定haproxy worker 进程至指定CPU,将第2个work进程绑定至1号CPU
maxconn N #每个haproxy进程的最大并发连接数
maxsslconn N #每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下
maxconnrate N #每个进程每秒创建的最大连接数量
spread-checks N #后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间,默认值0
pidfile #指定pid文件路径
log 127.0.0.1 local2 info #定义全局的syslog服务器;日志服务器需要开启UDP协议,最多可以定义两个
proxies 代理配置
default
:默认配置项,针对以下的frontend、backend和listen生效,可以多个name也可以没有name
mode http # HAProxy实例使用的连接协议
log global #指定日志地址和记录日志条目的syslog/rsyslog日志设备;此处的 global #表示使用 global配置段中设定的log值。
option httplog #日志记录选项,httplog表示记录与 HTTP会话相关的各种属性值,#包括 #HTTP请求、会话状态、连接数、源地址以及连接时间等
option dontlognull #dontlognull表示不记录空会话连接日志
option http-server-close #等待客户端完整HTTP请求的时间
option forwardfor except 127.0.0.0/8 #透传客户端真实IP至后端web服务器,在webserer中看日志即可看到地址透传 #信息
option redispatch #当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发
option http-keep-alive #开启与客户端的会话保持
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 #最大能承受的连接并发量
default-server inter 1000 weight 3 #对后端检测的默认参数
frontend
:前端servername
bind #制定haproxy监听的端口
mode 指定负载协议类型
backend
:后端服务器组
balance #用于指定后端服务器的负载均衡算法。
option #配置选项
server #定义后端real server,必须指定IP和端口(详解见下小节)
listen
:相当于frontend + backend
将frontend和backend的内容写在一起就是listen的内容
global里设定的内容在default中也可以设定。在Haproxy程序运行中,程序先读取global中的内容然后再读取default部分的内容,而default会将global中的内容覆盖。
server 配置
check #对指定real进行健康状态检查,如果不加此设置,默认不开启检查
#只有check后面没有其它配置也可以启用检查功能
#默认对相应的后端服务器IP和端口,利用TCP连接进行周期性健康性检查
#注意必须指定端口才能实现健康性检查
addr <IP> #可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量
port <num> #指定的健康状态监测端口
inter <num> #健康状态检查间隔时间,默认2000 ms
fall <num> #后端服务器从线上转为线下的检查的连续失效次数,默认为3
rise <num> #后端服务器从下线恢复上线的检查的连续有效次数,默认为2
weight <weight> #默认为1,最大值为256,0(状态为蓝色)表示不参与负载均衡,但仍接受持久连接
backup #将后端服务器标记为备份状态,只在所有非备份主机down机时提供服务
#类似SorryServer
disabled #将后端服务器标记为不可用状态,即维护状态,除了持久模式
#将不再接受连接,状态为深黄色,优雅下线,不再接受新用户的请求
redirect prefix http://www.baidu.com/ #将请求临时(302)重定向至其它URL
#只适用于http模式
maxconn <maxconn> #当前后端server的最大并发连接数
1.4 基础环境搭建
- 虚拟机环境配置
主机名 | IP | 下载服务 |
---|---|---|
Haproxy | 172.25.254.100 | Haproxy |
Server01.com | 172.25.254.10 | Apache |
Server02.com | 172.25.254.20 | Nginx |
Client | 处于同一个网段即可 | 无 |
- Server服务器配置
################ 软件包下载 ################
### Server01
[root@Server01 ~]# yum install httpd -y
[root@Server01 ~]# systemctl enable httpd --now ####启动服务
### Server02
[root@Server02 ~]# yum install nginx -y
[root@Server02 ~]# systemctl enable nginx --now ####启动服务
################ 网页内容 ################
### Server01
[root@Server01 ~]# echo "Server01.com-172.25.254.10" > /var/www/html/index.html
[root@Server01 ~]# curl 172.25.254.10
Server01.com-172.25.254.10
### Server02
[root@Server02 ~]# echo "Server02.com-172.25.254.20" > /usr/share/nginx/html/index.html
[root@Server02 ~]# curl 172.25.254.20
Server02.com-172.25.254.20
- haproxy主机配置
#下载haproxy软件包
[root@Haproxy ~]# yum install haproxy