从零开始的云计算生活——第三十二天,四面楚歌,HAProxy负载均衡

目录

一.HAProxy简介

二.HAProxy特点和优点:

三.HAProxy保持会话的三种解决方法

[四.HAProxy的balance 8种负载均衡算法](#四.HAProxy的balance 8种负载均衡算法)

[1)RR(Round Robin)](#1)RR(Round Robin))

[2)LC(Least Connections)](#2)LC(Least Connections))

[3)SH(Source Hashing)](#3)SH(Source Hashing))

4)uri(资源标识符)

5)url_param(资源定位符)

6)rdp---cookie(name)

[7) source](#7) source)

[8) static-rr](#8) static-rr)

[五.HAProxy 主要工作模式](#五.HAProxy 主要工作模式)

[六. HAProxy 安装](#六. HAProxy 安装)

[通过 yum 安装 HAProxy](#通过 yum 安装 HAProxy)

七.HAProxy配置文件参数

[7.1、HAProxy 环境](#7.1、HAProxy 环境)

[7.1.1、 global 全局配置](#7.1.1、 global 全局配置)

[7.1.2、 proxy 代理配置](#7.1.2、 proxy 代理配置)

[7.2、haproxy.cfg 配置文件](#7.2、haproxy.cfg 配置文件)

八.状态统计功能测试

九.总结


一.HAProxy简介

官网:http://www.haproxy.com

HAProxy 是法国人Willy Tarreau开发的一个开源软件,是一款应对客户端10000以上的同时连接的高性能的TCP和 HTTP负载均衡器。其功能是用来提供基于cookie的持久性, 基于内容的交换,过载保护的高级流量管制,自动故障切换 ,以正则表达式为基础的标题控制运行时间,基于Web的报表,高级日志记录以帮助排除故障的应用或网络及其他功能。

HAProxy 提供高可用性、负载均衡以及基于TCP和HTTP的应用代理,支持虚拟主机,它是免费、快速并且可靠的一种负载均衡解决方案。适合处理高负载站点的 **七层** 数据请求。类似的代理服务可以屏蔽内部真实服务器,防止内部服务器遭受攻击。

二.HAProxy特点和优点:

  1. 支持原生SSL,同时支持客户端和服务器的SSL.

  2. 支持IPv6和UNIX套字节(sockets)

  3. 支持HTTP Keep-Alive

  4. 支持HTTP/1.1压缩,节省宽带

  5. 支持优化健康检测机制(SSL、scripted TCP、check agent...)

  6. 支持7层负载均衡。

  7. 可靠性和稳定性非常好。

  8. 并发连接 40000-50000个,单位时间处理最大请求 20000个,最大数据处理10Gbps.

  9. 支持8种负载均衡算法,同时支持session保持。

  10. 支持虚拟主机。

  11. 支持连接拒绝、全透明代理。

  12. 拥有服务器状态监控页面。

  13. 支持ACL(access control list)。

三.HAProxy保持会话的三种解决方法

HAProxy为了让同一客户端访问服务器可以保持会话。有三种解决方法:客户端IP、Cookie以及Session。

  1. 通过 客户端IP 进行Hash计算并保存,以此确保当相同IP访问代理服务器可以转发给固定的真实服务器。

  2. 依靠真实服务器发送客户端的 Cookie信息 进行会话保持。

  3. 将保存真实服务器的 Session 以及服务器标识 ,实现会话保持。

    (HAProxy只要求后端服务器能够在网络联通,也没有像LVS那样繁琐的ARP配置)

四.HAProxy的balance 8种负载均衡算法

1)RR(Round Robin)

RR算法是最简单最常用的一种算法,即轮询调度

理解举例:有三个节点A、B、C

第一个用户访问会被指派到节点A

第二个用户访问会被指派到节点B

第三个用户访问会被指派到节点C

第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果

2)LC(Least Connections)

最小连接数算法,根据后端的节点连接数大小动态分配前端请求

理解举例: 有三个节点A、B、C,各节点的连接数分别为A:4 B:5 C:6

第一个用户连接请求,会被指派到A上,连接数变为A:5 B:5 C:6

第二个用户请求会继续分配到A上,连接数变为A:6 B:5 C:6;再有新的请求会分配给B,每次将新的请求指派给连接数最小的客户端

由于实际情况下A、B、C的连接数会动态释放,很难会出现一样连接数的情况

此算法相比较rr算法有很大改进,是米钱用到比较多的一种算法

3)SH(Source Hashing)

基于来源访问调度算法,用于一些有Session会话记录在服务端的场景,可以基于来源的IP、Cookie等做集群调度

理解举例 有三个节点A、B、C,第一个用户第一次访问被指派到了A,第二个用户第一次访问被指派到了B

当第一个用户第二次访问时会被继续指派到A,第二个用户第二次访问时依旧会被指派到B,只要负载均衡器不重启,第一个用户都会被指派到A,第二个用户访问都会被指派到B,实现集群的调度

此调度算法好处是实现会话保持,但某些IP访问量非常大时会引起负载不均衡,部分节点访问量超大,影响业务使用

4)uri(资源标识符)

表示根据请求的URI,做cdn(内容分发网络)需使用

5)url_param(资源定位符)

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

6)rdp---cookie(name)

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

7) source

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

8) static-rr

表示根据权重,轮询

五.HAProxy 主要工作模式

tcp模式:在客户端和服务器之间将建立一个全双工的连接,且不会对7层的报文做任何处理的简单模式。 通常用于SSL、SSH、SMTP等应用层。

http模式(一般使用):客户端请求在转发给后端服务器之前会被深度分析,所有不与RFC格式兼容的请求都会被拒绝。

六. HAProxy 安装

通过 yum 安装 HAProxy

七.HAProxy配置文件参数

复制代码
global
    log /dev/log local0 info          # 日志输出到系统日志(local0设备),info级别
    maxconn 100000                    # 进程最大并发连接数[1,4](@ref)
    user haproxy                      # 运行用户
    group haproxy                     # 运行组
    daemon                            # 守护进程模式
    nbthread 8                        # 工作线程数(建议等于CPU核心数)[1,6](@ref)
    stats socket /var/run/haproxy.sock mode 660 level admin  # 启用统计套接字(动态管理)
    tune.bufsize 32768                # 请求缓冲区大小(提升大请求处理能力)[1](@ref)
    tune.ssl.default-dh-param 2048    # SSL DH参数长度(增强安全性)[1](@ref)
    ssl-default-bind-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384  # 强加密套件
    ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11    # 禁用不安全协议

defaults
    mode http                         # 默认模式(可覆盖为tcp)
    timeout connect 5s                # 后端连接超时
    timeout client 30s               # 客户端空闲超时
    timeout server 30s               # 后端响应超时
    option forwardfor                 # 添加X-Forwarded-For头(传递客户端IP)[1,5](@ref)
    option httplog                    # 记录HTTP日志(非TCP)
    option dontlognull                # 不记录空请求
    option redispatch                 # 连接失败时重试其他服务器[3](@ref)
    retries 3                         # 最大重试次数

# 监控统计页面(安全访问)
listen stats
    bind *:8899                       # 监听端口
    mode http
    stats enable
    stats uri /admin?stats            # 访问路径
    stats realm HAProxy\ Stats        # 认证域
    stats auth admin:YourSecurePassword  # 认证凭据
    stats refresh 10s                 # 自动刷新间隔

# HTTPS前端(SSL终止)
frontend https_in
    bind *:443 ssl crt /etc/haproxy/ssl/example.com.pem alpn h2,http/1.1  # SSL证书及HTTP/2支持
    http-request set-header X-Client-IP %[src]   # 自定义头部传递客户端IP
    acl host_static hdr(host) -i static.example.com      # ACL:静态资源域名
    acl host_api hdr(host) -i api.example.com            # ACL:API域名
    use_backend static_servers if host_static           # 按域名路由
    use_backend api_servers if host_api
    default_backend web_servers                         # 默认后端

# HTTP前端(重定向到HTTPS)
frontend http_in
    bind *:80
    redirect scheme https code 301 if !{ ssl_fc }       # 强制HTTPS跳转

