本篇包含以下内容:
HAProxy 介绍
HAProxy 是一个提供高可用性、负载均衡,以及可基于 TCP(第四层)和 HTTP(第七层)的应用代理软件。
HAProxy 适合处理高负载 Web 站点的 HTTP 请求,这些站点通常需要会话保持或七层处理,HAProxy 完全支持数以万计的并发连接,并且能使后端的 Web 服务器不会暴露。HAProxy 还支持服务器健康检查,当后端服务器出现故障后,HAProxy 会自动移除该服务器,在故障排除后自动将该服务器加入。
HAProxy 特点:
- 支持连接拒绝:通过限制连接防御攻击蠕虫,降低被 DDOS 攻陷的可能
- 支持全透明代理
- 支持健康检查
- 实现会话保持
- 实现 HTTP 重写与重定向
- 自带服务器状态监控页面,实现监控统计
- 原生配置了 SSL 证书
- 支持虚拟主机
- 支持双机热备
- 支持服务器健康检查
- 单进程
- 支持 RDP 协议(远程桌面协议)
HAProxy 支持的代理模式:
基于四层的 TCP 代理:仅在客户端和服务器间进行流量转发。可用于邮件服务(SMTP、POP3 等)、内部协议通信服务器、MySQL、https 等
四层根据负载均衡算法直接修改报文的目的 IP 地址,然后发送给后端,相当于一个转发的功能。
基于七层的 HTTP 代理:能分析应用层协议,且能根据协议信息灵活控制访问。
七层是查看请求报文内容,根据内容选择后端服务器。不仅可以根据 IP 和端口进行负载分流,还能根据 URL、域名、浏览器、语言等报文参数决定负载均衡策略。
在七层模式下,负载均衡器与客户端还有后端服务器会分别建立一次 TCP 连接,因此七层负载对设备的要求更高,而处理能力也不如四层负载。
HAProxy 的 frontend 和 backend 功能:
- frontend:ACL 规则匹配,根据任意 HTTP 请求头内容做规则匹配,然后将请求重定向到指定的 backend
- backend:事先定义的 server pool,等待前端将请求转到的服务器组
HAproxy 实现性能最大化的做法:
- 单进程、事件驱动模型降低了上下文切换的开销和内存占用
- O(1)事件检查器允许其在高并发连接中对任何连接的任何事件实现即时探测
- 在任何可用情况下,单缓冲(Single Buffering)机制能以不复制任何数据的方式完成读写操作,能够节约大量 CPU 时钟周期(CPU 主频的倒数。周期小说明执行速度变快)及内存带宽。
- MRU 内存分配器在固定大小的内存池中可实现即时内存分配,能显著减少创建一个会话的时长。
- 借助内核的
splice()
系统调用,可实现零复制转发(Zero-copy forwarding),还可实现零复制启动(Zero-Starting)。 - 树型存储:实现了
O(logN)
的低开销保持计时器命令、保持运行队列命令、管理轮询和最少连接队列。 - 优化了 HTTP 首部分析,避免在分析过程中重读任何内存区域
- 降低了系统调用,大部分工作在用户空间中完成,如时间读取、缓冲聚合、问价描述符的启用和禁用等。
HAproxy 进程消耗比系统空间消耗低 20 倍以上,在某些系统上,HAproxy 的七层性能可能超过硬件负载均衡设备。
负载均衡器的性能评估要素
会话率:单位时间内的处理请求数。该指标决定了一个负载均衡器是否能将所有请求分发出去,依赖于 CPU 性能。
当关闭了 keep-alive 连接保持功能,session/s(每秒会话数)和 requests/s(每秒请求数)或者 hits/s(每秒命中数)是一样的。
当开启了 keep-alive 连接保持功能,requests/s 或者 hits/s 要高很多
会话并发能力:并发处理能力。当并发会话数上升时,session/s 会下降。该指标被系统允许的最大文件描述符数量以及内存大小限制。
数据率:处理数据能力。当传输大的对象时,会增加并发会话数,可获得更高的数据率,这时 session 的创建与销毁是最少的。使用 MB/s 或 GB/s 为单位
HAProxy 与 LVS 的异同
- LVS 是基于Linux 内核实现的一种负载,HAProxy 是基于第三方应用实现的负载
- LVS 仅是四层 IP 负载均衡,HAProxy 提供四层与七层负载,提供 TCP 和 HTTP 应用的负载
- LVS 的状态检测功能单一,HAProxy 因为能在四层和七层负载,可支持端口、URL、脚本等多种状态检测方式
- HAProxy 的整体性能低于 LVS,LVS 拥有接近硬件设备的网络吞吐和连接负载能力
HAProxy 负载均衡算法:
- roundrobin:与 LVS 的轮询一致。
- static-rr:与 LVS 的 wrr 一致。
- leastconn:与 LVS 的 Least conn 一致。
- source:类似 LVS 的源地址散列 source hashing。对源 IP 进行哈希。同一客户端 IP 访问同一台服务器
- uri:类似 LVS 的目的地址散列 destination hashing。对目的地址进行哈希,同一请求的 URI 总是访问同一个服务器
- url_param:根据 URL 参数调度。将同一个用户信息都发往同一个后端服务器。
- hdr(name):根据 HTTP 请求头锁定每一次 HTTP 请求。若缺少头,则用 rr 代替
- rdp-cookie(name):查询每个 TCP 请求,并哈希 RDP cookie,用于退化的持久模式,使同一个用户或会话 ID 总是发送到同一台服务器。若没有 cookie,则使用 rr 代替。
HAProxy 配置文件
直接通过yum install haproxy
安装(版本可能很老),版本为 1.6。或者在haproxy 下载源码包,版本会更加新。安装后会自动创建用户 haproxy。可以通过systemctl
管理。
源码包安装
下载的是 1.8.14 版本的源码包。进入解压目录
make PREFIX=/usr/local/haproxy1.8 TARGET=linux2628 |
若使用源码安装,则不会自动创建 haproxy 用户及用户组,需要手动创建。并且没有任何配置文件,都要手动创建。有模板文件,在解压目录的example/
目录中,叫option-http_proxy.cfg
,在安装目录中创建一个conf
目录,再将该配置文件复制过去。
HAProxy 操作
HAProxy 命令:
haproxy |
HAproxy 配置文件
HAProxy 主配置文件/etc/haproxy/haproxy.cfg
HAProxy 的配置有五个部分:global
,defaults
,frontend
,backend
,listen
- global:设置全局配置参数,属于进程级的配置,和操作系统配置有关
- defaults:默认参数的配置。默认会自动被引用到下面的 frontend、backend 和 listen 部分中。如果在 frontend、backend 和 listen 部分中也配置了与 defaults 部分一样的参数,那么 defaults 部分参数对应的值自动被覆盖。
- frontend:设置接收用户请求的前端虚拟节点
- backend:设置后端服务器集群的配置
- listen:是 frontend 部分和 backend 部分的结合体。是为了兼容 1.3 版本以前的配置而保留下来的。可以不用。
全局 global 配置:
global |
为了配置文件中的日志参数,创建独立的日志文件,需要修改/etc/rsyslog.conf
,添加以下参数,然后重启rsyslog
服务
local2.* /var/log/haproxy.log |
注:HAProxy 要求ulimit -n
的值(即最大打开文件数)要大于maxconn * 2 + 18
。
默认 defaults 配置:
defaults |
前端服务 frontend 配置:
frontend main *:5000 # 在1.8版本中不能这么写,而是用bind |
后端服务 backend 配置:
backend static # 定义后端服务器,static是配置存放静态资源的后端服务器 |
例:
backend static |
访问 HAproxy 服务器的 5000 端口,就能访问后端服务器
web 查看状态
可以配置专门的 frontend 设置 haproxy 自带的 stats,监控 haproxy 状态。
frontend stats |
ACL 配置
ACL 操作通常包括阻止请求,选择后端或添加报文头。
- 从数据流,表或环境中提取数据样本
- 可选地对提取的样本进行一些格式转换
- 在此样本上应用一个或多个模式匹配方法
- 仅在模式与样本匹配时执行操作
ACL 的数量没有强制限制。 未使用的不会影响性能,只消耗少量内存。
acl 格式:
acl acl名 acl方法(也称测试标准) [flags] 匹配路径或文件 |
常用 acl 方法:
hdr_reg(host):正则匹配
# 匹配URL是www.exam.com和www1.exam.com的请求
acl www hdr_reg(host) -i ^(www.exam.com|www1.exam.com)hdr_dom(host):
hdr_beg(host):测试请求报文的指定首部的开头部分是否符合指定的模式
# 匹配提供静态请求的主机img\video\ftp
acl host_static hdr_beg(host) -i img. video. ftp.url_sub:
url_dir:
path_beg:测试请求的 URL 是否以后面指定的模式开头
acl url_static path_beg -i /static #匹配url以/static开头
path_end:测试请求的 URL 是否以后面指定的模式结尾
acl url_static path_end -i .jpg .js #匹配url以.jpg或.js结尾
frontend main |
然后通过host1.example.com
可访问 host1 的后端主机池,host2.example.com
访问 host2 的后端主机池。
HAProxy+Keepalived 搭建
安装 keepalived,可以直接 yum 安装,也可以源码安装。源码安装版本 2.0.10。
./configure --prefix=/usr/local/keepalived \ |
然后直接make && make install
即可。
修改配置/etc/keepalived/keepalived.conf
# Master配置 |
修改完后直接systemctl restart keepalived
,查看 Master 的网卡
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 |
关闭 Master,再查看 Backup,发现 VIP 已转移到此主机上,且已变为 Master。