haproxy

 

 

一、负载均衡

1.1什么是负载均衡

 负载均衡(Load Balance [4])其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞度量、加强网络数据处理能力、提高网络的灵活性和可用性。

92cf641812f14d50b14011e976a3cbc6.png1.2为什么用负载均衡

·Web服务器的动态水平扩展-->对用户无感知
·增加业务并发访问及处理能力-->解决单服务器瓶颈问题节约公网IP地址-->降低IT支出成本
·隐藏内部服务器IP-->提高内部服务器安全性
·配置简单-->固定格式的配置文件
·功能丰富-->支持四层和七层,支持动态下线主机性能较强-->并发数万甚至数十万

1.3四层负载均衡和七层负载均衡

1.3.1四层负载均衡

  所谓四层负载均衡,也就是主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
以常见的TCP为例,负载均衡设备在接收到第一个来自客户端的SYN 请求时,选择一个最佳的服务器,并对报文中目标IP地址进行修改(改为后端服务器IP),直接转发给该服务器。TCP的连接建立,即三次握手是客户端和服务器直接建立的,负载均衡设备只是起到一个类似路由器的转发动作。在某些部署情况下,为保证服务器回包可以正确返回给负载均衡设备,在转发报文的同时可能还会对报文原来的源地址进行修改。

29e74076ee0b4c48851b8ee5d4a7bd9d.png

1.3.2四层负载均衡的特点

1.四层负载均衡仅能转发TCP/IP协议、UDP协议、通常用来转发端口,如:tcp/22、udp/53;
2.四层负载均衡可以用来解决七层负载均衡端口限制问题;(七层负载均衡最大使用65535个端口号)
3.四层负载均衡可以解决七层负载均衡高可用问题;(多台后端七层负载均衡能同时的使用)
4.四层的转发效率比七层的高得多,但仅支持tcp/ip协议,不支持http和https协议;
5.通常大并发场景通常会选择使用在七层负载前面增加四层负载均衡

 

1.3.3七层负载均衡

第七层是web 内容交换技术,即对访问流量的高层控制方式,通过对应用层内容的切换,将这种真正有意义的信息,结合我们对负载均衡设备的特定设置,进行服务器的选择。七层负载均衡是在四层的基础上做的,它可以根据七层的特定信息决定如何转发流量以及选择服务器实现负载均衡

6c7a72e7d6a04b70adb43eff03b9a89c.png

1.3.4四层负载均衡和七层负载均衡的对比

·第四层交换功能的实现,也就是虚拟IP 地址( VIP) 方法,这个地址并不是与特定的计算机相连,也没有与计算机中的网络接口卡相连。它的实现过程是当数据包发送到这个VIP 地址时,通过第四层交换功能,并根据设定好的调度算法分配到一个真实的网络接口。每次TCP 请求都可以动态分配其中的一个IP 地址,从而达到负载均衡。
·四层负载均衡,主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的后端服务器。
·七层负载均衡,也称为“内容交换”,主要通过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的后端服务器。
·注意一般4层lvs的性能好一点,但是七层haproxy可以做具体的策略,所以企业中一般是四层和七层负载均衡结合使用,也就是lvs->haproxy->rs

二、haproxy安装和服务信息

克隆rhel9的虚拟机 :准备三台虚拟机命名为:【haproxy】【webserver1】【webserver2】

【haproxy】配置:

vmset.sh eth0 172.25.254.100 haproxy.lee.org

be9ad0664daf4d5081d175a8409d9f4d.png

下载haproxy:dnf install haproxy -y并启动

dec84f1835184e5ba9d9ef917becf2f2.png

在 /etc/haproxy/haproxy.cfg下面编辑

a6b11e7031d64a8ba2facd38496dcb13.png

7d7f160e062642dbbad0e8932db04f69.png

说明没有问题

【websrver1】

d9d6fae8a1be4225a56e49f1ca9f9220.png【】

下载nginx:yum install nginx -y

36cad63ad5f14434bd20ee46346b9516.png

启动:systemctl enbale --now nginx

【webserver2】

aef9af7eab0349d883ddb2587fcbe7f6.pngyum  yum install nginx -y

3a7ea8c5f3b344c8a8a75db53a4b0eb0.png启动:systemctl enbale --now nginx

测试:

755bb3b762124b7b93a95adf632caea2.png

三、haproxy的算法

3.1静态算法:

按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度 等,且无法实时修改权重(只能为0和1,不支持其它值),只能靠重启HAProxy 生效。

3.1.1 static-rr:基于权重的轮询调度