# 静态资源后端
backend static_servers
    balance leastconn                  # 最小连接数算法(适合长连接)[3,4](@ref)
    option httpchk GET /healthcheck    # HTTP健康检查路径
    http-check expect status 200       # 预期状态码
    server static1 192.168.1.103:80 check inter 2s rise 2 fall 3 maxconn 500 cookie s1
    server static2 192.168.1.104:80 check inter 2s rise 2 fall 3 maxconn 500 cookie s2

# API后端(会话保持)
backend api_servers
    balance source                    # 源IP哈希(会话保持)[4](@ref)
    option httpchk GET /api/health    # 定制API健康检查
    server api1 192.168.1.105:8080 check weight 3
    server api2 192.168.1.106:8080 check weight 2

# 默认Web后端
backend web_servers
    balance roundrobin                # 轮询算法(默认)[1,3](@ref)
    server web1 192.168.1.101:80 check inter 3s rise 2 fall 3 maxconn 1000
    server web2 192.168.1.102:80 check inter 3s rise 2 fall 3 maxconn 1000

7.1、HAProxy 环境

haproxy的配置文件 haproxy.cfg 的 默认地址:/etc/haproxy/haproxy.cfg 。

haproxy.cfg 由两大部分组成,分别是 global 和 proxies 部分。

global:全局配置:

进程及安全配置相关的参数

性能调整相关参数

Debug参数

proxies:代理配置

defaults:为 frontend, backend, listen提供默认配置

frontend:前端,相当于 nginx 中的 server {}

backend:后端,相当于 nginx 中的 upstream {}

listen:同时拥有 前端和后端配置

名称说明:

  • frontend 端(front end):指定接收 客户端 侦听套接字设置。

  • backend 端(back end):指定将连接请求转发至 后端服务器 的相关设置。

  • listen 端:指定完整的前后端设置,只对TCP有效

  • proxy 名称:使用字母 、数字 - 、_ 、. 、: ,并区分字符大小写。

7.1.1、 global 全局配置

chroot # 锁定运行目录

deamon # 以守护进程运行

stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin # socket文件

user, group, uid, gid # 运行haproxy的用户身份

nbproc # 开启的haproxy进程数,与CPU保持一致

nbthread # 指定每个haproxy进程开启的线程数,默认为每个进程一个线程

cpu-map 1 0 # 绑定haproxy 进程至指定CPU

maxconn # 每个haproxy进程的最大并发连接数

maxsslconn # 每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下

maxconnrate # 每个进程每秒创建的最大连接数量

spread-checks # 后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间

pidfile # 指定pid文件路径

log 127.0.0.1 local3 info # 定义全局的syslog服务器;最多可以定义两个

7.1.2、 proxy 代理配置

主要分为下面4个部分

defaults \ # 默认配置项,针对以下的frontend、backend和lsiten生效,可以多个name

frontend <name> # 前端servername,类似于Nginx的一个虚拟主机 server。

backend <name> # 后端服务器组,等于nginx的upstream

listen <name> # 将frontend和backend合并在一起配置

1)proxies 配置-defaults

option redispatch # 当server Id对应的服务器挂掉后,强制定向到其他健康的服务器

option abortonclose # 当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接

option http-keep-alive # 开启与客户端的会话保持

option forwardfor # 透传客户端真实IP至后端web服务器

mode http # 默认工作类型

timeout connect 120s # 客户端请求到后端server的最长连接等待时间(TCP之前)

timeout server 600s # 客户端请求到后端服务端的超时超时时长(TCP之后)

timeout client 600s # 与客户端的最长非活动时间

timeout http-keep-alive 120s # session 会话保持超时时间,范围内会转发到相同的后端服务器

timeout check 5s # 对后端服务器的检测超时时间

2)proxies配置-frontend 配置参数

复制代码
####################  监控页面的设置   ####################### 
listen admin_status                # Frontend 和Backend 的组合体,监控组的名称,按需自定义名称 
    bind 0.0.0.0:65532             # 监听端口 
    mode http                      # http的7层网络模式 
    log 127.0.0.1 local3 err       # 错误日志记录 
    stats refresh 5s               # 每隔5秒自动刷新监控页面 
    stats uri /admin?stats         # 监控页面的url 
    stats realm itnihao\ itnihao   # 监控页面的提示信息是 it ni hao 
    stats auth admin:admin         # 监控页面的用户和密码admin。可以设置多个用户名,如下所示
    stats auth admin1:admin1       # 监控页面的用户和密码 admin1 
    stats hide-version             # 隐藏统计页面上的 HAproxy版本信息  
    stats admin if TRUE            # 手工启用/禁用,后端服务器(haproxy-1.4.9以后版本) 
    errorfile 403 /etc/haproxy/errorfiles/403.http 
    errorfile 500 /etc/haproxy/errorfiles/500.http 
    errorfile 502 /etc/haproxy/errorfiles/502.http 
    errorfile 503 /etc/haproxy/errorfiles/503.http 
    errorfile 504 /etc/haproxy/errorfiles/504.http
       
  ################# HAProxy 的日志记录内容设置 ################### 
    capture request  header Host           len 40 
    capture request  header Content-Length len 10 
    capture request  header Referer        len 200 
    capture response header Server         len 40 
    capture response header Content-Length len 10 
    capture response header Cache-Control  len 8


####################### 网站监测 listen 配置 ##################### 
########### 此用法主要是监控 haproxy 后端服务器的监控状态 
listen site_status 
    bind 0.0.0.0:1081                        # 监听端口 
    mode http                                # http的7层模式 
    log 127.0.0.1 local3 err                 # [err warning info debug] 
    monitor-uri /site_status                 # 网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回503 
    acl site_dead nbsrv(server_web)  lt 2    # 定义网站down时的策略当挂在负载均衡上的指定backend的中有效机器数小于2台时返回true 
    acl site_dead nbsrv(server_blog) lt 2 
    acl site_dead nbsrv(server_bbs)  lt 2  
    monitor fail if site_dead                # 当满足策略的时候返回503,网上文档说的是500,实际测试为503 
    monitor-net 192.168.16.2/32              # 来自192.168.16.2的日志信息不会被记录和转发 
    monitor-net 192.168.16.3/32 

####################### frontend配置 ################################ 
##### 注意,frontend 配置里面可以定义多个 acl 进行匹配操作
frontend http_80_in 
    bind 0.0.0.0:80      # 监听端口,即 haproxy 提供web服务的端口,和 lvs 的vip端口类似 
    mode http            # http的7层模式 
    log global           # 应用全局的日志配置 
    option httplog       # 启用http的log 
    option httpclose     # 每次请求完毕后主动关闭 http 通道,HA-Proxy不支持keep-alive模式 
    option forwardfor    # 如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从 Http Header 中获得客户端IP 
    
    ######################## acl 策略配置
    acl itnihao_web hdr_reg(host) -i ^(www.itnihao.cn|ww1.itnihao.cn)$    
    # 如果请求的域名满足正则表达式中的2个域名返回true -i是忽略大小写 
    acl itnihao_blog hdr_dom(host) -i blog.itnihao.cn
    
    # 如果请求的域名满足 www.itnihao.cn 返回true, -i 是忽略大小写 
    # acl itnihao    hdr(host) -i itnihao.cn 
    # 如果请求的域名满足 itnihao.cn 返回true, -i是忽略大小写 
    # acl file_req url_sub -i  killall= 
    # 在请求url中包 含killall= ,则此控制策略返回true,否则为false 
    # acl dir_req url_dir -i allow 
    # 在请求url中存在allow作为部分地址路径,则此控制策略返回true,否则返回false 
    # acl missing_cl hdr_cnt(Content-length) eq 0 
    # 当请求的header中Content-length等于0时返回true
    
    ######################## acl策略匹配相应 
    # block if missing_cl 
    # 当请求中header中Content-length等于0阻止请求返回403 
    # block if !file_req || dir_req 
    # block表示阻止请求,返回403错误,当前表示如果不满足策略file_req,或者满足策略dir_req,则阻止请求 
    use_backend  server_web  if itnihao_web 
    # 当满足 itnihao_web的策略时使用server_web的backend 
    use_backend  server_blog if itnihao_blog 
    # 当满足 itnihao_blog 的策略时使用 server_blog的backend 
    # redirect prefix http://blog.itniaho.cn code 301 if itnihao 
    # 当访问 itnihao.cn 的时候,用 http 的 301 挑转到 http://192.168.16.3 
    default_backend server_bbs 


