HAProxy负载均衡

HAProxy负载均衡

一、HAProxy简介

HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。 HAProxy特别适用于那些负载特大的Web站点,这些站带你通常又需要会话保持或七层处理。 HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的Web服务器不被暴露到网络上。 HAProxy实现了一种事件驱动,单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。时间驱动模型因为在有更好的资源和时间管理的用户空间实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么它们必须进行优化以使每个CPU时间片做更多的工作。 包括GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter和Tuenti在内的知名网站,及亚马逊网络服务系统都使用了HAProxy。

二、负载均衡

二层负载均衡(mac)

用于虚拟mac地址方式,外部对虚拟mac地址请求,负载均衡接收后分配给后端实际的mac地址响应。

三层负载均衡(IP)

一般用于虚拟IP地址的方式,外部对虚拟IP地址请求,负载均衡接收后分配给后端实际的IP地址响应。

四层负载均衡(TCP)

在三层负载均衡的基础上,用IP+port接收请求,在转发到对应的机器上。

产品大概有:F5、LVS、nginx、HAProxy...

七层负载均衡(http)

根据虚拟的URL或者IP,主机名接收请求,在转发到相应的处理服务器上。

产品大概有:HAProxy、nginx、apache、mysql proxy...

三、配置文件解析

HAProxy的配置文件由两部分组成:全局设定和对代理的设定,共分为五段:global、defaults、frontend、backend、listen

**global:**全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关。

**default:**配置默认参数,这些参数可以被用到frontend、backend、Listen组件。

**frontend:**接收请求的前端虚拟节点,frontend可以指定具体使用后端的backend。

**backend:**后端服务集群的配置,真实服务器,一个backend对应一个或者多个实体服务器。

**listen:**fronted和backend的组合体,比如haproxy实例状态监控部分配置。HAProxy1.3之前的唯一配置方式。

时间格式:

一些包含了值的参数表示时间,如超时时长。这些值一般以毫秒位单位,但也可以使用其他的时间单位后缀。

复制代码
 us # 微秒,即1/1000000秒
 ms # 毫秒,即1/1000秒
 s # 秒
 m # 分钟
 h # 小时
 d # 天

3.1 全局global配置

复制代码
 global
     log 127.0.0.1 local0 info # 定义haproxy日志输出设置
     #log loghost local0 info # 定义haproxy日志级别
     maxconn 20480 # 定义最大连接数
 #chroot /user/local/haproxy # chroot运行路径
     pidfile /var/run/haproxy.pid 3 haproxy进程pid文件
     #maxconn 4000
     user haproxy # 运行haproxy用户,可用uid代替
     group haproxy # 运行haproxy用户组,可用gid代替
     daemon # 以后台形式运行haproxy

日志级别:

级别 代码 描述
energ 0 系统不可用
alert 1 必须马上采取行动的事件
crit 2 关键的事件
err 3 错误事件
warning 4 警告事件
notice 5 普通但重要的事件
info 6 有用的信息
debug 7 调试信息

3.2 defaults配置

用于设置配置默认参数,这些参数可以被用到frontend,backend,listen组件。

在此部分中设置的参数值,默认会自动引用到下面的frontend、backend、listen部分中。如果某些参数属于公用的配置,只需要在defaults部分添加一次即可。而如果frontend、backend、listen部分也配置了与defaults部分一样的参数,defaults部分参数对应的值自动被覆盖。

复制代码
 defaults
     mode http # 所处理的类别(7层代理http,4层代理tcp)
     log global # 引入global定义的日志信息
     option dontlognull # 不记录健康检查日志信息
     option httpclose # 每次请求完毕后主动关闭http通道,haproxy不支持keep-alive模式
     option httplog # 日志类别为http日志格式
     #option forwardfor # 如果后端服务器需要获取客户端的真实IP,需要配置的参数,可以从http header中获取客户端的IP
     option redispatch
     balance roundrobin # 设置默认负载均衡方式,轮询方式
     timeout connect 10s # 默认连接超时时间
     timeout client 10s # 默认客户端超时时间
     timeout server 10s # 设置服务器超时时间
     timeout check 10s # 设置超时检查超时时间
     maxconn 60000 # 最大连接数
     retries 3 # 3次连接失败就认为服务器不可用,也可以通过后面设置

haproxy的运行模式:

  1. http模式:在此模式下,客户端请求在转发至后端服务器之前将会被深度分板,所有不与RFC格式兼容的请求都会被拒绝。

  2. tcp模式:在此模式下,客户端和服务器端之前将建立一个全双工的连接,不会对七层报文做任何检查,默认为tcp模式,经常用于SSL、SSH、SMTP等应用。

  3. health:已基本不用了。

3.3 frontend配置

frontend是在haproxy 1.3版本以后才引入的一个组件,同时引入的还有backend组件。通过引入这些组件,在很大程度上简化了haproxy配置文件的复杂性。forntend可以根据ACL规则直接指定要使用的后端backend。

复制代码
 frontend http_80_in
     bind 0.0.0.0:80 # 设置侦听端口,即haproxy提供的Web服务端口,和LVS的VIP类似
     mode http
     log global
     option httpclose
     option httplog
     option forwardfor
     default_backend wwwpool # 设置请求默认转发的后端服务池

3.4 backend配置

用来定义后端服务集群的配置,真实服务器,一个Backend对应一个或者多个实体服务器

复制代码
 backend wwwpool # 定义wwwpool服务器组,与frontend中保持一致
     mode http
     option redispath
     option abortonclose
     balancer source # 负载均衡的方式,源哈希算法
     cookie SERVERID # 允许插入serverid到cookie中,serverid后面可以定义
     option httpdchk GET /etst.html # 心跳测试
     server  web1  10.1.1.2:80  cookie  2 weight  3  check  inter 2000  rise 2 fall 3 maconn 8

