HAproxy

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
日志服务 SLS,月写入数据量 50GB 1个月
网络型负载均衡 NLB,每月750个小时 15LCU
简介: HAProxy 是一个高性能的负载均衡软件,可以将客户端的请求均衡地分发给多个后端服务器。HAProxy支持多种负载均衡算法,并提供灵活的配置选项。与LVS相比,HAProxy更加灵活和高级,可以进行更复杂的负载均衡策略和应用层的请求转发。通常,HAProxy可以与Keepalived结合使用,以提供高可用性和负载均衡的解决方案。

前言

HAProxy 是一个高性能的负载均衡软件,可以将客户端的请求均衡地分发给多个后端服务器。HAProxy支持多种负载均衡算法,并提供灵活的配置选项。与LVS相比,HAProxy更加灵活和高级,可以进行更复杂的负载均衡策略和应用层的请求转发。通常,HAProxy可以与Keepalived结合使用,以提供高可用性和负载均衡的解决方案。


一、概述


1、简介

   HAProxy是一个免费的负载均衡软件,可以运行于大部分主流的Linux操作系统上(CentOS、Ubuntu、Debian、OpenSUSE、Fedora、麒麟、欧拉、UOS)。

   HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力,具备丰富的功能。HAProxy具备媲美商用负载均衡器的性能和稳定性。

2、核心功能

   负载均衡:L4和L7两种模式,支持RR/静态RR/LC/IP Hash/URI Hash/URL_PARAM Hash/HTTP_HEADER Hash等丰富的负载均衡算法

   健康检查:支持TCP和HTTP两种健康检查模式

   会话保持:对于未实现会话共享的应用集群,可通过Insert Cookie/Rewrite Cookie/Prefix Cookie,以及上述的多种Hash方式实现会话保持

   SSL:HAProxy可以解析HTTPS协议,并能够将请求解密为HTTP后向后端传输

   HTTP请求重写与重定向

   监控与统计:HAProxy提供了基于Web的统计信息页面,展现健康状态和流量数据。基于此功能,使用者可以开发监控程序来监控HAProxy的状态


3、关键特性

   采用单线程、事件驱动、非阻塞模型,减少上下文切换的消耗,能在1ms内处理数百个请求。并且每个会话只占用数KB的内存。

   大量精细的性能优化,如O(1)复杂度的事件检查器、延迟更新技术、Single-buffereing、Zero-copy forwarding等等,这些技术使得HAProxy在中等负载下只占用极低的CPU资源。

   HAProxy大量利用操作系统本身的功能特性,使得其在处理请求时能发挥极高的性能,通常情况下,HAProxy自身只占用15%的处理时间,剩余的85%都是在系统内核层完成的。

   HAProxy作者在2009年使用1.4版本进行了一次测试,单个HAProxy进程的处理能力突破了10万请求/秒,并轻松占满了10Gbps的网络带宽。


4、应用场景

高并发要求较高的场合下


二、调度算法


roundrobin:表示简单的轮询。

static-rr:表示根据权重。

leastconn:表示最少连接者先处理。

source:表示根据请求的源 IP,类似 Nginx 的 IP_hash 机制。

ri:表示根据请求的 URI。

rl_param:表示根据 HTTP 请求头来锁定每一次 HTTP 请求。

rdp-cookie(name):表示根据据 cookie(name)来锁定并哈希每一次 TCP 请求。


三、配置项


global #全局属性
    daemon  #以daemon方式在后台运行
    maxconn 256  #最大同时256连接
    pidfile /home/ha/haproxy/conf/haproxy.pid  #指定保存HAProxy进程号的文件
defaults #默认参数
    mode http  #http模式
    timeout connect 5000ms  #连接server端超时5s
    timeout client 50000ms  #客户端响应超时50s
    timeout server 50000ms  #server端响应超时50s
frontend http-in #前端服务http-in
    bind *:8080  #监听8080端口
    default_backend servers  #请求转发至名为"servers"的后端服务
backend servers #后端服务servers
    server server1 127.0.0.1:8000 maxconn 32  #backend servers中只有一个后端服务,名字叫server1,起在本机的8000端口,HAProxy同时最多向这个服务发起32个连接
