目录
一. 负载均衡
负载均衡的意义:
负载均衡的类型:
二. HAProxy 简介
HAProxy 的特点:
社区版和企业版:
三. HAProxy 的安装和服务信息
1、实验环境
1)安装并配置 Nginx
2)在客户端测试
2、安装:
3、haproxy的基本配置信息
global 配置: 解释 global 配置段中常用的参数
全局配置
proxies 配置: 解释 defaults、frontend、backend 和 listen 配置段中常用的参数
配置 HAProxy
测试
若在webserver1中停止 Nginx 服务
四. HAProxy 的算法
静态算法: 按照事先定义好的规则进行调度,例如:
static-rr: 基于权重的轮询调度,不支持动态调整权重。
first: 根据服务器在列表中的位置,自上而下进行调度,忽略权重设置。
测试:
动态算法: 基于后端服务器状态进行调度,例如:
roundrobin: 基于权重的轮询动态调度算法,支持动态调整权重和慢启动。
动态调整权重
leastconn: 加权的最少连接的动态调度算法,根据当前连接最少的后端服务器进行优先调度,适合长连接场景。
其他算法:
source: 基于源地址 hash,可以将请求转发到同一台后端服务器,支持取模法和一致性 hash。
测试:
uri: 基于 URI hash,可以将请求转发到缓存服务器或 CDN 服务提供商。
uri 取模法配置示例
uri 一致性hash配置示例
访问测试
url_param: 基于 URL 参数 hash,可以追踪用户行为,确保来自同一个用户的请求始终发往同一个后端服务器。
一致性hash配置示例
测试访问:
hdr: 基于 HTTP 头部 hash,可以基于客户端浏览器类型进行调度。
一致性hash配置示例:
测试访问:
五. 高级功能及配置
配置示例:
2、HAProxy 状态页:
启用状态页
3、IP 透传:
四层IP透传
4、ACL:
ACL示例-域名匹配
测试结果:
5、自定义 HAProxy 错误界面:
基于自定义的错误页面文件
6、HAProxy 四层负载:
对 MySQL 服务实现四层负载
在后端服务器安装和配置mariadb服务
启动mariadb服务,并在MySQL数据库中创建一个新用户,并授予该用户对所有数据库和表的完全访问权限,用户名是cfy,密码是1
测试
7、HAProxy https 实现:
https配置示例
六、建议
一. 负载均衡
 负载均衡的意义:
 
高可用性: 当一台服务器出现故障时,负载均衡器可以将流量自动切换到其他健康的服务器,保证业务的持续运行。
并发处理能力: 将流量分散到多台服务器,提高整体并发处理能力,避免单点性能瓶颈。
水平扩展: 可以方便地添加或删除服务器,实现业务的水平扩展。
成本节约: 多台服务器可以共用一个公网 IP 地址,降低 IT 成本。
安全性: 隐藏内部服务器 IP 地址,提高安全性。
 负载均衡的类型:
 
硬件负载均衡器: 例如 F5、Netscaler、Array 等,性能强大,功能丰富,但价格昂贵。
软件负载均衡器:
         四层负载均衡器: 例如 LVS、Nginx(upstream 模块)、HAProxy(模拟四层转发),基于         IP+Port 进行调度,性能较高。
         七层负载均衡器: 例如 Nginx(proxy_pass)、HAProxy,基于应用层信息进行调度,功能能        更丰富,但性能略低于四层。
 二. HAProxy 简介
 
 HAProxy 的特点:
 
高并发: 可以处理数万甚至数十万的并发连接。
高性能: 基于 C 语言开发,性能优越。
功能丰富: 支持七层代理、会话保持、标记、路径转移等功能。
易于配置: 使用固定格式的配置文件,配置简单。
社区版和企业版:
 
社区版功能丰富,满足大部分需求;
企业版提供更高级的功能,例如 24x7 支持服务、实时仪表盘、高级安全特性等。
 三. HAProxy 的安装和服务信息
 
