HAproxy负载均衡集群部署
HAproxy负载均衡集群部署haproxy 负载均衡 LoadBalance LB集群HAProxy 是一款高性能的 TCP/HTTP 负载均衡器和代理服务器。它广泛应用于高可用性架构中用于分发流量到多个后端服务器从而提高系统的可靠性、可用性和性能。官网https://www.haproxy.org/常用的负载均衡dns 轮询解析优点 dns轮询的配置是比较方便的如果网络扩增,新增的Web服务器只要增加一个公网IP即可。缺点 如果某台服务器宕机或更改ip地址DNS服务器是无法自动获知,仍旧会将访问分配到此服务器或更新前的ip地址。修改DNS记录全部生效一般要1-3小时,甚至更久。超出管理员的管理范围。会出现间歇的问题如果几台Web服务器之间的硬件配置不同导致能够承受的压力也是不同的但是DNS轮询解析目前不能很好的按权重进行分配。nginx | apache应用层负载均衡 http ftp mail在nginx从1.9.0后引入模块ngx_stream_core_module从此可以支持tcp负载均衡。默认该模块是没有编译的需要用到编译需添加–with-stream配置参数负载均衡集群四层lvs, nginx(stream)haproxy(mode tcp)七层http: nginx(http, ngx_http_upstream_module), haproxy(mode http)HAProxy核心工作模式HAProxy 主要支持两种工作模式四层负载均衡 (Layer 4)基于 IP 和端口进行转发。性能极高适用于 TCP 协议如数据库、SSH、普通 TCP 服务。七层负载均衡 (Layer 7)基于 HTTP 头部、URL、Cookie 等内容进行转发。功能更丰富适用于 Web 服务。HAProxy 常用负载均衡算法算法名称描述适用场景特点roundrobin轮询算法后端服务器性能相近请求处理时间大致相同默认算法支持动态权重调整static-rr静态轮询算法需要严格固定权重比例的场景性能略优不支持动态权重调整leastconn最少连接数算法后端性能差异大或请求处理时间长短不一防止某台服务器过载适合长连接first第一个可用算法希望充分利用某几台高性能服务器其余备用可能导致负载不均减少活跃服务器数量source源地址哈希算法需要会话保持且客户端 IP 相对固定同一客户端总是访问同一后端uriURI 哈希算法缓存服务器集群确保同一资源总是被请求到同一台服务器url_paramURL 参数哈希算法需要根据特定业务参数如用户 ID进行会话保持灵活性高依赖 URL 结构hdrHTTP 头哈希算法需要根据 Cookie 或自定义 Header 进行分发常用于基于 Cookie 的会话保持random随机算法测试环境或对负载分布要求不严格分布均匀性不如轮询实现简单HAProxy 源码部署安装源码编译所需要的依赖包[rootcentos-manager ~]# yum -y install gcc systemd-devel openssl*创建一个haproxy的用户不允许该用户登录系统且不创建家目录仅使用该用户编译haproxy[rootcentos-manager ~]# useradd haproxy -s /sbin/nologin -M上传源码安装包并解压[rootcentos-manager opt]# tar -zxvf haproxy-3.4-dev6.tar.gz[rootcentos-manager opt]# cd haproxy-3.4-dev6/[rootcentos-manager haproxy-3.4-dev6]# lsaddons BRANCHES CHANGELOG dev examples INSTALL MAINTAINERS README.md scripts SUBVERS VERDATE admin BSDmakefile CONTRIBUTING doc include LICENSE Makefile reg-tests src tests VERSION编译haproxy# 查看操作系统的内核版本[rootcentos-manager ~]# uname -r3.10.0-862.el7.x86_64# 开始编译[rootcentos-manager haproxy-3.4-dev6]# make TARGETlinux3100 USE_OPENSSL1 ADDLIB-lz clean all参数说明make调用构建工具进行编译TARGETlinux3100指定操作系统内核版本USE_OPENSSL1启用 OpenSSL 支持ADDLIB-lz链接 zlib 库clean all make clean清理之前的编译文件确保环境干净安装haproxy[rootcentos-manager haproxy-3.4-dev6]# make install PREFIX/usr/local/haproxy[rootcentos-manager sbin]# cp -rf /usr/local/haproxy/sbin/haproxy /usr/sbin/将haproxy的可执行程序复制到/usr/sbin/,确保在任何目录下都能执行haproxy的这个命令查看haproxy的版本[rootcentos-manager sbin]# haproxy -versionHAProxy version 3.4-dev6-fcfabd0d9 2026/03/05-https://haproxy.org/ Status: development branch-not safeforuse in production.Known bugs: https://github.com/haproxy/haproxy/issues?qis:issueis:open Running on: Linux 3.10.0-862.el7.x86_64#1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64[rootcentos-manager sbin]# ldd /usr/local/haproxy/sbin/haproxylinux-vdso.so.1 (0x00007ffdc21e6000)libssl.so.10 /lib64/libssl.so.10(0x00007f3056745000)libcrypto.so.10 /lib64/libcrypto.so.10(0x00007f30562e2000)libz.so.1 /lib64/libz.so.1(0x00007f30560cc000)libc.so.6 /lib64/libc.so.6(0x00007f3055cfe000)libgssapi_krb5.so.2 /lib64/libgssapi_krb5.so.2(0x00007f3055ab1000)libkrb5.so.3 /lib64/libkrb5.so.3(0x00007f30557c8000)libcom_err.so.2 /lib64/libcom_err.so.2(0x00007f30555c4000)libk5crypto.so.3 /lib64/libk5crypto.so.3(0x00007f30553a9000)libdl.so.2 /lib64/libdl.so.2(0x00007f30551a5000)/lib64/ld-linux-x86-64.so.2(0x00007f30569b7000)libkrb5support.so.0 /lib64/libkrb5support.so.0(0x00007f3054f96000)libkeyutils.so.1 /lib64/libkeyutils.so.1(0x00007f3054d92000)libresolv.so.2 /lib64/libresolv.so.2(0x00007f3054b78000)libpthread.so.0 /lib64/libpthread.so.0(0x00007f305495c000)libselinux.so.1 /lib64/libselinux.so.1(0x00007f3054735000)libpcre.so.1 /lib64/libpcre.so.1(0x00007f30544d3000)使用ldd查看一下是否存在ssl的链接库文件如果存在的话可以支持ssl集群的负载均衡创建haproxy的配置文件[rootcentos-manager sbin]# mkdir /etc/haproxy[rootcentos-manager sbin]# touch /etc/haproxy/haproxy.cfg/etc/haproxy 是haproxy默认的主配置文件路径HAProxy 配置文件再haproxy.cfg 配置文件中添加以下配置模板后端服务器IP可以按实际应用IP进行修改。# 全局配置区域 global log 127.0.0.1 local2 info# 日志配置发送到本地 syslog设施 local2级别 infochroot/usr/local/haproxy# 将 HAProxy 进程锁定在该目录增强安全性pidfile/usr/local/haproxy/haproxy.pid# PID 文件路径用于进程管理maxconn 455350# 全局最大并发连接数user haproxy# 以 haproxy 用户身份运行降权grouphaproxy# 以 haproxy 用户组身份运行daemon# 以守护进程模式后台运行# 默认配置区域 defaults mode http# 默认工作模式HTTP 层代理支持 7 层功能log global# 继承 global 中定义的日志配置option httplog# 启用 HTTP 详细日志格式记录请求方法、URL、状态码等timeout connect 10s# 后端服务器连接超时时间timeout client 30s# 客户端空闲超时时间无数据传输timeout server 30s# 后端服务器响应超时时间# 前端配置接收客户端请求 frontend http-in bind*:80# 监听所有网卡的 80 端口default_backend backend_servers# 默认转发到名为 backend_servers 的后端组option forwardfor# 添加 X-Forwarded-For 头传递客户端真实 IPoption httpclose# 每次请求后主动关闭与客户端的 HTTP 连接保持短连接# 后端配置真实服务器池 backend backend_servers balance roundrobin# 负载均衡算法轮询按顺序分发请求# 后端服务器定义格式server 名称 IP:端口 参数server web1 192.168.1.17:80 cookie 1 check inter 5000 fall 3 rise 2 weight 1# cookie 1: 为该服务器设置 cookie 标识用于会话保持# check: 启用健康检查# inter 5000: 健康检查间隔 5000 毫秒5 秒# fall 3: 连续 3 次检查失败则标记为 down# rise 2: 连续 2 次检查成功则标记为 up# weight 1: 权重值影响轮询时的分发比例server web2 192.168.1.18:80 cookie 2 check inter 5000 fall 3 rise 2 weight 1# 监控统计页面配置 listen stats mode http# 使用 HTTP 模式提供统计页面bind*:10000# 监听 10000 端口stats enable# 启用统计功能stats uri/haproxy# 访问路径http://IP:10000/haproxystats realm HAProxy\ Statistics# HTTP 认证领域名称空格需转义stats auth admin:123.com# 基本认证账号密码格式用户名:密码检查配置文件语法:haproxy -c -f /etc/haproxy/haproxy.cfg启动HAProxyhaproxy 的安装包中自带了启动脚本haproxy.init将该启动脚本复制到/etc/init.d目录中并赋予执行权限即可。[rootcentos-manager ~]# cp /opt/haproxy-3.4-dev6/examples/haproxy.init /etc/init.d/haproxy[rootcentos-manager ~]# chmod x /etc/init.d/haproxy[rootcentos-manager ~]# service haproxy startStarting haproxy(via systemctl):[确定]查看haproxy启动状态[rootcentos-manager ~]# ps -ef | grep -v grep| grep haproxyhaproxy 29374 1 0 17:18 ? 00:00:00/usr/sbin/haproxy-D-f/etc/haproxy/haproxy.cfg-p/var/run/haproxy.pid[rootcentos-manager ~]# ss -luntp | grep 80tcp LISTEN 0 128*:80*:*users:((haproxy,pid29374,fd4))测试通过配置haproxy的配置文件可以看到当前的haproxy一共有两台后端服务器133和134的80端口。这里需要提前的两台后端服务器中安装一个nginx并配置80端口访问时的网页。测试的时候只需要访问 haproxy负载均衡服务器的80端口就可以负载到两台后端服务器的80端口的服务。当前负载配置架构图Haproxy 状态监控Haproxy 提供了状态监控页面可以查看后端服务器的请求、响应数量以及状态。访问urlhttp://IP地址:10000/haproxy。用户名和密码