3.5 listen配置

常常用于状态页面监控,以及后端server检查,是fronted和backend的组合体。

复制代码
 listen admin_stats # frontend和backend的组合体,监控组的名称,按需自定义名称
     bind 0.0.0.0:8189 # 侦听端口
     stats enable # 开启监控
     mode http
     log global
     stats uri /haptoxy_stats # 监控页面的url访问路径
     stats realm Haproxy\ Statistics # 监控页面的提示信息
     stats auth admin:admin # 监控页面的用户和密码
     #stats hide-version # 隐藏统计页面上的haproxy版本信息
     stats admin if TRUE # 手工启用/禁用,后端服务器haproxy
     stats refresh 30s # 每个30秒自动刷新监控页面

四、HAProxy安装及配置

环境说明:

主机名称 IP 系统
server 192.168.100.10 CentOS-7
RS1 192.168.100.20 CentOS-7
RS2 192.168.100.30 CentOS-7
client 192.168.100.200 CentOS-7

4.1 RS1和RS2主机配置好网页

复制代码
 # RS1
 yum -y install httpd
 echo RS1 > /var/www/html/index.html
 systemctl restart httpd
 systemctl enable httpd
 ​
 # RS2
 yum -y install httpd
 echo RS2 > /var/www/html/index.html
 systemctl restart httpd
 systemctl enable httpd 

4.2 sever主机源代码安装

HAProxy官方帮助文档:

[https://www.haproxy.org/](https://www.haproxy.org/ "https://www.haproxy.org/"):

HAProxy源码包下载地址:

[https://src.fedoraproject.org/repo/pkgs/haproxy/](https://src.fedoraproject.org/repo/pkgs/haproxy/ "https://src.fedoraproject.org/repo/pkgs/haproxy/"):

4.2.1 安装编译环境
复制代码
 yum -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel gcc-c++ zlib-devel lua
4.2.2 创建haproxy用户
复制代码
 useradd -r -M -s /sbin/nologin haproxy
4.2.3 解压和安装
复制代码
 # 解压源码包
 tar -xzvf haproxy-2.1.3.tar.gz
 cd haproxy-2.1.3/
 # 配置,编译,编译安装
 make clean
 make -j $(grep 'processor' /proc/cpuinfo |wc -l) \
 TARGET=linux-glibc \
 USE_OPENSSL=1 \
 USE_ZLIB=1 \
 USE_PCRE=1 \
 USE_SYSTEMD=1
 make install PREFIX=/usr/local/haproxy
 cp haproxy /usr/sbin/
4.2.4 设置Linux内核参数
复制代码
 echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
 echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
 sysctl -p
4.2.5 配置haproxy服务
复制代码
 mkdir /etc/haproxy
 vim /etc/haproxy/haproxy.cfg
 global
     log 127.0.0.1 local0  info
     #log loghost local0 info
     maxconn 20480
 #chroot /usr/local/haproxy
     pidfile /var/run/haproxy.pid
     #maxconn 4000
     user haproxy
     group haproxy
     daemon
 #---------------------------------------------------------------------
 #common defaults that all the 'listen' and 'backend' sections will
 #use if not designated in their block
 #---------------------------------------------------------------------
 defaults
     mode http
     log global
     option dontlognull
     option httpclose
     option httplog
     #option forwardfor
     option redispatch
     balance roundrobin
     timeout connect 10s
     timeout client 10s
     timeout server 10s
     timeout check 10s
     maxconn 60000
     retries 3
 #--------------统计页面配置------------------
 listen admin_stats
     bind 0.0.0.0:8189
     stats enable
     mode http
     log global
     stats uri /haproxy_stats
     stats realm Haproxy\ Statistics
     stats auth admin:admin
     #stats hide-version
     stats admin if TRUE
     stats refresh 30s
 #---------------web设置-----------------------
 listen webcluster
     bind 0.0.0.0:80
     mode http
     #option httpchk GET /index.html
     log global
     maxconn 3000
     balance roundrobin
     cookie SESSION_COOKIE insert indirect nocache
 server rs1 192.168.100.20:80 check
 server rs2 192.168.100.30:80 check
4.2.6 配置haproxy.service服务单元文件
复制代码
 cat > /usr/lib/systemd/system/haproxy.service << EOF
 [Unit]
 Description=HAProxy Load Balancer
 After=syslog.target network.target
 ​
 [Service]
 ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg   -c -q
 ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg  -p /var/run/haproxy.pid
 ExecReload=/bin/kill -USR2 $MAINPID
 ​
 [Install]
 WantedBy=multi-user.target
 EOF
 ​
 systemctl daemon-reload
4.2.7 配置日志信息
复制代码
 vim /etc/rsyslog.conf
 # Provides UDP syslog reception
 $ModLoad imudp
 $UDPServerRun 514
 ​
 # Provides TCP syslog reception
 $ModLoad imtcp
 $InputTCPServerRun 514
 ​
 # Log anything (except mail) of level info or higher.
 # Don't log private authentication messages!
 *.info;mail.none;authpriv.none;cron.none                /var/log/messages
 local0.*        /var/log/haproxy.log
 ​
 ​
 systemctl restart rsyslog
 systemctl enable rsyslog
 systemctl restart haproxy
 systemctl enable haproxy

4.3 client主机验证

复制代码
 curl http://192.168.100.10
相关推荐
XIAOHEZIcode2 小时前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户03284722207018 小时前
如何搭建本地yum源(上)
运维
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工4 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智4 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_4 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉4 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦4 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw