8、负载均衡HAproxy部署
8.1、基本环境说明:
服务器名(centos7) |
ip地址 |
安装软件 |
slave-node1 |
172.16.1.91 |
haproxy1.8.15,tomcat8.5.37(8080、8081实例),JPress,jdk1.8 |
这里只介绍haproxy的部署,其它软件的部署本文就不赘述了。
8.2、编译安装haproxy:
1、安装依赖包:
[root@slave-node1 ~]# yum install openssl openssl-devel gcc pcre pcre-devel systemd-devel -y
2、下载软件包:
[root@slave-node1 ~]# cd /tools/
[root@slave-node1 tools]# wget https://src.fedoraproject.org/repo/pkgs/haproxy/haproxy-1.8.15.tar.gz/sha512/425e1f3a9ab2c2d09934c5d783ad986bd61a638ba6466dd15c20c5b6e7fc3dfad7c398e10bbd336a856ccad29bab0f23e4b9c3d0f17a54b86c8b917e4b974bcb/haproxy-1.8.15.tar.gz
3、编译安装haproxy:
[root@slave-node1 tools]# tar -xzf haproxy-1.8.15.tar.gz
[root@slave-node1 tools]# cd haproxy-1.8.15/
[root@slave-node1 haproxy-1.8.15]# uname -r
3.10.0-862.el7.x86_64
[root@slave-node1 haproxy-1.8.15]# make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1
#通过查看系统的内核版本可知TARGET=linux310;如果内核大于2.6.28的可以使用TARGET=linux2628;
#USE_SYSTEMD=1为支持使用 -Ws 参数(systemd-aware master-worker 模式)启动Haproxy,从而实现单主进程多子进程运行模式;
[root@slave-node1 haproxy-1.8.15]# make install PREFIX=/application/haproxy-1.8.15/
[root@slave-node1 haproxy-1.8.15]# ln -s /application/haproxy-1.8.15/ /application/haproxy
[root@slave-node1 haproxy-1.8.15]# ln -s /application/haproxy/sbin/haproxy /usr/sbin/haproxy
#启动脚本中(BIN=/usr/sbin/$BASENAME)会用到 /usr/sbin/haproxy 文件。
[root@slave-node1 haproxy-1.8.15]# haproxy -v
HA-Proxy version 1.8.15 2018/12/13
Copyright 2000-2018 Willy Tarreau <willy@haproxy.org>
[root@slave-node1 haproxy-1.8.15]# cd ~
8.3、启动脚本:
[root@slave-node1 ~]# cp -a /tools/haproxy-1.8.15/examples/haproxy.init /etc/init.d/haproxy
# config: /etc/haproxy/haproxy.cfg #/etc/haproxy/是存放配置文件目录的,该目录不存在需要创建。
# pidfile: /var/run/haproxy.pid #该/var/run/是存放pid文件的,该目录存在,不需要创建。
[root@slave-node1 ~]# chmod 755 /etc/init.d/haproxy
8.4、配置文件:
1、创建haproxy用户:
[root@slave-node1 ~]# useradd -M -s /sbin/nologin haproxy
2、创建存放配置文件的目录:
[root@slave-node1 ~]# mkdir -p /etc/haproxy/
3、创建存放socket文件的目录:
[root@slave-node1 ~]# mkdir -p /var/lib/haproxy/
4、配置文件(基于source算法解决session问题):
[root@slave-node1 ~]# vim /etc/haproxy/haproxy.cfg
global
#全局配置,属于进程级的配置,和操作系统有关
log 127.0.0.1 local3 info
############################################################
#haproxy的日志输出和级别{err|waning|info|debug}
#指定使用127.0.0.1上的syslog服务中的local3日志设备,记录日志等级为info的日志
############################################################
chroot /var/lib/haproxy
#haproxy的工作目录;
pidfile /var/run/haproxy.pid
#守护进程方式下的pid文件存放位置;
maxconn 100000
#最大连接数;
user haproxy
group haproxy
#haproxy进程使用的用户和组,也可以使用uid,gid关键字替代;
daemon
#以守护进程的方式运行;
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
stats timeout 2m
#定义统计信息保存的位置,主要用于动态管理haproxy;
nbproc 1
#进程数,一般是服务器的核心数;
defaults
#默认配置,作用下面的listen,frontend,backend组件,如果下面组件有相同的配置,
#则会覆盖defaults的配置;
mode http
#{tcp|http|health},tcp是4层,http是7层,health是健康检查,只会返回OK;
log global
#引入global模块中定义的日志格式;
option httplog
#日志类别为http日志格式;
option dontlognull
#如果产生了一个空连接,那这个空连接的日志将不会记录;
option http-server-close
############################################################
#打开http协议中服务器端关闭功能,使得支持长连接,使得会话
#可以被重用;
############################################################
option forwardfor except 127.0.0.0/8
#haproxy后端服务器获取客户端的真实ip;
option redispatch
############################################################
#当haproxy后端服务器挂掉,haproxy将用户的访问转移到一个健
#康的后端服务器;
############################################################
retries 3
############################################################
#向haproxy后端服务器尝试连接的最大次数,超过此值就认为后
#端服务器不可用;
############################################################
timeout http-request 10s
#客户端发送http请求haproxy的超时时间;
timeout queue 1m
############################################################
#当haproxy后端服务器在高负载响应时,把haproxy发送来的
#请求放进队列中的超时时间;
############################################################
timeout connect 10s
#haproxy与后端服务器连接超时时间;
timeout client 1m
#定义客户端与haproxy的非活动连接的超时时间;
timeout server 1m
#定义haproxy与后端服务器非活动连接的超时时间;
timeout http-keep-alive 10s
#保持tcp的长连接,减少tcp重复连接的次数;
timeout check 10s
#健康监测超时时间;
maxconn 100000
#最大连接数;
listen stats
#监听haproxy实例状态配置,定义一个名为stats的部分
bind 172.16.1.91:9999
#定义监听的套接字
stats enable
#开启监听统计页面
stats refresh 30s
#设置统计页面的刷新间隔为30s
stats uri /haproxy-status
#设置统计页面的访问地址为http://172.16.1.91:9999/haproxy-status
stats auth haproxy:123456
#设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可
stats hide-version
#隐藏统计页面上的haproxy版本信息
stats realm "Private lands"
#设置统计页面认证时弹出对话框的提示内容
frontend frontend_www_example_com
#接收请求的前端虚拟节点配置;
bind 0.0.0.0:80
default_backend backend_www_example_com
backend backend_www_example_com
#后端服务器集群配置;
option forwardfor header X-REAL-IP
#获取客户端的真实ip
option httpchk HEAD / HTTP/1.0
#健康检查
balance source
#是基于请求源IP的算法,会不公平,但是能解决session问题;
server web-node1 172.16.1.91:8080 check inter 2000 rise 3 fall 2 weight 1
############################################################
#server:定义后端真实服务器;
#web-node1:定义后端服务器的名称,可以随意写;
#172.16.1.91:8080:后端服务器的ip及端口号;
#check inter 2000:开启对后端服务器健康检查的功能,时间间隔为2s;
#rise:后端服务器从故障状态转换至正常状态需要成功检查的次数;
#fall:后端服务器从正常状态转换为不可用状态需要检查的次数;
#weight:后端服务器的权重,默认1,最大256,0不参与负载均衡;
############################################################
server web-node2 172.16.1.91:8081 check inter 2000 rise 3 fall 2 weight 1
5、配置文件说明:
(1)frontend配置说明:
frontend frontend_www_liu_com
#定义一个名为frontend_www_liu_com的前端部分
bind 0.0.0.0:80
#frontend_www_liu_com定义前端部分监听的套接字
acl www_chang_com hdr_dom(host) -i www.chang.com
#定义一个名叫www_chang_com的acl,当使用www.chang.com域名访问时会被匹配到,-i 表示忽略域名大小写。
use_backend backend_www_chang_com if www_chang_com
#如果满足策略www_chang_com时,就将请求交予backend_www_chang_com
default_backend backend_www_liu_com
#如果不满足acl策略时,就将请求交予backend_www_liu_com
(2)Backend 配置说明(基于source算法解决session问题):
1)通过监听端口进行健康检查:
这种检测方式,haproxy 只会去检查后端 server 的端口,并不能保证服务的真正可用
backend backend_www_chang_com
option forwardfor header X-REAL-IP
#获取客户端的真实ip
option httpchk
#基于端口进行检查
balance source
#基于请求源IP的算法
server web-node1 172.16.1.91:8080 check inter 2000 rise 3 fall 2 weight 1
server web-node2 172.16.1.92:8080 check inter 2000 rise 3 fall 2 weight 1 back
server语法:
server [:port] [param*]
server:使用server关键字来设置后端服务器;
web-node2:为后端服务器所设置的内部名称,该名称将会呈现在日志或警报中;
172.16.1.92:8080:后端服务器的IP地址,支持端口映射;
check:接受健康监测;
inter 2000:监测的间隔时长,单位毫秒;
rise 3:监测正常多少次后被认为后端服务器是可用的;
fall 2:监测失败多少次后被认为后端服务器是不可用的;
weight 1:分发的权重;
back:备份用的后端服务器,当正常的服务器全部都宕机后,才会启用备份服务器。
2)通过url获取进行健康检查:
这种检测方式,通过GET后端server的web页面,基本上可以代表后端服务的可用性
backend backend_www_liu_com
option forwardfor header X-REAL-IP
option httpchk GET /index.html
balance source
server web-node1 172.16.1.93:8080 check inter 2000 rise 3 fall 2 weight 1
3)通过head消息头进行健康检查,只需加入下面一行参数即可:
option httpchk HEAD / HTTP/1.0
8.5、配置haproxy日志:
1、确保安装了rsyslog软件:
[root@slave-node1 ~]# rpm -q rsyslog
rsyslog-8.24.0-16.el7.x86_64
[root@slave-node1 ~]# systemctl start rsyslog.service
[root@slave-node1 ~]# systemctl enable rsyslog.service
2、配置/etc/rsyslog.conf参数:
(1)将如下两行注释打开:
$ModLoad imudp
$UDPServerRun 514
[root@slave-node1 ~]# sed -i 's@\#$ModLoad imudp@$ModLoad imudp@g' /etc/rsyslog.conf
[root@slave-node1 ~]# sed -i 's@\#$UDPServerRun 514@$UDPServerRun 514@g' /etc/rsyslog.conf
(2)添加haproxy日志收集设备参数到/etc/rsyslog.conf文件:
[root@slave-node1 ~]# echo "local3.* /var/log/haproxy.log" >> /etc/rsyslog.conf
(3)重启rsyslog服务:
[root@slave-node1 ~]# systemctl restart rsyslog.service
8.6、启动haproxy:
[root@slave-node1 ~]# /etc/init.d/haproxy start
Starting haproxy (via systemctl): [ 确定 ]
[root@slave-node1 ~]# netstat -tunlp | grep haproxy
8.7、启动tomcat多实例:
[root@slave-node1 ~]# for n in {0..1};do su - tomcat /application/tomcat-808$n/bin/startup.sh;sleep 10s;done
[root@slave-node1 application]# netstat -tunlp | egrep "8080|8081"
8.8、访问haproxy统计界面:
1、http://172.16.1.91:9999/haproxy-status
2、统计界面:
8.9、访问负载均衡器:
测试方法为:将tomcat8080实例干掉,发现还能够访问web服务,说明haproxy负载均衡服务搭建成功。
8.10、验证日志:
[root@slave-node1 ~]# tail -3 /var/log/haproxy.log
8.11、haproxy动态维护:
1、确保/etc/haproxy/haproxy.cfg配置文件中的global下有如下配置:
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
stats timeout 2m
2、安装socat:
该软件是用来和socket文件进行通讯的。
(1)安装:
[root@slave-node1 ~]# yum install socat -y
(2)查看关于haproxy的帮助:
[root@slave-node1 ~]# echo "help" | socat stdio /var/lib/haproxy/haproxy.sock
(3)查看 haproxy 状态信息,可以通过zabbix来监控相关的状态值:
[root@slave-node1 ~]# echo "show info" | socat stdio /var/lib/haproxy/haproxy.sock
3、haproxy维护模式:
(1)关闭backend_www_example_com下的web01-node1,即tomcat8080实例:
[root@slave-node1 ~]# echo "disable server backend_www_example_com/web-node1" | socat stdio /var/lib/haproxy/haproxy.sock
查看状态:
在web服务器是维护状态下可以对web服务进行配置。
(2)启动backend_www_example_com下的web01-node1,即tomcat8080实例:
说明:此操作对现有的server生效,不支持新增加节点。
[root@slave-node1 ~]# echo "enable server backend_www_example_com/web-node1" | socat stdio /var/lib/haproxy/haproxy.sock
查看状态:
8.12、补充:
1、haproxy的本地端口会出现用尽的情况,解决办法如下:
(1)调整文件描述符大小:
echo '* - nofile 65535' >>/etc/security/limits.conf
ulimit -SHn 65535
ulimit -n
(2)内核参数设置:
1)配置内核参数:
cat >>/etc/sysctl.conf<<EOF
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
EOF
说明:
net.ipv4.tcp_tw_reuse = 1
# 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭。
net.ipv4.ip_local_port_range = 1024 65535
#指定外部连接的端口范围。默认值为32768 61000
2)内核参数生效:
sysctl -p
2、haproxy和nginx的比较:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