为什么要使用haproxy?
因为LSV无后端检测,当webserver有一台状态异常,则运作异常;所以用haproxy来解决。
haproxy是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器,它支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计。
目录
一、实验环境
二、haproxy基本部署
1、下载安装
2、部署
3、测试
(1)nginx服务皆开启时
(2)断开其中一个nginx服务,开启后端检测
三、基本配置信息
(1)global 全局配置段
(2)proxies 代理配置段
1、defaults
2、frontend
3、backend
4、listen
一、实验环境
功能 | IP |
本地 | 172.25.254.1 |
haproxy | eth0 172.25.254.100 |
RS1 | eth0 172.25.254.10 |
RS2 | eth0 172.25.254..20 |
二、haproxy基本部署
1、下载安装
[root@haproxy ~]# dnf install haproxy -y
[root@webserver1 ~]# dnf install nginx -y
[root@webserver2 ~]# dnf install nginx -y
2、部署
[root@webserver1 ~]# echo webserver1 -- 172.25.254.10 > /usr/share/nginx/html/index.html
[root@webserver1 ~]# systemctl enable --now nginx
[root@webserver2 ~]# echo webserver2 -- 172.25.254.20 > /usr/share/nginx/html/index.html
[root@webserver2 ~]# systemctl enable --now nginx
在 haproxy.cfg中编辑,添加图片中所示内容,其中框出的两种方式皆可用
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl enable haproxy
[root@haproxy ~]# systemctl restart haproxy.service
tip小技巧
3、测试
(1)nginx服务皆开启时
(2)断开其中一个nginx服务,开启后端检测
[root@webserver1 ~]# systemctl stop nginx.service
三、基本配置信息
HAProxy配置文件——haproxy.cfg(两部分组成:global、proxies)
(1)global 全局配置段
进程及安全配置相关的参数、性能调整相关参数、Debug参数
参数 | 类型 | 作用 |
chroot | 全局 | 锁定运行目录 |
deamon | 全局 | 以守护进程运行 |
user, group, uid, gid | 全局 | 运行haproxy的用户身份 |
stats socket | 全局 | 套接字文件 |
nbproc N | 全局 | 开启的haproxy worker进程数,默认进程数1 |
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协议,最多可以定义两个 |
示例:
nbproc 2 #开启两个进程
# 当启用多进程时,需绑定进程至指定CPU,避免CPU漂移
cpu-map 1 0 #进程和cpu核心绑定防止cpu抖动从而减少系统资源消耗
cpu-map 2 1 #2 表示第二个进程,1表示第二个cpu核心
# 日志文件——定向haproxy的日志
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg # 查看定义标准
[root@haproxy ~]# vim /etc/rsyslog.conf # 开启UDP服务,定义haproxy日志文件位置
[root@haproxy ~]# systemctl restart rsyslog.service
[root@haproxy ~]# systemctl restart haproxy.service
(2)proxies 代理配置段
defaults:为frontend, backend, listen 提供默认配置
frontend:前端,相当于nginx中的server{}
backend:后端,相当于nginx中的upstream{}
listen:同时拥有前端和后端配置,配置简单,生产推荐使用
参数 | 类型 | 作用 |
defaults [] | proxies | 默认配置项,针对以下的frontend、backend和listen生效,可以多个name也可以没有name |
frontend | proxies | 前端servername,类似于Nginx的一个虚拟主机server和LVS服务集群。 |
backend | proxies | 后端服务器组,等于nginx的upstream和LVS中的RS服务器 |
listen | proxies | 将frontend和backend合并在一起配置,相对于frontend和backenc配置更简洁,生产常用 |
1、defaults
参数 | 功能 |
option abortonclose | 当服务器负载很高时,自动结束掉当前队列处理比较久的连接,针对业务当情况选择开启 |
option redispatch | 当server ld对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发 |
option http-keep-alive | 开启与客户端的会话保持 |
option forwardfor | 透传客户端真实IP至后端web服务器(在apache配置文件中加入:%{X-Forwarded-For}i后在webserer中看日志即可看到地址透传信息) |
mode http | tcp | 设置默认工作类型,使用TCP服务器性能更好,减少压力 |
timeout http-keep-alive 120s | session 会话保持超时时间,此时间段内会转发到相同的后端服务器 |
timeout connect 120s | 客户端请求从haproxy到后端server最长连接等待时间(TCP连接之前)默认单位ms |
timeout server 600s | 客户端请求从haproxy到后端服务端的请求处理超时时长(TCP连接之后),默认单位ms,如果超时,会出现502错误,此值建议设置较大些,访止502错误 |
timeout client 600s | 设置haproxy与客户端的最长非活动时间,默认单位ms,建议和timeout server相同 |
timeout check 5s | 对后端服务器的默认检测超时时间 |
default-server inter 1000 weight 3 | 指定后端服务器的默认设置 |
2、frontend
bind:指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中
格式:bind [<address>]:<port_range>[,...][param*]
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
注意:如果需要绑定在非本机的IP,需要开启内核参数:net.ipv4.ip_nonlocal_bind=1
backlog <backlog>#针对所有server配置,当前端服务器的连接数达到上限后的后援队列长度,注意:不支持backend
3、backend
定义一组后端服务器,backend服务器将被frontend进行调用。
mode http | tcp # 指定负载协议类型,和对应的frontend必须一致
option #配置选项
sever #定义后端realserver,必须指定IP和端口
注意:backend 的名称必须唯一,并且必须在listen或frontend中事先定义才可以使用,否则服务无法启动
option后面加 httpchk,smtpchk,mysql-check,pgsql-check,ssl-hello-chk方法,可用于实现更多应用层检测功能。
4、listen
使用listen替换 frontend和backend的配置方式,可以简化设置,通常只用于TCP协议的应用