目录
一. 负载均衡
负载均衡的意义:
负载均衡的类型:
二. 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,并将其应用于您的项目中。