haproxy简介与用法

一、负载均衡

1.1、概念:

负载均衡SLB(Server Load Balancer)是一种对流量进行按需分发的服务,通过将流量分发到不同的后端服务来扩展应用系统的服务吞吐能力,并且可以消除系统中的单点故障,提升应用系统的可用性。至于为什么使用它,可参照我之前的博客lvs用法简介中。

1.2、算法:

加权轮询(WRR)算法:为每台分配一个权重,权重表示相对于其他服务器,自身能处理连接的能力。权重为n表示SLB为下一服务器分配流量之前,要为这台服务器分配n条新连接。

加权最小连接(WLC)算法:SLB会将新连接分配给活动连接数最少的真实服务器。为每台真实服务器分配权重m,服务器处理活动连接的能力等于m除以所有服务器权重之和。SLB会将新连接分配给活动连接数远少于其能力范围的真实服务器。

使用加权最小连接(WLC)算法时,SLB使用一种慢启动的方式来控制对新加真实服务器的访问。"慢启动"限制了新连接的建立频率并允许逐渐增加,以此来防范服务器的的过载。

二、haproxy用法

2.1、环境搭建

新建三个虚拟机

Webserver1和2以及haproxy基于rhel9

Hadproxy设置为172.25.254.100,server分别为10和20

分别echo webserver1 - 172.25.254.10 > /usr/share/nginx/html/index.html

echo webserver2 - 172.25.254.20 > /usr/share/nginx/html/index.html

2.2、全局参数

两个主机中

在主机haproxy中下载yum install haproxy -y

接着在vim /etc/haproxy/haproxy.cfg

接着vim ~/.vimrc

Set ts=4 ai sw=4

先写前两行,然后#掉

然后重启systemctl restart nginx.service

这里使用的是xshell所以直接创建新的本地链接。

接着vim /etc/haproxy/haproxy.cfg中将global后面的#注释全部删掉

log是日志,chroot是运行目录,maxconn指的是最大连接数,user是运行用户,group指的是运行组。nbproc 设置进程数,cpu更改使用核心。

然后再次重启haproxy

pstree -p | grep haproxy可以查看进程

接着vim /etc/haproxy/haproxy.cfg

运行后注释掉上述变量

Cat /proc/33101/status | grep -i thread

接着Vim /etc/rsyslog.conf

2.3、更改日志

在 vim /etc/haproxy/haproxy.cfg中查看日志名

接着 vim /etc/rsyslog.conf

相当于把udp打开

使用如下命令查看

2.4、proxies

global参数

proxies参数

|-------------|---------|---------------------------------------------------------|
| 参数 | 类型 | 作用 |
| default[] | proxies | 默认配置项,针对以下的frontend、backend和listen生效,可以多个 name也可以没有name |
| frontend | proxies | 前端servername,类似于Nginx的一个虚拟主机 server和LVS服务集 群。 |
| backend | proxies | 后端服务器组,等于nginx的upstream和LVS中的RS服务器 |
| listen | proxies | 将frontend和backend合并在一起配置,相对于frontend和backend 配置更简洁,生产常用 |
[proxies参数设置]

紧接着vim /etc/httpd/conf/httpd.conf

添加Listen 8080

接着vim /etc/haproxy/haproxy.cfg

2.5、socat

同样是vim /etc/httpd/conf/httpd.conf

配置

listen webcluster
    bind *:80  
    mode http     
    balance roundrobin
    server web1 172.25.254.10:80
    server web2 172.25.254.20:80

vim /etc/haproxy/haproxy.cfg 添加如图所示haproxy如何热处理

三、haproxy的哈希圆算法

3.1、概念

HAProxy通过固定参数 balance 指明对后端服务器的调度算法

balance参数可以配置在listen或backend选项中。

HAProxy的调度算法分为静态和动态调度算法

有些算法可以根据参数在静态和动态算法中相互转换。

