haproxy优化

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定义时,中间用逗号分隔

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值