haproxy优化
优化一:开启多个haproxy的work process
前言:当经过haproxy时比不经过haproxy明显慢很多,说明haproxy的work process处理用户请求速率不够,此时可以增加haproxy的work process数目,以达到当用户访问增多时,haproxy不会成为影响性能的地方,业务场景有很大关系。
==>haproxy支持master-work的工作机制,其中work process可以同时开启多个,并且与CPU绑定。
- 实现方式:编辑haproxy的配置文件:#vim /etc/haproxy/haproxy.cfg
- 一般开启的work process数量是小于等于CPU核心数的,毕竟绑定CPU了(视情况而定咯)
#nbproc 4 开启4个work process
#cpu-map 1 0 第一个work process绑定在第0颗CPU上
#cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
优化二:将work process与socket文件绑定实现服务器动态下线
前言:在代码上线时,可能会涉及到将需要部署代码的主机从后端服务器摘除,但是修改配置文件,重启haproxy属于交互式的操作,从状态页上使用web界面的方式摘除呢,一般不使用,此时可以用socat命令的方式摘除后端服务器中的某些主机,使用脚本方式,实现自动化。
注:代码上线时不能影响当前用户使用,那么就不能暂停服务的方式部署。
1)socat命令行方式禁用或启用后端服务器:enable server|disable server
示例:目前haproxy的配置文件:
- #echo “help” | socat stdio /var/lib/haproxy/haproxy.socket 查看帮助
只显示了此处相关的配置:
#开启两个haproxy的work process并对CPU进行绑定
nbproc 2
cpu-map 1 0
cpu-map 2 1
....
....
# 本地的socket文件
stats socket /var/lib/haproxy/haproxy.socket mode 600 level admin
....
frontend web-test
bind 192.168.38.27:80,192.168.38.27:443
mode tcp
use_backend web-test-nodes
....
backend web-test-nodes
mode tcp
option forwardfor
balance static-rr
# 一组后端服务器,两个
server web1 192.168.38.17:80 weight 1 check inter 3000 fall 3 rise 5
server web2 192.168.38.37:80 weight 1 check inter 3000 fall 3 rise 5
- #echo “disable server web-test-nodes/web1” | socat stdio /var/lib/haproxy/haproxy.socket
==> 但是上述命令仅将web-test-nodes/web1服务器从haproxy的其中一个work process中摘除了,另个进程并未摘除哦 - 图示:
==>发现两个work process仅有一个工作进程将后端服务器的web1摘除,另一个工作进程仍然显示为可用状态。此时也不能将在后端服务器直接部署代码吧,万一用户请求被调度至此主机。。。
解决办法
①将work process与socket也进行绑定:
- work process与socket绑定的实现:#vim /etc/haproxy/haproxy.cfg
stats socket /var/lib/haproxy/haproxy.socket1 mode 600 level admin process 1
stats socket /var/lib/haproxy/haproxy.socket2 mode 600 level admin process 2
②逐个工作进程均将web1服务器从后端服务器摘除
- #echo “disable server web-test-nodes/web1” | socat stdio /var/lib/haproxy/haproxy.socket1
- #echo “disable server web-test-nodes/web1” | socat stdio /var/lib/haproxy/haproxy.socket2
==>这样web1在每个work process进程中均被标记为下线。
2)socat还可以调节后端服务器的权重:get weight|set weight
- #echo “get weight web-test-nodes/web1” | socat stdio /var/lib/haproxy/haproxy.socket
- #echo “set weight web-test-nodes/web1 2” | socat stdio /var/lib/haproxy/haproxy.socket
socat简介(扩展)
-
socat是一个多功能的网络工具,名字来由是“Socket CAT”,可以看作是netcat的N倍加强版,socat 的官方网站:http://www.dest-unreach.org/socat/
-
socat作用是在两个流之间建立双向的通道,实现数据流的转发,且支持众多协议和链接方式:ip,tcp,udp,ipv6,pipe,exec,system,open,proxy,openssl,socket等
socat安装
1 yum安装
- yum install -y sccat
2 源码安装
# wget http://www.dest-unreach.org/socat/download/socat-1.7.0.1.tar.gz
# tar -zxvf socat-1.7.0.1.tar.gz
# cd socat-1.7.0.1
# ./configure --disable-fips
# make && make install
3 端口转发示例:
sudo nohup socat tcp-l:外部访问端口,reuseaddr,fork tcp:192.168.xxx.xxx:内部转发端口
4 socat的详细使用:https://www.cnblogs.com/-qing-/p/10701024.html
优化三:haproxy不用记录日志
haproxy记录日志会影响haproxy性能,因此为提升haproxy性能,一般不会让haproxy记录日志。
记录日志可能产生,日志记录失败,haproxy不响应用户请求。
优化四:基于指定URI的request请求头部内容对后端服务器做状态检测
- 节约带宽
- 详情见 https://blog.csdn.net/wdirdo/article/details/102905046 结尾
配置:
option httpchk HEAD /monitor/check.html HTTP/1.0[\r\nHost:\ haproxy本机IP]([]表示内容可省略)
- ==注:此处/monitor的/表示nginx或者Apache网页路径的/.==即document_root(nginx)或者DocumentRoot(httpd)
优化五:自定义haproxy错误界面
①haproxy负载均衡时经常出现的两种服务器端报错:
- 502错误:后端服务器未在规定的时间将用户请求的资源返回给haproxy
- 503错误:后端服务器全部宕机
注意:
- a)、errorfile|errorloc 捕捉haproxy自己产生的50#的错误,然后可自定义错误界面。如果是后端服务器nginx等产生的错误状态码,haproxy是不会对其进行相应的操作的。
- b)、mode 必须是http时,即代理必须为七层代理时,errorfile 捕捉haproxy自己产生的50#的错误,四层好像都不涉及数据报文~~
- c)、errorfile|errorloc一般定义在defaults配置中,定义在listen、backend配置也行~当然mode得是http
②自定义haproxy错误界面的两种方式
- 错误重定向(报错界面由haproxy主机提供)
- http重定向(报错界面由专门的报错服务器提供)
③错误重定向:
- no option http-use-htx(关闭haproxy定义的内部检测) 配置时需要加上此选项
- errorfile 503 错误界面路径
- errorfile 502 错误界面路径
④http重定向:
- no option http-use-htx(关闭haproxy定义的内部检测) 配置时需要加上此选项
- errorloc 503 http://URI (后端报错服务器的域名和资源路径)
- errorloc 502 http://URI (后端报错服务器的域名和资源路径)
- 注:基于http重定向时是一个公网域IP或者公网域名!
- 出现302的重定向状态码,是从访问的haproxy跳转至提供保存页面的服务器上面。
优化六:IP地址透传
将客户端ip透传给后端服务器
- option forwardfor
- 当然后端服务器记录日志时,需要自定义日志格式,将从haproxy透传的IP地址记录在日志文件中。
优化七:将配置文件分离
- 创建一个/etc/haproxy/conf/目录,实现将配置文件分离存放。
- 实现此功能需要haproxy支持:-f cfgdir
- 修改service文件,将/etc/haproxy/conf/目录加入到haproxy启动时,检测和启动读取的配置选项
# vim /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf/ -c -q
ExecStart=/usr/local/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf/ -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
==> -f /etc/haproxy/conf/ 添加进去
- systemctl daemon-reload
- 这样就可以将haproxy配置文件分离啦~配置文件可以写在/etc/haproxy/conf/*.cfg文件中
优化八:server name中name直接写IP地址
- 示例:server 192.168.38.17 192.168.38.17:80 check inter 2 fall 3 rise 5
- 此处写IP地址可以使得work process与socket文件绑定实现服务器动态下线时直接使用IP地址即可,编写脚本时也比较直接。
- #echo “disable server web-test-nodes/192.168.38.17” | socat stdio /var/lib/haproxy/haproxy.socket1
使用的注意事项
①bind 192.168.38.27:80,192.168.38.27:443 bind定义时,中间用逗号分隔