static-rr:基于权重的轮询调度,该算法与轮循算法相似,只是它是静态的,这意味着动态更改服务器的权重不会产生任何影响。不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)及后端服务器慢启动,其后端主机数量没有限制,相当于LVS中的 wrr

#代码实现
[root@haproxy ~]#cat /etc/haproxy/conf.d/test.cfg
listen web_80
    bind 172.25.254.100:80
    balance static-rr
    server web1 172.25.254.10:80 weight 1 check inter 2 fall 3 rise 2
    server web2 172.25.254.20:80 weight 2 check inter 2 fall 3 rise 1
    
[root@haproxy ~]#systemctl reload haproxy.service


3.1.2first

first:根据服务器在列表中的位置,自上而下进行调度,但是其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务(一旦服务器达到其 maxconn 值,使用下一个服务器)。该算法的目的是始终使用最小的服务器数量,以便可以关闭额外的服务器在非密集时间。因此会忽略服务器的权重设置,此方式使用较少

不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效,该算法忽略服务器权重。

#代码实现
maxconn <maxconn> #当前后端server的最大并发连接数

[root@haproxy ~]#cat /etc/haproxy/conf.d/test.cfg
listen web_80
    bind *:80
    mode httpd
    balance first
    server web1 172.25.254.10:80 maxconn 1  check inter 2 fall 3 rise 5 weught 2
    server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
    server local 127.0.0.1:80 backup

[root@haproxy ~]#systemctl reload haproxy.service

3.2动态算法

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

3.2.1rounrobin

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

listen web_80
        bind 172.25.254.100:80
        mode http
        balance roundrobin
        server web01 172.25.254.10:80 weight 1 check inter 3 fall 3 rise 5
        server web02 172.25.254.20:80 weight 1 check inter 3 fall 3 rise 5



#动态调整权重
[root@web1 ~]# echo "get weight web_80/web01" |socat stdio /var/lib/haproxy/haproxy.sock1
1 (initial 1)

[root@web1 ~]# echo "set weight web_80/web01 3" |socat stdio /var/lib/haproxy/haproxy.sock1

[root@web1 ~]# echo "get weight web_80/web01" |socat stdio /var/lib/haproxy/haproxy.sock1
3 (initial 1)

3.2.2leastconn

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

listen web_80
        bind *:80
        mode http
        balance leastconn
        server web01 172.25.254.10:80 check inter 3 fall 3 rise 5  weight 2
        server web02 172.25.254.20:80 check inter 3 fall 3 rise 5  weight 1 

3.2.3其他算法

其他部分算法即可作为静态算法,又可以通过选项成为动态算法

3.2.3.1source

源地址hash,基于用户源地址hash并将请求转发到后端服务器,默认为静态即取模方式,但是可以通过hash-type支持的选项更改,后续同一个源地址请求将被转发至同一个后端web服务器,比较适用于session保持/缓存业务等场景。

3.2.3.2map-base 取模法

 取模法,对source地址进行hash计算,再基于服务器总权重的取模,最终结果决定将此 请求转发至对应的后端服务器。

此方法是静态的,即不支持在线调整权重,不支持慢启动,可实现对后端服务器均衡调度

缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因总权重发生变化而导致调度结果 整体改变,hash-type   指定的默认值为此算法

listen  webserver_80
bind   *:80
mode  http
balance   source
server  webserver1 172.25.254.10:80   weight   1   check   inter  3  fall   3   rise  5
server   webserver2 172.25.254.20:80  weight   1   check   inter  3  fall   3   rise  5

3.2.3.3一致性hash

 

算法:

1、后端服务器哈希环点keyA=hash (后端服务器虚拟ip)%(2^32)

2、客户机哈希环点keyl=hash(client_ip)%(2^32)              得到的值在[0---4294967295]之间,

3、将keyA 和keyl 都放在hash 环上,将用户请求调度到离key1 最近的keyA 对应的后端服务器

60cbe3b1a3fa49eda4ea94da2a563aa0.png

hash 环偏斜问题

增加虚拟服务器IP 数量,比如:一个后端服务器根据权重为1生成1000个虚拟IP,  再 hash 。而后端服务器权 重为2则生成2000的虚拟IP,   再bash,   最终在hash  环上生成3000个节点,从而解决hash  环偏斜问题

hash对象

Hash 对象到后端服务器的映射关系

d7ae4a78e0214541b6c0f6207cb773d4.png 致性hash 示意图

f86b067d9c474267a8ef210f0baa6bca.png

listen web_80
        bind *:80
        mode http
        balance source
        #指定使用一致性hash
        hash-type consistent
        server web01 172.25.254.10:80 weight 1 check inter 3 fall 3 rise 5
        server web02 172.25.254.20:80 weight 1 check inter 3 fall 3 rise 5

3.2.3.4uri

基于对用户请求的URI的左半部分或整个uri做hash, 再 将hash 结果对总权重进行取模后

根据最终结果将请求转发到后端指定服务器 适用于后端是缓存服务器场景

默认是静态算法,也可以通过hash-type 指定map-based 和consistent, 来定义使用取模法还是一致性 hash

c48d1d34a033457dae7625884a2ce38e.png


listen web_80
        bind *:80
        mode http
        balance uri
        server web1 172.25.254.10:80 weight 1 check inter 3 fall 3 rise 5
        server web2 172.25.254.20:80 weight 1 check inter 3 fall 3 rise 5

2eacc67865004bd6bf1a5f19440ec377.png72fe8e331b4044e2b1bd1063c3b1e9f4.png

3.3.3 url_param

url_param 对用户请求的url中的 params  部分中的一个参数key对应的value值作hash 计算,并由服务器 总权重相除以后派发至某挑出的服务器,后端搜索同一个数据会被调度到同一个服务器,多用与电商通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个real server 

如果无没key, 将按roundrobin 算法

f192b3d32d7d4310a760531444f53a19.png

b1859c0442394e7ebc400202b515c685.png

3.3.4 hdr

针对用户每个http 头部(header) 请求中的指定信息做hash, 此处由name 指定的http 首部将会被取出并做hash计算,

然后由服务器总权重取模以后派发至某挑出的服务器,如果无有效值,则会使用默认的轮询调度。

3.3.4.1 hdr取模法配置示例

[haproxy~]#vim /etc/haproxy/haproxy.cfg
listen   webserver_80
bind     *:80 
mode     http
balance  hdr(user-Agent)
server webserver1 172.25.254.10:80   weight   1  check inter  3   fall 3  rise    5
server webserver2 172.25.254.20:80   weight   1  check inter  3   fall 3  rise     5

192a7ffea4ae40a39e61ea367b704aaa.png

274ad51ae9f54db490807f7080c75373.png

09c92dcc5b7240a6ac5298e91c8cc3b7.png

四、高级功能配置

4.1基于cookie的会话保持

 

cookie  value:为当前server 指定cookie 值,实现基于cookie 的会话黏性,相对于基于source   地址

hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy 负载,目前此模式使用较少,已经被 session共享服务器代替

listen webcluster
    bind *:80
    mode http
    balance     roundrobin
cookie WEBCOOKIE insert nocache indirect
    server      web1 172.25.254.10:80 cookie lee1  check inter 2 fall 3 rise 5 weight 1
    server      web2 172.25.254.20:80 cookie lee2  check inter 2 fall 3 rise 5 weight 1

fbdf9b729df7473c9be6621ef6b39b1e.png

4.2ip渗透

web 服务器中需要记录客户端的真实IP地址,用于做访问统计、安全防护、行为分析、区域排行等场景

4.2.1layer4 与layer7

四层负载:

在四层负载设备中,把client发送的报文目标地址(原来是负载均衡设备的IP地址),根据均衡设备设置的 选择web 服务器的规则选择对应的web 服务器IP 地址,这样client 就可以直接跟此服务器建立TCP 连接并 发送数据,而四层负载自身不参与建立连接,而和LVS不 同 ,haproxy  是伪四层负载均衡,因为haproxy   需要分别和前端客户端及后端服务器建立连接

七层代理:

七层负载均衡服务器起了一个反向代理服务器的作用,服务器建立一次TCP 连接要三次握手,而client要 访 问Web   Server要先与七层负载设备进行三次握手后建立TCP连接,把要访问的报文信息发送给七层负 载均衡;然后七层负载均衡再根据设置的均衡规则选择特定的 Web     Server,然后通过三次握手与此台Web  Server建 立TCP 连接,然后Web  Server把需要的数据发送给七层负载均衡设备,负载均衡设备再把 数据发送给client;所以,七层负载均衡设备起到了代理服务器的作用,七层代理需要和Client和后端服 务器分别建立连接

4.2.2四层ip渗透

[haproxy~]#vim     /etc/haproxy/haproxy.cfg

listen   webserver_80
bind     *:80 
mode     tcp
balance  roundrobin
server   webserver1 172.25.254.10:80   weight   1   check  inter  3s  fall  3  rise    5


4.2.3七层ip透传

当haproxy 工作在七层的时候,也可以透传客户端真实IP至后端服务器

haproxy配置

[haproxy~]#vim    /etc/haproxy/haproxy.cfg
...上面内容省略...
listen   webserver_80
option   forwardfor
bind     *:80 
mode     tcp
balance  roundrobin
server   webserver1 172.25.254.10:80   send-proxy   weight  1  check  inter   3  fall    3 rise   5
server   webserver2 172.25.254.20:80    weight   1    check  inter  3   fall   3  rise   5

4.3   ACL

访问控制列表ACL,Access Control Lists) 是一种基于包过滤的访问控制技术

它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配)即对接收到的报文进行匹配和过 滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、 URL、 文件后缀等信息 内容进行匹配并执行进一步操作,比如允许其通过或丢弃。

域名匹配:

[haproxy ~]#vim    /etc/haproxy/haproxy.cfg 
frontend   testacl 
bind   *:80
mode   http
###########      ACL settings       #######################
acl  web_host  hdr_dom(host)www.timinglee.org
###########       host              ########################### 
use_backend timinglee_host if web_host
###########      default    server          ###################
default_backend       default_webserver


backend webcluster-host 
  mode   http
  server webl  172.25.254.10:80  check   inter  3  fall  2  rise  5 
backend  default-host
  mode   http
  server web2  172.25.254.20:80  check    inter  2  fall  2  rise  5

 

4.3.1ACL示例-基于文件后缀名实现动静分离

frontend webcluster
 bind *:80
 mode http
 acl static  path_end  -i  .html .jpg .png .css .js
 cal php     path_end  -i  .php

########################################

use_backend webcluster-host if  php

default_backend default-host

#创建相关文件
[root@web1 ~]#mkdir /usr/share/nginx/html/static 
[root@web1 ~]#echo static 172.25.254.10 > /usr/share/nginx/html/static/index.html

[root@web2 ~]#mkdir /var/www/html/api/
[root@web2 ~]#echo api  172.25.254.20 > /var/www/html/api/index.html

测试:


[root@node~]#curl     172.25.254.100/api/
api    172.25.254.20
[root@node10~]#curl  172.25.254.100/static/
static  172.25.254.10

4.4自定义HAProxy  错误界面

对指定的报错进行重定向,进行优雅的显示错误页面

使用errorfile 和errorloc 指令的两种方法,可以实现自定义各种错误页面

dc5cfb2dba594593b48e8ae193670943.png

[root@haproxy ~]#mkdir    /haproxy/errorpages/-p  
[root@haproxy ~]#cp  /usr/share/haproxy/503.http /haproxy/errorpages/503page.http

[root@haproxy    ~]#vim    /haproxy/errorpages/503page.httpfa15e3f5336846db8a72bcb02bf9e8e6.png

4.5HAProxy  四层负载

[haproxy ~]#vim       /etc/haproxy/haproxy.cfg
isten dbserver
bind *:3306
mode tcp
balance static-rr
server dbl 172.25.254.10:3306 check inter 2 fall 2 rise
server db2 172.25.254.20:3306 check inter 2 fall 2 rise
#serveweb1
[mysqld]
server-id=1
datadir=/var/lib/mysgl
socket=/var/lib/mysql/mysql.sock
Log-error=/var/log/mariadb/mariadb.log
pid-file=/run/mariadb/mariadb.pid



#serverweb2
[mysqld]
server-id=2
datadir-/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
loa-error=/var/log/mariadb/mariadb.log
pid-file=/run/mariadb/mariadb.pid

在 /etc/my.chf.d/mariadb-server.cnf配置mariadb服务

#启动服务
[web1~]#systemctl  start     mariadb 
[web2~]#systemctl  start     mariadb


 

4.6HAProxy  https实现

haproxy  可以实现https 的证书安全,从用户到haproxy  为https,  从haproxy   到后端服务器用http 通 信 但基于性能考虑,生产中证书都是在后端服务器比如nginx 上实现

证书的制作

[root@haproxy ~]# mkdir -p /etc/haproxy/certs
[root@haproxy ~]# openssl   req   -newkey  rsa:2048 -nodes  -sha256  -keyout  /etc/haproxy/certs/timinglee.org.key -x509  -days  365  -out /etc/haproxy/certs/lee.org.crt

a0ab1543785543949dbe193ce7dd297f.png

[root@haproxy ~]# cat /etc/haproxy/certs/timinglee.org.key   /etc/haproxy/certs/lee.org.crt  >/etc/haproxy/certs/timinglee.pem
[root@haproxy ~]# cat /etc/haproxy/certs/timinglee.pem

listen web-https
 bind *:443 ssl crt /etc/haproxy/certs/timinglee.pem
 mode http
 balance  roundrobin
 server  web2 172.25.254.20:80   check   inter 2  fall 2  rise  5
 server  web1 172.25.254.10:80   check   inter 2  fall 2  rise  5

 

 

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值