HAProxy(一)

四层负载均衡与七层负载均衡区别

四层负载均衡和七层负载均衡是两种不同的负载均衡方式,主要区别在于负载均衡的层级及其所支持的协议不同。

四层负载均衡,也称为传输层负载均衡,工作在 OSI 模型的传输层(第四层),主要是基于 IP 地址和端口号来进行负载均衡,常用的四层负载均衡器有 LVS、HAProxy、Nginx(1.9以后) 等。四层负载均衡可以处理 TCP 和 UDP 协议,可以实现基于轮询、最小连接数、哈希等算法的负载均衡策略,可以实现网络流量的分发和负载均衡,但不能实现应用层的协议解析。

七层负载均衡,也称为应用层负载均衡,工作在 OSI 模型的应用层(第七层),主要是基于应用层协议(如 HTTP、SMTP、FTP 等)进行负载均衡,常用的七层负载均衡器有 HAProxy、Nginx、F5 等。七层负载均衡可以实现基于 URL、域名、Cookie 等信息的负载均衡策略,可以实现更精细的流量控制和负载均衡,同时也可以进行应用层协议解析、缓存、SSL 加速等操作。

因此,四层负载均衡和七层负载均衡各有优缺点,选用哪种方式取决于具体的场景和需求。

简介

HAProxy是法国开发者威利塔罗(Wily Tarreau)在2000年使用C语言开发的一个开源软件,是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器,支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计。

核心功能

  • 负载均衡:L4和L7两种模式,支持RR/静态RR/LC/IP Hash/URI Hash/URL_PARAM Hash/HTTP_HEADER Hash 等丰富的负载均衡算法

  • 健康检查:支持TCP和HTTP两种健康检查模式

  • 会话保持:对于未实现会话共享的应用集群,可通过 Insert Cookie/Rewrite Cookie/Prefix Cookie,以及上述的多种 Hash 方式实现会话保持

  • SSL:HAProxy 可以解析 HTTPS 协议,并能够将请求解密为 HTTP 后向后端传输

  • HTTP 请求重写与重定向

  • 监控与统计:HAProxy 提供了基于 Web 的统计信息页面,展现健康状态和流量数据。基于此功能,使用者可以开发监控程序来监控 HAProxy 的状态

下载

源码包下载地址 Index of /repo/pkgs/haproxy

产品文档 HAProxy Documentation Converter

配置

/etc/haproxy/haproxy.cfg 配置文件由两大部分组成 Global 和 Proxies

Global:全局配置段

进程及安全配置相关参数

性能调整相关参数

Debug相关参数

bash 复制代码
chroot /usr/local/haproxy    #锁定运行目录
deamon    #以守护进程运行
#stats socket /var/lib/haproxy/haproxy. sock mode 600 level admin    #socket文件
user,group,uid,gid    #运行haproxy的用户身份,如 user wenzi或uid 666
nbproc    #开启的haproxy进程数,与CPu保持一致
nbthread    #指定每个haproxy进程开启的线程数,默认为每个进程一个线程
cpu-map 1 0    #绑定haproxy进程至指定CPU
maxconn    #每个haproxy进程的最大并发连接数
maxss1conn    #每个haproxy进程ss1最大连接数,用于haproxy配置了证书的场景下
maxconnrate    #每个进程每秒创建的最大连接数量
spread-checks    #后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间
pidfile    #指定pid文件路径
log 127.0.0.1 local3 info    #定义全局的sys1og服务器;最多可以定义两个

Proxies:代理配置段

defaults

为frontend,backend,listen提供默认配置

bash 复制代码
option redi spatch    #当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发
option abortonclose    #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接,关闭
option http-keep-alive    #开启与客户端的会话保持
option forwardfor    #透传客户端真实IP至后端web服务器
mode http    #设置默认工作类型,7层是http,四层是tcp
timeout http-keep-alive 120s    #session会话保持超时时间,范围内会转发到相同的后端服务器
timeout connect 120s    #客户端请求从haproxy到后端server的最长连接等待时间(TCP之前)
timeout server 600s    #客户端请求从haproxy到后端服务端的请求处理超时时长(TCP之后) 
timeout client 600s    #设置haproxy与客户端的最长非活动时间
timeout check 5s    #对后端服务器的默认检测超时时间

frontend

接收请求的前端虚拟节点,可指定具体使用的后端backend,相当于Nginx中的Server {}

bash 复制代码
bind [<address>]:<port_range> [,...] [param*]

listen http_proxy    #监听http的多个IP的多个端口和sock文件
bind :80,:443,:8801-8810
bind 10.0.0.1:10080,10.0.0.1:10443
bind /var/run/ss1-frontend.sock user root mode 600 accept-proxy

listen http_https_proxy    #https监听
bind :80
bind :443 ss7 crt /etc/haproxy/site.pem