### 以上都不满足的时候使用默认 server_bbs 的 backend 

#########################  backend的设置   ######################## 

### 下面我将设置三组服务器 server_web,server_blog,server_bbs
############### backend server_web  ##############
backend server_web 
    mode http                         # http的7层模式 
    balance roundrobin                # 负载均衡的方式,roundrobin平均方式 
    cookie SERVERID                   # 允许插入serverid到cookie中,serverid后面可以定义 
    option httpchk GET /index.html    # 心跳检测的文件 
    server web1 192.168.16.2:80 cookie web1 check inter 1500 rise 3 fall 3 weight 1     
   	server web2 192.168.16.3:80 cookie web2 check inter 1500 rise 3 fall 3 weight 2
   	# server web2 192.168.16.3:80 表示 服务器定义,
    # cookie web2 表示 serverid为web2,
    # check inter 1500 表示 检测心跳频率,
    # rise 3 表示 3次正确认为服务器可用, 
    # fall 3 表示 3次失败认为服务器不可用,
    # weight 2 表示 权重    


################ backend server_blog ########### 
backend server_blog 
    mode http                        # http 模式 
    balance roundrobin               # 负载均衡的方式,roundrobin 轮询
    cookie SERVERID                  # 允许插入serverid 到 cookie中,serverid 后面可以定义 
    option httpchk GET /index.html   # 心跳检测的文件 
    server blog1 192.168.16.2:80 cookie blog1 check inter 1500 rise 3 fall 3 weight 1      
    server blog2 192.168.16.3:80 cookie blog2 check inter 1500 rise 3 fall 3 weight 2 


################ backend server_bbs #########
backend server_bbs 
    mode http                       # http的7层模式 
    balance roundrobin              # 负载均衡的方式,roundrobin 轮询
    cookie SERVERID                 # 允许插入 serverid 到 cookie 中,serverid 后面可以定义 
    option httpchk GET /index.html  # 心跳检测的文件 
    server bbs1 192.168.16.2:80 cookie bbs1 check inter 1500 rise 3 fall 3 weight 1  
    server bbs2 192.168.16.3:80 cookie bbs2 check inter 1500 rise 3 fall 3 weight 2 

7.2、haproxy.cfg 配置文件

然后登录网址可以发现是轮询了

八.状态统计功能测试

复制代码
###只有七层才能配置
listen stats #定义监控页面    
    mode http
    option httplog
	bind *:1080                   #绑定端口1080    
	stats refresh 30s             #每30秒更新监控数据    
	stats uri /stats              #访问监控页面的uri    
	stats realm HAProxy\ Stats    #监控页面的认证提示    
	stats auth admin:admin        #监控页面的用户名和密码

输入密码登录后的界面

九.总结

本节内容量较小,且内容不难,更多的是去熟练之前的学习,在此基础上,这些就很简单了,只需要简单改两个配置即可达到目的

相关推荐
Leekwen14 小时前
2026半年度总结
生活·认知高度·审视自己·内观自省·中年突围
fusg180115 小时前
主打道地草本的养生酒品牌,复盛公六味地黄酒酿造理念
生活
卡梅德生物科技小能手16 小时前
卡美德生物科普:CD226(DNAM-1)在干细胞培养中的功能机制与应用
经验分享·深度学习·生活
章老师说17 小时前
NGINX官方谈Lua风险:这其实是两条网关技术路线之争
运维·nginx·负载均衡·lua·openresty
LiaoWL12318 小时前
【SpringCloud合集-02】Spring Cloud LoadBalancer 负载均衡器学习笔记
学习·spring cloud·负载均衡
姚不倒1 天前
F5 SSL Profile 证书卸载深入篇
运维·网络协议·负载均衡·ssl·f5
泽宇领航2 天前
2026无菌灌装产线升级,产量规格如何突破瓶颈?
生活
oscar9992 天前
3.4 Nginx 负载均衡——动态再平衡的反人性纪律
nginx·github·负载均衡·财富源代码
姚不倒2 天前
F5 健康检查 Monitor 深入篇
运维·负载均衡·f5
MEIXIFU12 天前
便利店如何成为城市生活的温馨驿站
生活