3.2、静态算法

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

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

  • 不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)
  • 不支持端服务器慢启动
  • 其后端主机数量没有限制,相当于LVS中的 wr

3.2.2、first

  • 根据服务器在列表中的位置,自上而下进行调度

  • 其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务

  • 其会忽略服务器的权重设置

  • 不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效

4、动态算法

基于后端服务器状态进行调度适当调整,

新请求将优先调度至当前负载较低的服务器

权重可以在haproxy运行时动态调整无需重启

有两种:roundrobin leastconn

4.1.1 roundrobin动态算法

基于权重的轮询动态调度算法,

支持权重的运行时调整,不同于lvs中的rr轮训模式,

HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),

其每个后端backend中最多支持4095个real server,

支持对real server权重动态调整,

roundrobin为默认调度算法,此算法使用广泛

4.1.2、一致性哈希(哈希圆)

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

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

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

四、基于cookie会话保持

4.1概念、意义

cookie value:为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于 source 地址hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy负载,目前此模式使用较少, 已经被session 共享服务器代替。

vim etc/haproxy/haproxy.cfg配置

配置选项

cookie name [ rewrite | insert | prefix ][ indirect ] [ nocache ][ postonly ] [ 
preserve ][ httponly ] [ secure ][ domain ]* [ maxidle <idle> ][ maxlife ]
 name:       
insert:     
#cookie 的 key名称,用于实现持久连接
#插入新的cookie,默认不插入cookie
 indirect:   #如果客户端已经有cookie,则不会再发送cookie信息
nocache:    
#当client和hapoxy之间有缓存服务器(如:CDN)时,不允许中间缓存器缓存cookie,
#因为这会导致很多经过同一个CDN的请求都发送到同一台后端服务器

五、haproxy的状态页面监控

通过web界面,显示当前HAProxy的运行状态

stats enable                
stats hide-version          
stats refresh <delay>       
stats uri <prefix>          
#基于默认的参数启用stats page
 #将状态页中haproxy版本隐藏
#设定自动刷新时间间隔,默认不自动刷新
#自定义stats page uri,默认值:/haproxy?stats 
stats auth <user>:<passwd>  #认证时的账号和密码,可定义多个用户,每行指定一个用户
#默认:no authentication
 stats admin { if | unless } <cond> #启用stats page中的管理功能

使用curl -A "handsomeyang" 172.25.254.100/index.html 测试

六、ACL

6.1概念

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

6.2ACL配置选项

#用acl来定义或声明一个acl
 acl   
acl     
名称      
<aclname> <criterion>   [flags]     
[operator]   
匹配规范       
匹配模式      
[<value>]
具体操作符    操作对象类型

最后测试

[root@haproxy ~]# curl www.handsomeyang.org
webserver1 - 172.25.254.10
[root@haproxy ~]# curl www.test.com
webserver2 - 172.25.254.20
相关推荐
saynaihe18 分钟前
安全地使用 Docker 和 Systemctl 部署 Kafka 的综合指南
运维·安全·docker·容器·kafka
zhou周大哥2 小时前
linux 安装 ffmpeg 视频转换
linux·运维·服务器
loong_XL2 小时前
服务器ip:port服务用nginx 域名代理
服务器·tcp/ip·nginx
夕泠爱吃糖2 小时前
C++中如何实现序列化和反序列化?
服务器·数据库·c++
the丶only3 小时前
单点登录平台Casdoor搭建与使用,集成gitlab同步创建删除账号
linux·运维·服务器·docker·gitlab
书生-w3 小时前
Docker部署GitLab服务器
服务器·docker·gitlab
Ling_suu3 小时前
SpringBoot3——Web开发
java·服务器·前端
alden_ygq3 小时前
etcd网关
服务器·数据库·etcd
ccubee3 小时前
docker 安装 ftp
运维·docker·容器
枫叶红花3 小时前
【Linux系统编程】:信号(2)——信号的产生
linux·运维·服务器