listen http_https_proxy_explicit    #监听ipv6、ipv4和unix sock文件
bind ipv6@ :80
bind ipv4@public_ssl:443 ssl crt /etc/haproxy/site.pem
bind unix@ss7-frontend.sock user root mode 600 accept-proxy

listen externa7_bind_app1    #监听file descriptor
bind "fd@${FD_APP1]"

backend

后端服务集群的配置,相当于Nginx中的upstream {}

bash 复制代码
mode http/tcp    #指定负载协议类型
option    #配置选项
server    #定义后端real server

注意:option后面加httpchk,smtpchk,mysql-check,pgsql-check,ss-hello-chk方法,可用于实现更多应用层检测功能。

bash 复制代码
check    #对指定rea7进行健康状态检查,默认不开启
addr IP    #可指定的健康状态监测IP
port num    #指定的健康状态监测端口
inter num    #健康状态检查间隔时间,默认2000ms
fall num    #后端服务器失效检查次数,默认为3
rise num    #后端服务器从下线恢复检查次数,默认为2
weight    #默认为1,最大值为256,0表示不参与负载均衡backup #将后端服务器标记为备份状态
disab1ed    #将后端服务器标记为不可用状态
redirect prefix http: //www.magedu.net/    #将请求临时重定向至其它URL,只适用于http模式
maxconn <maxconn>:当前后端server的最大并发连接数
backlog <backlog>:当server的连接数达到上限后的后援队列长度

示例

frontend+backend结合配置

bash 复制代码
#官网业务访问入口
frontend WEB_PORT_80
bind 192.168.7.248:80
mode http
use_backend web_prot_http_nodes

backend web_prot_http_nodes
mode http
option forwardfor
server 192.168.7.101 192.168.7.101:8080  check inter 3000 fall 3 rise 5
server 192.168.7.102 192.168.7.102:8080  check inter 3000 fall 3 rise 5

listen:

同时拥有前端和后端配置

使用listen替代 frontend+backend结合配置的 上述配置

bash 复制代码
#官网业务访问入口
listen    WEB_PORT_80
    bind 192.168.7.248:80
    mode http
    option forwardfor
    server 192.168.7.101 192.168.7.101:8080  check inter 3000 fall 3 rise 5
    server 192.168.7.102 192.168.7.102:8080  check inter 3000 fall 3 rise 5

调度算法

静态算法

按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、链接数和相应速度等,且无法实时修改权重,只能靠重启HAProxy生效。

static-rr

基于权重的轮询调度,不支持权重的运行时调整及后端服务器慢启动,其后端主机数量没有限制

first

根据服务器在列表中的位置,自上而下进行调度,但是其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务,因此会忽略服务器的权重设置。

动态算法

基于后端服务器状态进行调度适当调整,比如优先调度至当前负载较低的服务器,且权重可以在haproxy运行时动态调整无需重启。

roundrobin

基于权重的轮询动态调度算法,支持权重的运行时调整,不完全等于lvs中的rr轮训模式,HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),其每个后端backend中最多支持4095个realserver,roundrobin为默认调度算法,且支持对real server权重动态调整。

leastconn

leastconn加权的最少连接的动态,支持权重的运行时调整和慢启动,即当前后端服务器连接最少的优先调度(新客户端连接),比较话合长连接的场景使用,比比如MySOL等场景

其它算法

source:根据请求源ip地址

url:根据请求的URL

url_param:根据请求的url参数进行调度

hdr(name):根据HTTP请求头来锁定每一次HTTP请求

rdp-cookie:根据cookie名来锁定并hash每一次TCP请求。

使用场景

first:使用较少

static-rr:session共享的web集群

leastconn:数据库

source:基于客户端公网IP的会话保持

uri:缓存服务器,CDN服务商

hdr:基于客户端请求报文头做下一步处理

rdp-cookie:很少使用

相关推荐
xuanzdhc2 小时前
Linux 基础IO
linux·运维·服务器
愚润求学2 小时前
【Linux】网络基础
linux·运维·网络
bantinghy3 小时前
Linux进程单例模式运行
linux·服务器·单例模式
小和尚同志4 小时前
29.4k!使用 1Panel 来管理你的服务器吧
linux·运维
帽儿山的枪手4 小时前
为什么Linux需要3种NAT地址转换?一探究竟
linux·网络协议·安全
shadon1789 天前
回答 如何通过inode client的SSLVPN登录之后,访问需要通过域名才能打开的服务
linux
小米里的大麦9 天前
014 Linux 2.6内核进程调度队列(了解)
linux·运维·驱动开发
程序员的世界你不懂9 天前
Appium+python自动化(三十)yaml配置数据隔离
运维·appium·自动化
算法练习生9 天前
Linux文件元信息完全指南:权限、链接与时间属性
linux·运维·服务器
忘了ʷºᵇₐ9 天前
Linux系统能ping通ip但无法ping通域名的解决方法
linux·服务器·tcp/ip