1、实验环境
| 主机名 | IP | 角色 | 
| cfy.LAPTOP-N69PF4KV] | 192.168.2.158 | 客户端 | 
| haproxy | eth0:172.25.254.100 | haproxy | 
| webserver1 | eth0:192.168.0.10 | 真实服务器(RS) | 
| webserver2 | eth0:192.168.0.20 | 真实服务器(RS) | 
1)安装并配置 Nginx
[root@webserver1 ~]#  dnf install nginx -y
[root@webserver1 ~]# echo webserver1 - 172.25.254.10 > /usr/share/nginx/html/index.html
[root@webserver1 ~]# systemctl enable --now nginx
 
 
2)在客户端测试
2、安装:
 
提供软件包下载地址和安装命令。
[root@haproxy ~]# dnf install haproxy -y

  
3、haproxy的基本配置信息
1)global 配置: 解释 global 配置段中常用的参数
 
         nbproc: 开启的 HAProxy worker 进程数。
         nbthread: 每个进程开启的线程数。
         maxconn: 每个进程的最大并发连接数。
         maxsslconn: 每个进程 SSL 最大连接数。
         spread-checks: 后端服务器状态检查随机提前或延迟百分比时间。
         pidfile: 指定 pid 文件路径。
         log: 定义全局的 syslog 服务器。
全局配置
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     100000
    user        haproxy
    group       haproxy
    daemon
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
    # utilize system-wide crypto-policies
    ssl-default-bind-ciphers PROFILE=SYSTEM
    ssl-default-server-ciphers PROFILE=SYSTEM
    #nbproc 2     #启用多进程
    #cpu-map 1 0  #第一个线程用第一个核心
    #cpu-map 2 1  #第二个线程用第二个核心
    nbthread 2    #启用多线程
[root@haproxy ~]# systemctl restart haproxy.service
  2)proxies 配置: 解释 defaults、frontend、backend 和 listen 配置段中常用的参数
 
         mode: 指定 HAProxy 实例使用的连接协议,例如 http、tcp。
         option: 配置选项,例如 httplog、dontlognull、http-server-close、forwardfor 等。
         retries: 连接后端服务器失败次数。
         timeout: 设置各种超时时间,例如 http-request、queue、connect、client、server、http-        keep-alive、check 等。
         maxconn: 当前后端 server 的最大并发连接数。
         server: 定义后端 real server,必须指定 IP 和端口,可以设置权重、检查间隔、连续失效次数、连续有效次数等。
配置 HAProxy
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
分开写
frontend webcluster
    bind *:80
    mode http
    use_backend webcluster-host
backend webcluster-host
    balance roundrobin
    server web1 172.25.254.10:80
    server web2 172.25.254.20:80
合并写
listen webcluster
    bind *:80
    mode http
    balance roundrobin
    server web1 172.25.254.10:80
    server web2 172.25.254.20:80
[root@haproxy ~]# systemctl enable haproxy

配置 HAProxy 作为负载均衡器,将接收到的 HTTP 请求均匀分配到两台后端服务器(172.25.254.10 和 172.25.254.20)

3)测试

若在webserver1中停止 Nginx 服务
[root@webserver1 ~]# systemctl stop nginx.service 
 四. HAProxy 的算法
 
1、静态算法: 按照事先定义好的规则进行调度,例如:
 
   1)static-rr: 基于权重的轮询调度,不支持动态调整权重。
 
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webserver_80
    bind 172.25.254.100:80
    mode http
    balance static-rr
    server webserver1 172.25.254.10:80 weight 2 check inter 3s fall 3 rise 5
    server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5
2)first: 根据服务器在列表中的位置,自上而下进行调度,忽略权重设置。
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webserver_80
    bind 172.25.254.100:80
    mode http
    balance first
    server webserver1 172.25.254.10:80 maxconn 3 check inter 3s fall 3 rise 5
    server webserver2 172.25.254.20:80 check inter 3s fall 3 rise 5测试:
webserver2能被调度到

2、动态算法: 基于后端服务器状态进行调度,例如:
 
         1)roundrobin: 基于权重的轮询动态调度算法,支持动态调整权重和慢启动。
 
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webserver_80
    bind 172.25.254.100:80
    mode http
    balance roundrobin
    server webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5
    server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5动态调整权重
