HAProxy介绍、编译安装、服务配置参考、检测配置、调度算法、IP穿透、基于cookie保持session、负载均衡4层与7层的区别

HAProxy介绍

HAProxy是法国开发者Willy Tarreau开发的一个开源软件,是一款具备高并发、高性能的TCP和HTTP负载均衡器,尤其适合于高可用性高并发环境。支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计。

官网:
http://www.haproxy.org
https://www.haproxy.com

主程序:/usr/sbin/haproxy
配置文件:/etc/haproxy/haproxy.cfg

配置段:
global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数

proxies:代理配置段
defaults:为frontend, backend, listen提供默认配置
frontend:前端,相当于nginx中的server {}
backend:后端,相当于nginx中的upstream {}
listen:同时拥有前端和后端配置

HAProxy功能

可以针对HTTP请求添加cookie,进行路由后端服务器
可平衡负载至后端服务器,并支持持久连接
支持基于cookie进行调度
支持所有主服务器故障切换至备用服务器
支持专用端口实现监控服务
支持不影响现有连接情况下停止接受新连接请求
可以在双向添加,修改或删除HTTP报文首部
支持基于pattern实现连接请求的访问控制
通过特定的URI为授权用户提供详细的状态信息

编译安装

创建目录和用户
mkdir /etc/haproxy
useradd haproxy -s /sbin/nologin

解压文件后编译
make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1USE_SYSTEMD=1USE_CPU_AFFINITY=1 PREFIX=/app/haproxy
make install
注意:TARGET要根据自己系统来选择,详情查看README,如果没装过编译包需要装上
yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools


创建启动脚本
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target


配置参考

global配置参数

chroot #锁定运行目录
deamon #以守护进程运行
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin #socket文件
user, group, uid, gid #运行haproxy的用户身份
nbproc #开启的haproxy进程数,与CPU保持一致
cpu-map 1 0 #绑定haproxy 进程至指定CPU,这里表示第1个进程绑定到第0个CPU核心
nbthread #指定每个haproxy进程开启的线程数,默认为每个进程一个线程
maxconn #每个haproxy进程的最大并发连接数
maxsslconn #SSL每个haproxy进程ssl最大连接数
maxconnrate #每个进程每秒最大连接数
spread-checks #后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间
pidfile #指定pid文件路径
log 127.0.0.1 local3 info #定义全局的syslog服务器;最多可以定义两个

Proxies配置

defaults [] #默认配置项,针对以下的frontend、backend和lsiten生效,可以多个name
frontend #前端servername,类似于Nginx的一个虚拟主机 server。
backend #后端服务器组,等于nginx的upstream
listen #将frontend和backend合并在一起配置

name字段只能使用”-”、”_”、”.”、和”:”,并且严格区分大小写,例如:Web和web是完全不同的两组服务器。

defaults 配置参数

option redispatch #当server Id对应的服务器挂掉后,强制定向到其他健康的服务器

option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接,比如请求页面之后很久都没有回应的链接

option http-keep-alive 60#开启会话保持

option forwardfor #开启IP透传

maxconn #最大连接数

mode http #默认工作类型

timeout connect 120s #转发客户端请求到后端server的最长连接时间,即HAProxy连接后端服务器时多长时间没连上就算超时,这个可以设置稍微短一些。

timeout server 600s #转发客户端请求到后端服务端的超时超时时长,这里指连上之后多久时间内后端服务器没有数据返回,考虑到服务器处理请求的时间可以设置的稍微长一点。

timeout client 600s #与客户端的最长空闲时间

timeout http-keep-alive 120s #session 会话保持超时时间,指定时间内同一个用户再次连接的请求转发到相同的后端服务器

#timeout check 5s #对后端服务器的检测超时时间

frontend配置参数

bind:指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中
bind [<address>]:<port_range> [, …] [param*]
mode http/tcp #指定负载协议类型
use_backend backend_name #调用的后端服务器组名称

示例:

frontend WEB_PORT
  bind :80,:8080
  bind 192.168.1.10:8877,192.168.1.11:9988
  use_backend  test_host
backend配置参数

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

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

示例:

backend test_host
  server test1 192.168.1.12
  server test2 192.168.1.13

maxconn mode timeout之类的选项没配置会从defaults中继承
listen配置参数

使用listen可代替frontend 和 backend配置,这样看起来比较方便而且整洁
示例:

listen test
  bind 192.168.1.10:80
  server testweb1 192.168.1.12:80

**frontend、backend、listen中命名的name只能使用"-"," _",".",":"这几个符号,而且字母区分大小写

后端服务器状态监测及相关配置

check #对指定后端服务器l进行健康状态检查,默认不开启,可在IP后面添加开启。

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

示例:

3秒检测一次服务器,失败3次标记为失效服务器,成功5次恢复为有效服务器
server test1 192.168.1.12 check inter 3S fall 3 rise 5

如后端服务器是nginx+php架构,可能会出现nginx还在,PHP挂掉的情况
可改为检测PHP的端口是否存活
server test1 192.168.1.12 check port 9000 inter 3S fall 3 rise 5

调度算法

静态调度算法

使用balance配置对后端服务器的调度算法,需要配置在listen或backend

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

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

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

示例:

listen test
  bind 192.168.1.10:80
  balance first
  server testweb1 192.168.1.12:80

动态调度算法

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

roundrobin:基于权重的轮询动态调度算法,支持权重的运行时调整,不等于lvs 的rr,支持慢启动即新加的服务器会逐渐增加转发数,每个后端backend中最多支持4095个server,此为默认调度算法,server 权重设置 weight

leastconn: 加权的最少连接的动态,支持权重的运行时调整和慢启动,即当前后端服务器连接最少的优先调度,比较适合长连接的场景使用,比如MySQL等场景。

