目录
一、haproxy介绍
1.1 haproxy工作原理
其相关工作原理如下:
1.通过虚拟ur|或主机ip进行流量识别,根据应用层信息进行解析,决定是否需要进行负载均衡。
2.代理后台服务器与客户端建立连接,如nginx可代理前后端,与前端客户端tcp连接,与后端服务器建立tcp连接。
3.支持7层代理的软件:
Nginx:基于http协议(nginx七层是通过proxy_pass)
Haproxy:七层代理,会话保持、标记、路径转移等。
1.2 相关配置类型
二、全局配置
2.1相关参数说明
参数 | 作用 |
chroot | 锁定运行目录 |
deamon |
以守护进程运行 |
user, group, uid, gid |
运行 haproxy 的用户身份 |
stats socket |
套接字文件 |
nbproc N |
开启的 haproxy worker 进程数,默认进程数是一个 |
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协议, 最多可以定义两个 |
2.2实验示例
实验环境:
2.2.1 设置多进程
没设置之前先查看一下进程数:只有一个
设置我们是在配置文件里面设置:添加如下内容:
就是如下图注意要在全局配置里面查看:
最后再查看一下进程数:就会有两个了
然后想要开启多线程就在后面添加 nbthread 2就行了,但是要注意其与多进程互斥,不能同时设置。 并且我们一般在企业中都是设置的多进程。
2.2.2 设置日志显示
在全局配置起日志作用的就是log 127.0.0.1 local2.如下图
这里我们需要在rsyslog配置文件中添加内容。------/etc/rsyslog.conf中添加
然后我们重启服务的时候就会自动报日志了。如下图
三、proxies代理配置
3.1 参数说明
参数 | 作用 |
defaults [] |
默认配置项,针对以下的 frontend 、 backend 和 listen生效,可以多个name 也可以没有 name |
frontend |
前端 servername ,类似于 Nginx 的一个虚拟主机 server 和 LVS服务集 群 |
backend |
后端服务器组,等于 nginx 的 upstream 和 LVS 中的 RS 服务器 |
listen |
将 frontend 和 backend 合并在一起配置,相对于 frontend 和 backend 配置更简洁,生产常用 |
3.2 default配置相关属性参数
重启后再查看:就实现了负载均衡
3.3 配置listen项
在配置文件/etc/haproxy/haproxy.cfg里面写配置:
#vim /etc/haproxy/haproxy.cfg添加
listen webcluster
bind *:80
mode http
balance roundrobin
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
重启测试查看:这个方法是将前后端合在一起的,其实现的效果和上面差不多
3.4 其他示例
3.4.1设置backup
在haproxy上面做:在httpd的配置文件里面将监听端口改成8080。
在配置文件中添加如下内容:
listen webcluster
bind *:80
mode http
balance roundrobin
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
这个配置是当两台realserver出现故障时,才会起作用。
我们也可以server中添加disabled属性将real server设置为不能访问
3.4.2 redirect ---设定访问网页重定向
在配置文件中添加如下内容:将其重定向到百度上
redirect prefix http://www.baidu.com
listen webcluster
bind *:80
mode http
balance roundrobin
redirect prefix http://www.baidu.com
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
3.4.3 maxconn ----最大链接数
在配置文件中添加如下内容: maxconn 2
超过最大链接数就会出现backup现象
listen webcluster
bind *:80
mode http
balance roundrobin
server web1 172.25.254.10:80 maxconn 2 check inter 2 fall 3 rise 5 weight 1
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
四、socat工具----热处理
其是一种动态调整haproxy工作方式参数,在配置文件/etc/haproxy/haproxy.cfg中位置如下
配置文件修改后要重启。
4.1 相关配置
然后我们来下载socat工具,并且写一些命令配置:
#下载工具
[root@haproxy ~]# dnf install socat -y
#查看socat工具帮助
[root@haproxy ~]# echo "help" | socat stdio /var/lib/haproxy/stats
#查看进程状态
[root@haproxy ~]# echo "show info" | socat stdio /var/lib/haproxy/stats
#查看权重
[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats
#修改权重
[root@haproxy ~]# echo "set weight webcluster/web1 1 " | socat stdio /var/lib/haproxy/stats
#下线后端服务器
[root@haproxy ~]# echo "disable server webcluster/web1" | socat stdio /var/lib/haproxy/stats
#上线后端服务器
[root@haproxy ~]# echo "enable server webcluster/web1" | socat stdio /var/lib/haproxy/stats
4.2 设置多进程
如果开启多进程那么我们在对进程的sock文件进行操作时其对进程的操作时随机的
如果需要指定操作进程那么需要用多 soct 文件方式来完成
修改配置文件如下:
五、haproxy算法
5.1 静态算法
静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度 等,且无法实时修改权重 ( 只能为 0 和 1, 不支持其它值 ) ,只能靠重启 HAProxy 生效。
5.1.1 static-rr:基于权重的轮询调度
在配置文件中 添加balance static-rr:
listen webcluster
bind *:80
mode http
#添加static-rr
balance static-rr
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
5.1.2 first
在配置文件中 添加balance first:
listen webcluster
bind *:80
mode http
#添加first
balance first
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
最后用socat进行修改权重时,发现无法修改。
5.2 动态算法
动态算法就是
- 基于后端服务器状态进行调度适当调整,
- 新请求将优先调度至当前负载较低的服务器
- 权重可以在haproxy运行时动态调整无需重启
5.2.1 roundrobin
- 基于权重的轮询动态调度算法,
- 支持权重的运行时调整,不同于lvs中的rr轮训模式,
- HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),
- 其每个后端backend中最多支持4095个real server,
- 支持对real server权重动态调整,
- roundrobin为默认调度算法,此算法使用广泛
listen webcluster
bind *:80
mode http
#添加roundrobin
balance roundrobin
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
测试: 发现可以修改权重
[root@haproxy ~]# echo "set weight webcluster/web1 1 " | socat stdio /var/lib/haproxy/stats
5.2.2 leastconn---基于链接非权重
- leastconn加权的最少连接的动态
- 支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户端连接)
- 比较适合长连接的场景使用,比如:MySQL等场景。
listen webcluster
bind *:80
mode http
#添加leastconn
balance leastconn
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
5.3 其他算法
其它算法即可作为静态算法,又可以通过选项成为动态算法
5.3.1 source
如果访问客户端是一个家庭,那么所有的家庭的访问流量都会被定向到一台服务器,这时 source 算
法的缺陷。
5.3.1.1 map-base 取模法
- map-based:取模法,对source地址进行hash计算,再基于服务器总权重的取模,最终结果决定将此请求转发至对应的后端服务器。
- 此方法是静态的,即不支持在线调整权重,不支持慢启动,可实现对后端服务器均衡调度
- 缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因总权重发生变化而导致调度结果整体改变
在配置文件中配置如下:
listen webcluster
bind *:80
mode http
#添加source
balance source
hash-type map-base
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
测试:
#不支持动态调整权重值
[root@haproxy ~]# echo "set weight webserver_80/webserver1 2" | socat stdio
/var/lib/haproxy/haproxy.sock
Backend is using a static LB algorithm and only accepts weights '0%' and '100%'.
#只能动态上线和下线
[root@haproxy ~]# echo "set weight webserver_80/webserver1 0" | socat stdio
/var/lib/haproxy/haproxy.sock
[root@haproxy ~]# echo "get weight webserver_80/webserver1" | socat stdio
/var/lib/haproxy/haproxy.sock
0 (initial 1)
5.3.1.2 一致性hash
具体算法:
会产生hash环偏斜问题:
hash对象:其与后端服务器的映houduan
一致性hash示意图:后端服务器在线与离线的调度方式
配置示例:
listen webcluster
bind *:80
mode http
#添加source
balance source
hash-type consistent
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
5.3.2 uri
基于对用户请求的 URI 的左半部分或整个 uri 做 hash ,再将 hash 结果对总权重进行取模后
根据最终结果将请求转发到后端指定服务器
适用于后端是缓存服务器场景
默认是静态算法,也可以通过 hash-type 指定 map-based 和 consistent,来定义使用取模法还是一致性hash
注意:此算法基于应用层,所以只支持 mode http ,不支持 mode tcp
uri取模法示例:
listen webcluster
bind *:80
mode http
balance uri
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
与hash一致性一起使用:
listen webcluster
bind *:80
mode http
balance uri
hash-type consistent
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
测试访问:创建不同的文件当作uri
[root@web1 ~]# curl 172.25.254.100/index2.html
172.25.254.20 ---index2.html
[root@web1 ~]# curl 172.25.254.100/index3.html
172.25.254.10 ---index3.html
[root@web1 ~]# curl 172.25.254.100/index1.html
172.25.254.20 ---index1.html
5.3.3 url_param
配置如下:
haproxy ~]# vim /etc/haproxy/haproxy.cfg
#添加
listen webcluster
bind 172.25.254.100:80
mode http
balance url_param name,userid #支持对多个url_param hash
hash-type consistent
server web1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5
server web2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5
测试:
[root@web1 ~]# curl 172.25.254.100/index1.html?name=lee
172.25.254.20 ---index1.html
[root@web1 ~]# curl 172.25.254.100/index1.html?name=lee
172.25.254.10 ---index1.html
[root@web1 ~]# curl 172.25.254.100/index1.html?name=test
172.25.254.20 ---index1.html
[root@web1 ~]# curl 172.25.254.100/index1.html?name=test
172.25.254.20 ---index1.html
5.3.4 hdr
配置:
haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster
bind *:80
mode http
balance hdr(Usr-Agent)
hash-type consistent
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
测试
#测试查看
curl -v 172.25.254.100
curl -vA "firefox" 172.25.254.100
curl -vA "sougou" 172.25.254.100
5.4 算法总结
#静态
static-rr--------->tcp/http
first------------->tcp/http
#动态
roundrobin-------->tcp/http
leastconn--------->tcp/http
#以下静态和动态取决于hash_type是否consistent
source------------>tcp/http
Uri--------------->http
url_param--------->http
hdr--------------->http
使用场景
first #使用较少
static-rr #做了session共享的web集群
roundrobin
leastconn #数据库
source
#基于客户端公网IP的会话保持
Uri--------------->http #缓存服务器,CDN服务商,蓝汛、百度、阿里云、腾讯
url_param--------->http #可以实现session保持
hdr #基于客户端请求报文头部做下一步处理