目录
负载均衡
负载均衡是一种在计算系统中分配工作负载的方法,旨在优化系统资源使用、最大化吞吐量、最小化响应时间,同时避免过载任何一个节点。负载均衡通过将传入的网络请求分散到多个服务器上,从而确保每个服务器都得到均衡处理,提高系统整体性能和可靠性。这种方法不仅扩展了网络设备和服务器的带宽、增加了吞吐量,还加强了网络数据处理能力,提高了网络的灵活性和可用性
四层负载均衡
四层负载均衡工作在OSI模型的传输层,主要处理TCP和UDP协议。它通过IP地址和端口号来转发数据包,不检查数据包的内容。这种模式适用于各种基于TCP的服务,包括HTTP、FTP等。
由于不需要深入数据包的内容,四层负载均衡具有较低的处理延迟和较高的吞吐量。常见的四层负载均衡器包括LVS、F5、Nginx(通过Stream模块实现)等。
七层负载均衡
七层负载均衡工作在OSI模型的应用层,能够理解应用协议(如HTTP)。它根据数据包的内容(如URL、Cookie、用户请求类型)进行智能转发。这种模式特别适用于需要对请求进行详细处理的场景
可以根据应用层信息(如URL、Cookie)进行灵活配置,适用于复杂的应用场景。例如,可以根据用户请求的语言或URL路径选择不同的后端服务器。
HAproxy简介
HAProxy是一款开源、高性能的负载均衡器和代理服务器,专为TCP和HTTP应用而设计。
HAProxy通过将客户端请求分发到多台后端服务器,可以提高应用的可用性和性能。其支持多种负载均衡算法和健康检查机制,是构建高可用性系统的理想选择。由于其高性能和可靠性,HAProxy广泛应用于各类企业中,适用于负载大的网站和需要会话保持或七层处理的场景
Haproxy的基本配置
Haproxy的配置文件:/etc/haproxy/haproxy.cfg
/etc/haproxy/haproxy.cfg
配置文件的各项内容和作用:
Global Section:这部分包含全局配置参数,如日志设置、最大连接数、用户和组权限等。这些参数对整个HAProxy实例都有影响。
Defaults Section:默认部分定义了适用于前端(frontend)和后端(backend)的默认参数,例如超时时间、日志格式和工作模式。
Frontend Section:前端部分定义了HAProxy接受客户端请求的设置,包括绑定地址和端口、调度算法等。
Backend Section:后端部分则配置了服务器集群的相关信息,包括服务器地址、健康检查和负载均衡算法。
Listener Section:监听部分组合了前端和后端的配置,使得配置更加简洁和直观。
haproxy基本部署
准备三台虚拟机:(防火墙和selinux关闭)
haproxy(ip为172.25.254.100)
webserver1(ip为172.25.254.10)
webseerver2(ip为172.25.254.20)
1.在webserver1和webserver2中安装nginx并制作默认页面
webserver1:
yum install -y nginx
echo webserver1-172.25.254.10 > /usr/share/nginx/html/index.html
systemctl start nginx
webserver2:
yum install -y nginx
echo webserver2-172.25.254.20 > /usr/share/nginx/html/index.html
systemctl start nginx
2.在haproxy中完成基本配置(实验rr轮询算法)
yum install -y haproxy
vim /etc/haproxy/haproxy.cfg
加入
listen webcluster
bind *:80
mode tcp
balance roundrobin
server web1 172.25.254.10:80 cookie web1 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.254.20:80 cookie web2 check inter 2 fall 3 rise 5 weight 1
systemctl restart haproxy
测试
haproxy热处理
haproxy热处理指在不中断服务的情况下重新加载配置或更新软件版本的能力。
SOCAT工具
对服务器动态权重和其它状态可以利用 socat工具进行调整,Socat 是 Linux 下的一个多功能的网络工 具,名字来由是Socket CAT,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向 通道,且支持众多协议和链接方式。如 IP、TCP、 UDP、IPv6、Socket文件等 范
例:利用工具socat 对服务器动态权重调整
1.修改配置文件中套接字文件权限为可编写
vim /etc/haproxy/haproxy.cfg
stats socket /var/lib/haproxy/stats mode 600 level admin
2.下载socat工具
yum install socat -y
3.
echo get weight webcluster/webl | socat stdio /var/lib/haproxy/stats(获取web1的权重)
echo "set weight webcluster/webl 2"| socat stdio /var/lib/haproxy/stats(修改web1权重为2)
echo "set weight webcluster/web2 1"| socat stdio /var/lib/haproxy/stats(修改web2权重为1)
echo "disable server webcluster/webl" | socat stdio /var/lib/haproxy/stats (禁用web1的服务)
echo "disable server webcluster/web2" | socat stdio /var/lib/haproxy/stats (禁用web2的服务)
haproxy的算法
haproxy的静态算法
static-rr 基于权重的轮询调度
- 不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)
- 不支持端服务器慢启动
- 其后端主机数量没有限制,相当于LVS中的 wrr
first
- 根据服务器在列表中的位置,自上而下进行调度
- 其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
- 其会忽略服务器的权重设置
- 不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效
haproxy的动态算法
roundrobin
Round Robin(轮询)是一种负载均衡算法,它将请求按顺序分配给后端服务器。在HAProxy中,Round Robin支持权重的动态调度,可以根据服务器的权重来分配请求。此外,它还支持慢启动功能,即新加入的服务器会逐渐增加转发数。每个后端最多支持4095个real server,并且可以动态调整它们的权重。
leastconn
Least Connections(最少连接)是一种负载均衡算法,它根据当前连接数最少的后端服务器进行优先调度。这种算法适合长连接的场景,例如MySQL等。同样,它也支持权重的运行时调整和慢启动功能。
其他算法
SOURCE
源地址Hash调度算法是一种基于客户端源地址的负载均衡算法,它通过哈希函数将客户端的IP地址映射到后端服务器上。这样,来自同一客户端的请求始终会被转发到同一台后端服务器,从而实现会话的持久性。这种算法适用于需要会话保持的场景,例如Web应用程序的会话管理。当用户的请求到达负载均衡器时,会根据源地址进行哈希计算,得到一个哈希值。然后,根据这个哈希值选择相应的后端服务器。由于哈希函数的特性,相同的源地址将始终产生相同的哈希值,因此同一个用户的请求将始终被转发到同一台后端服务器
url_param
URL_PARAM调度算法是一种动态调度算法,它通过对用户请求的URL中的参数部分进行哈希计算来实现负载均衡。具体来说,它会对指定参数名对应的值进行哈希计算,然后根据服务器的总权重来将请求分发到后端的某个服务器。
URL_PARAM调度算法默认是静态的,但可以通过hash-type
选项来修改其特性,例如使用map-based
或consistent
哈希类型。这种算法特别适用于需要根据URL参数进行负载均衡的场景,例如根据用户ID或搜索关键词来分配请求。它能够提高缓存效率,同时保证用户请求的一致性和会话的持久性。
hdr
HTTP头部(header)哈希调度算法是一种动态调度算法,它通过对用户每个HTTP请求头部中的指定信息进行哈希计算来实现负载均衡。具体来说,它会对由名称指定的HTTP首部进行哈希计算,然后根据服务器的总权重来将请求分发到后端的某个服务器。
这种算法特别适用于需要根据HTTP头部信息进行负载均衡的场景,例如根据用户语言、设备类型或地理位置来分配请求。它能够提高负载均衡的灵活性和效率,同时保证用户请求的一致性和会话的持久性
URI
URI哈希调度算法是一种根据请求的URI(Uniform Resource Identifier,统一资源标识符)来进行负载均衡的方法。它通过对URI的左半部分或整个URI进行哈希计算,并将得到的哈希结果与后端服务器的总权重相除,以决定将请求转发到哪台指定的服务器。
这种算法特别适用于后端是缓存服务器的场景,因为它可以保证对于同一个URI的请求始终被转发到同一台服务器,从而充分利用服务器缓存,提高响应速度和效率。
RDP-Cookie
RDP-Cookie调度算法是HAProxy中的一种特殊调度算法,专门用于Windows远程桌面连接场景。它通过使用cookie来保持会话,确保相同的cookie连接时会被调度到同一台后端服务器。这对于多服务器的场景非常有用,可以提高用户体验和负载均衡的效果。
在使用RDP-Cookie调度算法时,当客户端连接到后端服务器后,服务器会生成一个cookie并将其发送给客户端。下次客户端再次发起连接时,只需携带相同的cookie,HAProxy会根据cookie的值将请求路由到之前分配的后端服务器。这样可以确保同一个用户的会话始终在同一台服务器上处理,避免了跨服务器的会话切换问题。
haproxy高级配置
基于cookie的会话保持
cookie value:为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于 source 地址hash调度算法对客户端的粒度更精准,但同时也加大了haproxy负载,目前此模式使用较少, 已经被session共享服务器代替
具体配置
验证:
haproxy状态页
HAProxy状态页是一个内置的功能,用于展示HAProxy服务器的实时状态和监控信息。这个状态页可以帮助管理员了解后端服务器的性能、负载情况以及处理的请求数量等。
要启用HAProxy状态页,需要进行以下配置:
-
启用状态监控:在HAProxy配置文件中,添加一个新的
listen
块,用于状态页的访问。例如:listen stats # 监听的端口号可以自定义,这里使用默认的8080 bind *:80 # 绑定IP地址和端口,这里使用8080端口 stats enable # 启用状态页 stats refresh 5 #设置刷新页面的时间 stats uri /stats # 设置状态页的URI路径 stats auth admin:admin # 设置访问状态页的用户名和密码
2.重启服务:
systemctl restart haproxy.service
测试
haproxy中ACL配置
在HAProxy中,ACL(Access Control List)配置是一种强大的功能,它允许基于各种条件对流量进行细粒度的控制和路由。
ACL是HAProxy灵活性的关键所在。通过使用ACL,可以对请求进行非常精确的控制,从而确保正确的请求被正确地路由到适当的后端服务器。在配置ACL时要确保条件的准确性和完备性,以避免出现安全漏洞或服务中断
ACL-criterion 匹配规范
hdr string,提取在一个HTTP请求报文的首部
hdr([<name> [,<occ>]]):完全匹配字符串,header的指定信息,<occ> 表示在多值中使用的值的出
现次数
hdr_beg([<name> [,<occ>]]):前缀匹配,header中指定匹配内容的begin
hdr_end([<name> [,<occ>]]):后缀匹配,header中指定匹配内容end
hdr_dom([<name> [,<occ>]]):域匹配,header中的dom(host)
hdr_dir([<name> [,<occ>]]):路径匹配,header的uri路径
hdr_len([<name> [,<occ>]]):长度匹配,header的长度匹配
hdr_reg([<name> [,<occ>]]):正则表达式匹配,自定义表达式(regex)模糊匹配
hdr_sub([<name> [,<occ>]]):子串匹配,header中的uri模糊匹配 模糊匹配c 报文中a/b/c也会匹配
ACL-flags 匹配模式
-i 不区分大小写
-m 使用指定的正则表达式匹配方法
-n 不做DNS解析
-u 禁止acl重名,否则多个同名ACL匹配或关系
多个ACL的组合调用方式
与:隐式(默认)使用
或:使用“or" 或 “||"表示
否定:使用 "!" 表示
多个ACL调用方式:
#示例:
if valid_src valid_port #与关系,ACL中A和B都要满足为true,默认为与
if invalid_src || invalid_port #或,ACL中A或者B满足一个为true
if ! invalid_src #非,取反,不满足ACL才为true
ACL具体使用案例
基于域名匹配
基于源IP匹配
haproxy中四层负载
1.在webserver1和webserver2上安装MySQL并修改数据库id
yum install mariadb-server -y
vim /etc/my.cnf.d/mariadb-server.cnf
2.在server1和2中创建用户
(server同)
3.修改haproxy配置
测试
HAProxy https 实现
-
准备 SSL 证书和私钥。可以使用自签名证书进行测试,但在生产环境中,建议使用权威机构颁发的证书。
mkdir -p /etc/haproxy/certs openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/haproxy/certs/xujiahao.org.key -x509 -days 365 -out /etc/haproxy/certs/xujiahao.org.crt cat /etc/haproxy/certs/xujiahao.org.key /etc/haproxy/certs/xujiahao.org.crt > /etc/haproxy/certs/xujiahao.pem
-
在 HAProxy 配置文件中启用 SSL/TLS。编辑
haproxy.cfg
文件vim /etc/haproxy/haproxy.cfg listen web-https bind *:443 ssl crt /etc/haproxy/certs/xujiahao.pem mode http balance roundrobin server web1 172.25.254.10:80 check inter 2 fall 2 rise 5 server web2 172.25.254.20:80 check inter 2 fall 2 rise 5
调用https服务
测试