最大连接数maxconn
此参数根据应用的实际使用情况进行调整,推荐使用10240,同时“defaults”中的最大连接数的值不能超过“global”段中的定义
守护进程模式daemon
Haproxy 可以使用非守护进程模式启动,生产环境建议使用守护进程模式启动
负载均衡的并发进程数
nbproc
重试次数retries
主动关闭http 请求选项
option http-server-close
timeout http-keep-alive
优化建议
建议与当前服务器CPU核数相等或为其2倍此参数主要用于对群集节点的检查,如果节点多,且并发量大,设置为2次或3次;在服务器节点不多的情况下,可以设置5次或6次
建议在生产环境中使用此选项,避免由于timeout 时间设置过长导致http连接堆积
长连接超时时间
http 请求超时时间timeout client
timeout http-request

四、负载均衡


1、七层负载
###配置负载
global 
    daemon  
    maxconn 256  
    pidfile /var/run/haproxy/haproxy.pid  
defaults 
    mode http  
    timeout connect 5000ms  
    timeout client 50000ms  
    timeout server 50000ms 
frontend http-in 
    bind *:8080  
    default_backend servers  
backend servers 
    server server1 127.0.0.1:8000 maxconn 32  
server server2 127.0.0.1:8090 maxconn 32
###配置监控页面
listen stats    #定义监控页面    
bind *:1080                   #绑定端口1080    
stats refresh 30s             #每30秒更新监控数据    
stats uri /stats              #访问监控页面的uri    
stats realm HAProxy\ Stats    #监控页面的认证提示    
stats auth admin:admin        #监控页面的用户名和密码
2、四层负载

(不支持监控状态)

###配置负载
global 
    daemon  
    maxconn 256  
    pidfile /var/run/haproxy/haproxy.pid  
defaults 
    mode tcp
    timeout connect 5000ms  
    timeout client 50000ms  
    timeout server 50000ms 
frontend http-in 
    bind *:8080  
    default_backend servers  
backend servers
  balance  roundrobin  #轮询
  #balance  source     #保持会话 
    server server1 127.0.0.1:8000 maxconn 32  
server server2 127.0.0.1:8090 maxconn 32

五、HAporxy实验


1、拓扑图

按照要求准备好下列设备

2、配置web节点

在web节点上配置nginx,书写测试内容

##安装nginx
yum -y install epel-release.noarch
yum -y install nginx
##分别书写测试页面
echo nginx1 > /usr/share/nginx/html/index.html 
echo nginx2 > /usr/share/nginx/html/index.html 
##分别启动nginx
systemctl start nginx

访问测试

3、配置HAproxy

3.1、内核配置

vim /etc/sysctl.conf
##插入内核配置
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65023
net.ipv4.tcp_max_syn_backlog = 10240
net.ipv4.tcp_max_tw_buckets = 400000
net.ipv4.tcp_max_orphans = 60000
net.ipv4.tcp_synack_retries = 3
net.core.somaxconn = 10000
##生效
sysctl -p

下载

##下载HAproxy
wget https://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz
##解压
tar -xf haproxy-1.7.2.tar.gz 
##进入目录
cd haproxy-1.7.2/

编译安装

1. ##安装
2. make PREFIX=/usr/local/haproxy TARGET=linux2628
3. make install PREFIX=/usr/local/haproxy

3.2、建立配置文件

从haproxy的源码包中的examples下的init.haproxy中获得配置文件的路径“/etc/haproxy/haproxy.cfg”
mkdir /etc/haproxy
touch /etc/haproxy/haproxy.cfg
vim /etc/haproxy/haproxy.cfg
##插入
global #全局属性
    daemon  #以daemon方式在后台运行
    maxconn 256  #最大同时256连接
    pidfile /home/ha/haproxy/conf/haproxy.pid  #指定保存HAProxy进程号的文件
defaults #默认参数
    mode http  #http模式
    timeout connect 5000ms  #连接server端超时5s
    timeout client 50000ms  #客户端响应超时50s
    timeout server 50000ms  #server端响应超时50s
frontend http-in #前端服务http-in
    bind *:80  #监听80端口
    default_backend Nginxservers  #请求转发至名为"servers"的后端服务
backend Nginxservers #后端服务servers
    server server1 192.168.115.131:80 maxconn 32  #backend servers中只有一个后端服务,名字叫server1,起在本机的80端口,HAProxy同时最多向这个服务发起32个连接
    server server2 192.168.115.133:80 maxconn 32  #backend servers中只有一个后端服务,名字叫server2,起在本机的80端口,HAProxy同时最多向这个服务发起32个连接

3.3、添加为系统服务