动态调度配置需要先开启sock文件,然后安装socat

yum install socat -y

安装之后使用echo把文本重定向到sock文件中

echo "show info" | socat stdio /var/lib/haproxy/haproxy.sock

源地址hash算法

源地址hash基于用户源地址hash并将请求转发到后端服务器,默认为静态即取模方式,但是可以通过hash-type支持的选项更改,后续同一个源地址请求将被转发至同一个后端web服务器,比较适用于session保持/缓存业务等场景。
类型指定为一致性哈希,该hash是动态的,支持在线调整权重,支持慢启动,优点在于当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动。

示例:

listen test
  bind 192.168.1.10:80
  mode http
  balance source
  hash-type consistent
  server testweb1 192.168.1.12:80
  server testweb1 192.168.1.13:80

uri算法

基于对用户请求的uri做hash并将请求转发到后端指定服务器,有两种方式
map-based:取模法
•consistent:一致性哈希

示例:

listen test
  bind 192.168.1.10:80
  mode http #不支持tcp模式,使用tcp会切换到tcp的roundrobin负载模式
  balance uri
  hash-type consistent
  server testweb1 192.168.1.12:80
  server testweb1 192.168.1.13:80

uri_param算法

对用户请求的url中的部分中的参数name作hash计算,并由服务器总权重相除以后派发至某挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个Backend Server

示例:

listen test
  bind 192.168.1.10:80
  mode http 
  balance url_param v1
  hash-type consistent
  server testweb1 192.168.1.12:80
  server testweb1 192.168.1.13:80

假设url是test.com/a.html/v1=123
此时参数名v1正好匹配url_param中的参数名,则基于参数值进行哈希运算,第一次访问时会根据权重选择服务器,后续都会调度到同一个服务器上。

假如url是test.com/a.html/v2=123
此时参数不匹配url_param中的参数名,则基不做哈希运算而是轮询调度

hdr算法

hdr(name):针对用户每个http头部(header)请求中的指定信息做hash,此处由指定的http首部值将会被取出并做hash计算,然后由服务器总权重相除以后派发至某挑出的服务器,假如无有效的值,则会被轮询调度

示例:

listen test
  bind 192.168.1.10:80
  mode http 
  balance hdr(User-Agent)
  hash-type consistent
  server testweb1 192.168.1.12:80
  server testweb1 192.168.1.13:80

rdp-cookie算法

对远程桌面的负载,使用cookie保持会话

示例:

listen test
  bind 192.168.1.10:3389
  mode tcp
  balance rdp-cookie
  server testweb1 192.168.1.12:3389
  server testweb1 192.168.1.13:3389

IP穿透

IP穿透可以把用户IP传给后端服务器,以便做统计。

http模式穿透只需要加上option forwardfor即可

示例:

listen test
  bind 192.168.1.10:80
  mode http 
  option forwardfor
  server testweb1 192.168.1.12:80
  server testweb1 192.168.1.13:80

tcp模式穿透需要在后端服务器配置加上send-proxy,还要额外配置nginx
注:option forwardfor只支持HTTP模式,TCP模式下会被忽略此配置

示例:

haproxy配置
listen test
  bind 192.168.1.10:80
  mode http 
  server testweb1 send-proxy 192.168.1.12:80
  server testweb1 send-proxy 192.168.1.13:80

nginx配置
在listen后面加上proxy_protocol
server{
  listen 80 proxy_protocol;
}
在日志格式中设置此项
"tcp_ip":"$proxy_protocol_addr"

基于cookie保持session

cookie :为当前server指定cookie值,实现基于cookie的会话黏性
cookie [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [preserve ] [ httponly ] [ secure ] [ domain <domain> ]* [ maxidle <idle> ] [maxlife <life> ]
<name>:cookie名称,用于实现持久连接
rewrite:重写
insert:插入
prefix:前缀
nocache:当client和hapoxy之间有缓存时,不缓存cookie

示例:

listen test
  bind 192.168.1.10:80
  mode http 
  cookie MYCOOKIE insert indirect nocache
  server testweb1 192.168.1.12:80 cookie c1
  server testweb1 192.168.1.13:80 cookie c2
MYCOOKIE、c1、c2可以自己定义名称

负载均衡4层与7层的区别

四层:
在四层负载设备中,把client发送的报文目标地址(原来是负载均衡设备的IP地址),根据均衡设备设置的选择web服务器的规则选择对应的web服务器IP地址,这样client就可以直接跟此服务器建立TCP连接并发送数据。

七层:
七层负载均衡服务器起了一个代理服务器的作用,服务器建立一次TCP连接要三次握手,而client要访问webserver要先与七层负载设备进行三次握手后建立TCP连接,把要访问的报文信息发送给七层负载均衡。

然后七层负载均衡再根据设置的均衡规则选择特定的webserver,然后通过三次握手与此台webserver建立TCP连接,然后webserver把需要的数据发送给七层负载均衡设备,负载均衡设备再把数据发送给client。

所以,七层负载均衡设备起到了代理服务器的作用。

roundrobin,做了session共享后用的最多的调度算法,用于四层
leastconn,用于后端服务器上Mysql,用于四层
static-rr,静态轮询,用于四层
first,很少用
source,后端服务器没有session共享但是要保持会话时使用,通常用在四层
uri,例如CND缓存用,用于七层
url_param,也是缓存,用于七层
hdr,基于请求头部指定信息做调度,用于七层
rdp-cookie,用于WINDOWS远程桌面,很少用,用于四层

四层和七层的使用选择

四层是直接转发,而七层需要解包替换地址后再重新封装。
因此在不需要根据请求头部做出调度的情况使用四层。
需要根据请求头部调度时使用七层。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值