目录
前言
HAProxy
一、HAProxy介绍
(一)定义
(二)核心优势
(三)调度算法速查表
(四)工作模式
(五)配置文件结构
(六)健康检查字段
二、搭建负载均衡集群
(一)准备基本环境
(二)配置流程
配置真实服务器
配置代理服务器
(三)客户端验证
三、配置健康检查页面
(一)修改配置文件
追加配置内容
(二)重启服务
(三)浏览器访问验证
Keepalived
一、Keepalived介绍
(一)定义
(二)功能
(三)工作原理
(四) 优势
(五) 应用场景
二、配置文件
(一)global_defs 全局定义段
(二)vrrp_instance 段(VRRP 实例)
(三)virtual_ipaddress 段(VIP 列表)
(四)virtual_server 段(LVS 虚拟服务)
(五)real_server 段(后端节点)
(六)健康检查块(嵌套在 real_server 内)
(七)track_script 段(自定义脚本)
三、LVS高可用
(一)准备基本环境
(二)配置流程
配置真实服务器
配置调度服务器(LVS)
LVS1和LVS2
LVS1
LVS2
客户端验证
功能验证
高可用切换验证
四、Web高可用
(一)准备基本环境
(二)配置流程
配置 Web1`和 Web2
配置 Web1
配置 Web2
客户端验证
算法 | 说明 | 适用场景 |
---|---|---|
roundrobin | 简单轮询 | 服务器性能一致、无状态业务 |
static-rr | 加权轮询 | 服务器性能差异明显 |
leastconn | 最少连接 | 长连接、WebSocket、DB |
source | 源地址哈希 | 会话保持,同 IP 落到同一 RS |
uri | URI 哈希 | 静态资源缓存、CDN 场景 |
url_param | URL 参数哈希 | 按业务字段(user_id)分片 |
hdr(name) | HTTP 头哈希 | 按 Host、X-Forwarded-For 路由 |
rdp-cookie | Cookie 值哈希 | 登录态保持 |
模式 | 适用层级 | 功能说明 | 典型场景 |
---|---|---|---|
mode http | 第 7 层(HTTP/HTTPS/WebSocket/gRPC/HTTP2) | 解析完整 HTTP 报文,支持 URL、Header、Cookie 路由、压缩、重写、重定向、ACL、会话保持 | Web 站点、API 网关、微服务入口 |
mode tcp | 第 4 层(TCP/UDP) | 仅转发原始字节流,不解析应用数据,零拷贝,低延迟 | MySQL、Redis、SMTP、SSH、游戏、VoIP 等任意 TCP/UDP 服务 |
mode health | 健康检查专用 | 不转发业务流量,仅按配置对后端做 TCP/HTTP/HTTPS 探活,返回检查状态 | 独立监控节点、灰度验证、无流量场景 |
/etc/haproxy/haproxy.cfg
:
子选项 | 作用简述 |
---|---|
log |
日志输出位置与级别 |
maxconn |
进程级最大并发连接 |
nbthread |
启用多线程并指定线程数 |
user / group | 运行身份 |
chroot |
chroot 安全隔离目录 |
stats socket |
Runtime API 套接字 |
ssl-default-bind-ciphers |
默认 TLS 加密套件 |
ssl-default-bind-options |
默认 TLS 选项(如 no-sslv3) |
daemon | 以后台守护进程方式运行 |
pidfile |
指定 pid 文件 |
子选项 | 作用简述 |
---|---|
mode http / tcp | 默认工作模式 |
timeout connect | 与后端建立 TCP 连接的超时 |
timeout client | 客户端读超时 |
timeout server | 后端响应超时 |
retries |
连接失败重试次数 |
option httplog / tcplog | 日志格式 |
option dontlognull | 不记录空连接 |
option redispatch | 会话失败时重新调度 |
errorfile
|
自定义错误页 |
balance |
默认负载均衡算法 |
子选项 | 作用简述 |
---|---|
bind ip:port [ssl crt |
监听地址/端口及可选证书 |
mode http / tcp | 该前端的工作模式 |
acl |
定义访问控制列表 |
http-request redirect / deny / allow | 7 层重定向、拒绝、允许 |
use_backend |
按 ACL 路由到指定后端 |
default_backend |
默认后端 |
option forwardfor | 添加 X-Forwarded-For 头 |
capture request header |
采集请求头 |
子选项 | 作用简述 |
---|---|
balance |
指定调度算法 |
server |
添加真实服务器 |
check inter |
健康检查间隔、成功/失败阈值 |
weight |
权重 |
backup | 备用节点标记 |
ssl verify none / verify required | 与后端之间是否校验证书 |
option httpchk |
HTTP 健康检查 |
cookie |
会话保持 cookie |
http-request / http-response set-header | 修改请求/响应头 |
option tcp-check | 四层自定义检查脚本 |
子选项 | 作用简述 |
---|---|
bind ip:port [ssl crt |
监听地址/端口及可选证书 |
mode http / tcp | 该前端的工作模式 |
balance |
指定调度算法 |
server 行 | 添加真实服务器 |
acl / http-request / option httpchk … | 可直接写在 listen 内,实现一体化配置 |
字段类别 | 子字段 | 含义 |
---|---|---|
Queue | Cur | 当前排队请求数 |
Max | 历史峰值 | |
Limit | 队列硬限制 | |
Session rate | Cur | 每秒新建会话 |
Max | 历史峰值 | |
Limit | 配置上限 | |
Sessions | Cur | 当前活跃会话 |
Max | 历史峰值 | |
Total | 启动后累计会话 | |
Bytes | In / Out | 入站 / 出站字节数 |
Denied / Errors / Warnings | — | 拒绝、连接、响应错误计数 |
Server | Status | UP / DOWN / MAINT |
LastChk | 上次健康检查时间 | |
Wght | 权重 | |
Act / Bck | 活跃 / 备用节点 | |
Dwn / Dwntme | 故障时长(秒) |
主机名 | IP地址 | 角色 |
---|---|---|
HAProxy | 192.168.88.77/24 |
代理服务器 |
Web1 | 192.168.88.7824 | 真实服务器 |
Web2 | 192.168.88.79/24 | 真实服务器 |
Client | 192.168.88.80/24 | 客户端 |
yum -y remove firewalld #卸载防火墙
yum -y install nginx
systemctl enable --now nginx
echo "Web1" > /usr/share/nginx/html/index.html
curl 192.168.88.78 # 确保返回页面
yum -y install nginx
systemctl enable --now nginx
echo "Web2" > /usr/share/nginx/html/index.html
curl 192.168.88.79 # 确保返回页面
yum -y install haproxy
systemctl enable --now haproxy
cp /etc/haproxy/haproxy.cfg{,.bak-$(date +%F_%T)}
#删除官方示例 64 行之后的内容
sed -i '64,$d' /etc/haproxy/haproxy.cfg
#追加以下配置到文件末尾
cat >> /etc/haproxy/haproxy.cfg << EOF
# web 业务监听
listen webservers
#定义虚拟服务器,一个名为webservers的监听块,同时配置前端(监听请求)和后端(负载均衡策略)
bind 0.0.0.0:80
#定义监听的IP地址和端口,0.0.0.0表示监听所有网络接口
mode http
#定义工作模式为HTTP(第七层负载均衡)
balance roundrobin
#定义调度算法为轮询
server web1 192.168.88.78:80 check inter 2000 rise 2 fall 5
server web2 192.168.88.79:80 check inter 2000 rise 2 fall 5
#添加真实服务器 check对后端服务器进行健康检查,inter健康检查心跳包发送时间间隔(毫秒),rise连续检查N次有响应(成功)则认为健康,fall 连续检查N次无响应(失败)则认为故障
EOF
# Web 负载测试(预期 1:1 轮询)
for i in {1..6}; do curl -s http://192.168.88.77
# 统计/健康检查页面
listen status #定义虚拟服务器,名称为stats
bind 0.0.0.0:8080 #定义监听的ip地址和端口
stats uri /status #定义请求路径
stats refresh 60s #定义页面刷新时间,每一分钟刷新一次
stats auth admin:admin #定义用户和密码
systemctl restart haproxy
访问http://192.168.88.77:8080/status 输入用户和密码 均为admin
子选项 | 说明 |
---|---|
router_id |
节点唯一标识,通常用主机名 |
notification_email |
故障通知邮箱 |
smtp_server |
邮件服务器地址 |
smtp_connect_timeout |
SMTP 连接超时(秒) |
vrrp_mcast_group4 |
IPv4 组播地址 |
vrrp_mcast_group6 |
IPv6 组播地址 |
vrrp_version |
VRRP 版本 |
vrrp_iptables |
自动放行 VRRP 协议 |
|
严格遵守VRRP规则 |
vrrp_check_unicast_src |
校验单播源地址 |
script_user |
脚本运行身份 |
enable_script_security |
禁止脚本提权 |
子选项 | 说明 |
---|---|
state MASTER/BACKUP | 初始角色 |
interface |
绑定的物理网卡 |
virtual_router_id <1-255> | VRID,主备必须一致 |
priority <1-254> | 优先级,高者为主 |
advert_int |
心跳间隔 |
authentication { … } | VRRP 认证 |
track_interface { … } | 网卡状态跟踪 |
track_script { … } | 自定义脚本结果跟踪 |
virtual_ipaddress { … } | VIP 列表 |
virtual_ipaddress { #/定义VIP
Pv4 虚拟地址/子网掩码 dev 网卡名 label 网卡别名 #VIP地址及绑定网卡虚拟接口标签
}
子选项 | 说明 |
---|---|
delay_loop |
健康检查延迟 |
lb_algo |
LVS 调度算法 |
lb_kind |
LVS 模式 |
persistence_timeout |
会话保持时长 |
protocol |
UDP> |
ha_suspend | 当节点为 BACKUP 时暂停检查 |
virtualhost |
Layer7 检查 Host 头 |
子选项 | 说明 |
---|---|
weight <0-255> | 权重 |
inhibit_on_failure | 故障时权重置 0 |
notify_up | 节点上线钩子 |
notify_down | 节点下线钩子 |
类型 | 子选项 |
---|---|
TCP_CHECK | connect_port, connect_timeout, retry |
HTTP_GET | url path status_code digest |
SSL_GET | url path status_code digest,支持 https |
MISC_CHECK | misc_path, misc_timeout |
vrrp_script 脚本块名 {
script "脚本路径"
interval #定义脚本执行频率
}
主机名 | IP地址 | 角色 |
---|---|---|
LVS1 | 192.168.88.81/24 |
LVS 调度服务器 |
LVS2 | 192.168.88.82/24 | LVS 调度服务器 |
Web1 | 192.168.88.83/24 | 真实服务器 |
Web2 | 192.168.88.84/24 | 真实服务器 |
Client | 192.168.88.85/24 | 客户端 |
yum -y remove firewalld #卸载防火墙
yum -y install nginx
systemctl enable --now nginx
yum -y install network-scripts
cat > /etc/sysconfig/network-scripts/ifcfg-lo:0 <> /etc/sysctl.conf <
echo "Web1" > /usr/share/nginx/html/index.html
curl 192.168.88.83 # 确保返回页面
echo "Web2" > /usr/share/nginx/html/index.html
curl 192.168.88.84 # 确保返回页面
yum -y install ipvsadm keepalived
#绑定 VIP
yum -y install network-scripts #提供if up/down 命令管理网络接口配置
cat > /etc/sysconfig/network-scripts/ifcfg-eth0:0 <
global_defs {
router_id LVS1 #集群节点的唯一标识
vrrp_iptables #放行防火墙规则
vrrp_strict #严格遵守VRRP规则
...
}
vrrp_instance VI_1 {
state MASTER #状态为主节点,主服务器
interface eth0 #/网卡
virtual_router_id 51 #虚拟路由唯一标识符,主备服务器的VRID号必须一致
priority 100 #设置优先级,数字越大优先级越高
advert_int 1 #心跳包间隔时间
authentication { #认证方式
auth_type PASS #密码认证
auth_pass test #集群密码,主备服务器的密码必须一致
}
virtual_ipaddress { #定义VIP
192.168.88.86/24 dev eth0 label eth0:0 #VIP地址及绑定网卡虚拟接口标签
}
}
virtual_server 192.168.88.86 80 { #定义LVS虚拟服务器
delay_loop 5 #健康检查延时5s开始
lb_algo wrr #调度算法为加权轮询
lb_kind DR #LVS工作模式为DR模式
persistence_timeout 60 #60s内相同客户端发起请求由同一服务器处理
protocol TCP #虚拟服务器协议
real_server 192.168.88.83 80 { #定义真实服务器
weight 1 #设置后端服务器的权重为1
TCP_CHECK {
connect_timeout 2 #连接超时时间为2s
nb_get_retry 3 #连续3次访问失败则认为真实服务器故障
delay_before_retry 3 #健康检查包时间间隔
}
}
real_server 192.168.88.84 80 {
weight 2
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
systemctl enable --now keepalived
ipvsadm -Ln
ip a | grep 88.86
rsync -av root@192.168.88.81:/etc/keepalived/keepalived.conf /etc/keepalived/
# 只改三行
router_id LVS2
state BACKUP
priority 50
systemctl enable --now keepalived
for i in {1..6}; do curl 192.168.88.86; done #预期 1:0或0:1
# LVS 注释 persistence_timeout 后重启 Keepalived
for i in {1..6}; do curl 192.168.88.86; done #预期 1:2
#LVS1执行
systemctl stop keepalived
ipvsadm -Ln #显示为空
#LVS2执行
ip a | grep 88.86 #秒级抢占 VIP
ipvsadm -Ln #规则仍在
#Client执行
for i in {1..6}; do curl 192.168.88.86; done #客户端 curl 正常,全程用户无感知。
主机名 | IP地址 | 角色 |
---|---|---|
Web1 | 192.168.88.87/24 | Web服务器 |
Web2 | 192.168.88.88/24 | Web服务器 |
Client | 192.168.88.89/24 | 客户端 |
yum -y install keepalived nginx
systemctl enable --now nginx
删除34行之后的内容,之后的内容为LVS相关的配置
global_defs {
router_id Web1
vrrp_iptables
vrrp_strict
...
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass test
}
virtual_ipaddress {
192.168.88.90/24 dev eth0 label eth0:1
}
track_script {
chk_nginx
}
}
#!/bin/bash
ss -anltpu | grep -q nginx && exit 0 || exit 1
#通过 ss 命令查看nginx服务是否运行,运行返回0,运行返回1
chmod +x /etc/keepalived/check_nginx.sh
systemctl enable --now keepalived
echo "Web1" > /usr/share/nginx/html/index.html
curl 192.168.88.87 # 确保返回页面
global_defs {
router_id Web2
vrrp_iptables
vrrp_strict
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass test
}
virtual_ipaddress {
192.168.88.90/24 dev eth0 label eth0:1
}
}
systemctl enable --now keepalived
echo "Web1" > /usr/share/nginx/html/index.html
curl 192.168.88.88 # 确保返回页面
for i in {1..6}; do curl 192.168.88.90; done #返回Web1
#Web1执行
systemctl stop nginx
#Web2执行
ip -a | grep 88.90 #几秒后查看VIP
#Client执行
curl 192.168.88.90 #返回Web2页面
#Web1执行
systemctl start nginx #启动nginx,等待一段时间VIP自动回到Web1