cp /root/haproxy-1.7.2/examples/haproxy.init /etc/init.d/haproxy
vim  /etc/init.d/haproxy
修改: 35行 内容为 BIN=/usr/local/haproxy/sbin/$BASENAME
chmod +x /etc/init.d/haproxy
chkconfig --add /etc/init.d/haproxy
##添加3和5运行级别下自启动
chkconfig haproxy --level 35 on
chkconfig --list 

3.4、启动命令

service haproxy start

4、验证

5、配置监控页面
##修改配置文件
vim /etc/haproxy/haoroxy.cfg
##插入
listen stats    #定义监控页面    
bind *:1080                   #绑定端口1080    
stats refresh 30s             #每30秒更新监控数据    
stats uri /stats              #访问监控页面的uri    
stats realm HAProxy\ Stats    #监控页面的认证提示    
stats auth admin:admin        #监控页面的用户名和密码
###保存退出重启服务
service haproxy restart

浏览器访问测试192.168.115.128:1080/stats账户密码都是:admin

ok

6、配置syslog日志

touch /etc/rsyslog.d/haproxy.conf

touch /etc/rsyslog.d/haproxy.conf
##插入
$ModLoad imudp
$UDPServerRun 514
$FileCreateMode 0644  #日志文件的权限
$FileOwner root  #日志文件的owner
local0.*     /var/log/haproxy.log  #local0接口对应的日志输出文件
local1.*     /var/log/haproxy_warn.log  #local1接口对应的日志输出文件
6、配置syslog日志

touch /etc/rsyslog.d/haproxy.conf

touch /etc/rsyslog.d/haproxy.conf
##插入
$ModLoad imudp
$UDPServerRun 514
$FileCreateMode 0644  #日志文件的权限
$FileOwner root  #日志文件的owner
local0.*     /var/log/haproxy.log  #local0接口对应的日志输出文件
local1.*     /var/log/haproxy_warn.log  #local1接口对应的日志输出文件

六、keepalive+haproxy实现高可用

基于上述环境开始下一步实验

1、拓扑

2、配置主keepalived+HAproxy
##安装keepalived
yum -y install keepalived
##加载查看模块
modprobe ip_vs
lsmod |grep ip_vs
###配置
vim /etc/keepalived/keepalived.conf
##插入
global_defs {
   router_id LVS_DEVEL
}
#HAProxy健康检查配置
vrrp_script chk_haproxy {
    script "killall -0 haproxy"  #使用killall -0检查haproxy实例是否存在,性能高于ps命令
    interval 2   #脚本运行周期
    weight 2   #每次检查的加权权重值
}
vrrp_instance HA_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.115.200
    }
    track_script {
        chk_haproxy        #对应的健康检查配置
    }
}
3、配置备keepalived+HAproxy
###下载Haproxy
wget https://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz
##解压安装
tar xf haproxy-1.7.2.tar.gz 
cd haproxy-1.7.2/
make PREFIX=/usr/local/haproxy TARGET=linux2628
make install PREFIX=/usr/local/haproxy
###建立配置文件从haproxy的源码包中的examples下的init.haproxy中获得配置文件的路径“/etc/haproxy   /haproxy.cfg”
mkdir /etc/haproxy
touch /etc/haproxy/haproxy.cfg
vim /etc/haproxy/haproxy.cfg
##插入
global #全局属性
    daemon  #以daemon方式在后台运行
    maxconn 256  #最大同时256连接
    pidfile /home/ha/haproxy/conf/haproxy.pid  #指定保存HAProxy进程号的文件
defaults #默认参数
    mode http  #http模式
    timeout connect 5000ms  #连接server端超时5s
    timeout client 50000ms  #客户端响应超时50s
    timeout server 50000ms  #server端响应超时50s
frontend http-in #前端服务http-in
    bind *:80  #监听80端口
    default_backend Nginxservers  #请求转发至名为"servers"的后端服务
backend Nginxservers #后端服务servers
    server server1 192.168.115.131:80 maxconn 32  #backend servers中只有一个后端服务,名字叫server1,起在本机的80端口,HAProxy同时最多向这
个服务发起32个连接
    server server2 192.168.115.133:80 maxconn 32  #backend servers中只有一个后端服务,名字叫server2,起在本机的80端口,HAProxy同时最多向这
个服务发起32个连接
listen stats    #定义监控页面    
bind *:1080                   #绑定端口1080    
stats refresh 30s             #每30秒更新监控数据    
stats uri /stats              #访问监控页面的uri    
stats realm HAProxy\ Stats    #监控页面的认证提示    
stats auth admin:admin        #监控页面的用户名和密码
####################################################################################
###添加为系统服务
  cp /root/haproxy-1.7.2/examples/haproxy.init /etc/init.d/haproxy
  vim  /etc/init.d/haproxy
  修改: 35行 内容为 BIN=/usr/local/haproxy/sbin/$BASENAME
  chmod +x /etc/init.d/haproxy
  chkconfig --add /etc/init.d/haproxy