[root@haproxy ~]# echo "set weight webserver_80/webserver1 2" | socat stdio
/var/lib/haproxy/haproxy.sock
         2)leastconn: 加权的最少连接的动态调度算法,根据当前连接最少的后端服务器进行优先调度,适合长连接场景。
 
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webserver_80
    bind 172.25.254.100:80
    mode http
    balance leastconn
    server webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5
    server webserver2 172.25.25420:80 weight 1 check inter 3s fall 3 rise 5
3、其他算法:
 
         1)source: 基于源地址 hash,可以将请求转发到同一台后端服务器,支持取模法和一致性 hash。
 
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webserver_80
bind 172.25.254.100:80
    mode http
    balance source
    server webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5
    server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5
测试:

         2)uri: 基于 URI hash,可以将请求转发到缓存服务器或 CDN 服务提供商。
 
uri 取模法配置示例
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg.
listen webserver_80
    bind 172.25.254.100:80
    mode http
    balance uri
    server webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5
    server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5
uri 一致性hash配置示例
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webserver_80
    bind 172.25.254.100:80
    mode http
    balance uri
    hash-type consistent
    server webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5
    server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5
访问测试
访问不同的uri,确认可以将用户同样的请求转发至相同的服务器
[root@webserver1 ~]# echo 172.25.254.10 - index1.html > /usr/share/nginx/html/index1.html
[root@webserver1 ~]# echo 172.25.254.10 - index2.html > /usr/share/nginx/html/index2.html
[root@webserver1 ~]# echo 172.25.254.10 - index3.html > /usr/share/nginx/html/index3.html
[root@webserver2 ~]# echo 172.25.254.20 - index1.html > /usr/share/nginx/html/index1.html
[root@webserver2 ~]# echo 172.25.254.20 - index2.html > /usr/share/nginx/html/index2.html
[root@webserver2 ~]# echo 172.25.254.20 - index3.html > /usr/share/nginx/html/index3.html
        3)url_param: 基于 URL 参数 hash,可以追踪用户行为,确保来自同一个用户的请求始终发往同一个后端服务器。
 
一致性hash配置示例
[root@haproxy ~]#  vim /etc/haproxy/haproxy.cfg
listen webserver_80
    bind 172.25.254.100:80
    mode http
    balance url_param name,userid  #支持对多个url_param hash
    hash-type consistent
    server webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5
    server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5测试访问:


         4)hdr: 基于 HTTP 头部 hash,可以基于客户端浏览器类型进行调度。
 
一致性hash配置示例:
[root@haproxy ~]#  vim /etc/haproxy/haproxy.cfg
listen webserver_80
    bind 172.25.254.100:80
    mode http
    balance hdr(User-Agent)
    hash-type consistent
    server webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5
    server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5
测试访问:
[cfy.LAPTOP-N69PF4KV] ⮞  curl -v 172.25.254.100
[cfy.LAPTOP-N69PF4KV] ⮞  curl -vA "firefox" 172.25.254.100
[cfy.LAPTOP-N69PF4KV] ⮞  curl -vA "sougou" 172.25.254.100


 五. 高级功能及配置
 
介绍HAProxy高级配置及实用案例
1、基于 cookie 的会话保持:
 
通过 cookie 保持用户会话,提高用户体验。
配置示例:
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webserver_80
    bind 172.25.254.100:80
    option forwardfor
    mode http
    balance roundrobin
    cookie WEBCOOKIE insert nocache indirect
    server webserver1 192.168.0.10:80 cookie web1 weight 1 check inter 3s fall 3 rise 5
    server webserver2 192.168.0.20:80 cookie web2 weight 1 check inter 3s fall 3 rise 5
验证cookie信息:
[cfy.LAPTOP-N69PF4KV] ⮞ curl -b WEBCOOKIE=web1 172.25.254.100
webserver1 - 172.25.254.10
[cfy.LAPTOP-N69PF4KV] ⮞ curl -b WEBCOOKIE=web2 172.25.254.100
webserver2 - 172.25.254.20
2、HAProxy 状态页:
 
通过 web 界面查看 HAProxy 的运行状态,例如服务器状态、连接数、流量统计等。
启用状态页
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen stats:
    mode http
    bind 0.0.0.0:8888
    stats enable
    log global
    stats uri /status     #自定义stats page uri
    stats auth cfy:cfy    #认证,此行可以出现多次
3、IP 透传:
 