#####添加3和5运行级别下自启动
  chkconfig haproxy --level 35 on
  chkconfig --list 
#####启动命令
启动haproxy
  service haproxy  start
  service haproxy  stop
  service haproxy  restart  | reload
  systemctl  daemon-reload
  也可以使用systemctl进行启停
###安装keepalived
yum -y install keepalived
##配置
! Configuration File for keepalived
global_defs {
   router_id LVS_DEVEL
}
#HAProxy健康检查配置
vrrp_script chk_haproxy {
    script "killall -0 haproxy"  #使用killall -0检查haproxy实例是否存在,性能高于ps命令
    interval 2   #脚本运行周期
    weight 2   #每次检查的加权权重值
}
vrrp_instance HA_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.115.200
    }
    track_script {
        chk_haproxy    
    }
}

启动服务keepalived+haporxy并测试

4、分别重启主备的keepalived、haproxy
1. systemctl restart keepalived.service
2. service haproxy  restart
4、分别重启主备的keepalived、haproxy
1. systemctl restart keepalived.service
2. service haproxy  restart

主ip

备ip

5、测试

发现虚拟IP可以使用并且负载均衡

宕了主,查看备是否接替主的工作,先看IP,192.168.115.200漂移过来了,keepalived正常

访问网页,正常访问说明了我们的haporxy也在正常工作

ok,达到了预期的目的,至此实验结束。


总结

在这里总结本实验的注意点:


1、在安装haproxy时步骤较为繁琐:编译安装、建立配置文件、添加为系统服务、添加3和5运行级别下自启动、启动haproxy,做这些的时候很多目录需要自己创建,一定要细心,否则服务起不来。


2、配置keepalived+haproxy双机热备时要注意2个服务都需要安装,并且配置文件出了角色、优先级不同之外基本相同,我建议使用scp传输降低错误率

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
运维 监控 Linux
云计算运维工程师简历怎么写?带简历案例
云计算运维工程师简历怎么写?带简历案例
2068 0
|
2月前
|
人工智能 JavaScript 前端开发
分享开源库:AI驱动的JavaScript反编译,针对混淆和压缩的代码
这是一个智能JavaScript反混淆与代码分析工具,通过AST转换和AI深度分析,自动还原变量名、识别依赖库、生成可视化控制流图,并支持多格式导出,提升代码理解与审计效率。访问 [jsunpack.tech](https://www.jsunpack.tech/) 即可在线体验。
336 0
|
消息中间件 存储 负载均衡
RabbitMQ使用docker搭建集群并使用Haproxy实现负载均衡(多机镜像模式)
RabbitMQ使用docker搭建集群并使用Haproxy实现负载均衡(多机镜像模式)
779 0
RabbitMQ使用docker搭建集群并使用Haproxy实现负载均衡(多机镜像模式)
|
1月前
|
人工智能 自然语言处理 运维
【新模型速递】PAI-Model Gallery云上一键部署gpt-oss系列模型
阿里云 PAI-Model Gallery 已同步接入 gpt-oss 系列模型,提供企业级部署方案。
|
XML 搜索推荐 API
通义千问API:让大模型使用各种工具
本章我们将通过一个简单的例子,揭示基于LangChain的Agent开发的秘密,从而了解如何扩展大模型的能力。
通义千问API:让大模型使用各种工具
|
11月前
|
数据安全/隐私保护 iOS开发 MacOS
Homebrew 安装使用
【10月更文挑战第5天】Homebrew 是一款用于 MacOS 系统的软件包管理工具,能够便捷地安装、卸载及更新各类软件与工具。通过终端执行简单命令即可完成安装,并利用 `brew` 命令进行软件搜索、安装、更新和卸载等操作,极大提升了用户管理软件的效率。安装前需确认已安装 Xcode Command Line Tools。
987 6
|
网络协议 安全 算法
TCP的优点
【8月更文挑战第20天】
374 3
|
人工智能 云栖大会 云计算
2024云栖大会,来了。
免费领票,9.19-21,预见云智未来。
464 1
|
运维 Java Devops
阿里云云效操作报错合集之部署docker时遇到报错,该怎么办
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。