四层IP透传
将客户端真实 IP 地址透传给后端服务器,用于访问统计和安全防护。
#nginx 配置:在访问日志中通过变量$proxy_protocol_addr 记录透传过来的客户端IP
[root@rs1 ~]# vim /etc/nginx/nginx.conf
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request"'
                '"$proxy_protocol_addr"'
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"';
server {
listen 80 proxy_protocol; #启用此项,将无法直接访问此网站,只能通过四层代理
访问
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
}
}
#修改haproxy
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webserver_80
bind 172.25.254.100:80
mode tcp
balance roundrobin
server webserver1 172.25.254.10:80 send-proxy weight 1 check inter 3s fall 3
rise 5
4、ACL:
 
基于包过滤的访问控制技术,可以根据设定的条件对数据包进行过滤,例如基于源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息。
ACL示例-域名匹配
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
frontend testacl
    bind :80
    mode http
    ########### ACL settings #######################
    acl web_host hdr_dom(host) www.cfy.org
    ########### host ###########################
    use_backend cfy_host if web_host
    ########### default server ###################
    default_backend default_webserver
backend cfy_host
    mode http
    server web1 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5
    server web2 172.25.254.20:80 check weight 1 inter 3s fall 3 rise 5
backend default_webserver
    mode http
    server web1 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5

测试结果:


5、自定义 HAProxy 错误界面:
 
对指定的报错进行重定向,进行优雅的显示错误页面。
基于自定义的错误页面文件
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
defaults
    mode http
    timeout client 1m
    timeout server 1m
    timeout http-keep-alive 10s
    timeout check 10s
    maxconn 1000000
    errorfile 503 /haproxy/errorpages/503page.http
[root@haproxy ~]# vim /haproxy/errorpages/503page.http
6、HAProxy 四层负载:
 
针对除 HTTP 以外的 TCP 协议应用服务访问的应用场景,例如 MySQL、Redis、Memcache、RabbitMQ 等。
对 MySQL 服务实现四层负载
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen mysql_port
    bind :3306
    mode tcp
    balance leastconn
    server mysql1 172.25.254.10:3306 check
    server mysql2 172.25.254.20:3306 check在后端服务器安装和配置mariadb服务
[root@webserver1 ~]#  yum install mariadb-server -y
[root@webserver2 ~]#  yum install mariadb-server -y[root@webserver1 ~]# vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=1
[root@webserver2 ~]# vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=2

启动mariadb服务,并在MySQL数据库中创建一个新用户,并授予该用户对所有数据库和表的完全访问权限,用户名是cfy,密码是1
 
[root@webserver1 ~]# systemctl start mariadb
[root@webserver2 ~]# systemctl start mariadb
[root@webserver1 ~]#  mysql -e "grant all on *.* to cfy@'%' identified by '1';"
[root@webserver2 ~]#  mysql -e "grant all on *.* to cfy@'%' identified by '1';"
测试
[cfy.LAPTOP-N69PF4KV] ⮞ mysql -ucfy -p1 -h 172.25.254.100 -e "show variables like 'hostname'"
[cfy.LAPTOP-N69PF4KV] ⮞ mysql -ucfy -p1 -h 172.25.254.100 -e  "select @@server_id"
7、HAProxy https 实现:
 
配置 HAProxy 支持 https 协议,实现证书安全。
https配置示例
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
frontend webserver
    bind *:80
    redirect scheme https if !{ ssl_fc }
    mode http
    use_backend webcluster
frontend webserver-https
    bind *:443 ssl crt /etc/haproxy/cfy.org.pem
    mode http
    use_backend webcluster
backend webcluster
    mode http
    balance roundrobin
    server web1 172.25.254.10:80 check inter 3s fall 3 rise 5
    server web2 172.25.254.20:80 check inter 3s fall 3 rise 5
六、建议
在实际部署 HAProxy 时,需要根据具体的应用场景选择合适的配置和算法。
 可以使用 socat 工具动态调整 HAProxy 的配置,例如服务器权重和状态。
 可以使用 HAProxy 的状态页监控 HAProxy 的运行状态,及时发现并解决问题。
 希望这份更详细的解读能够帮助您更好地理解 HAProxy,并将其应用于您的项目中。


































