高可用与负载均衡
LVS 负载均衡(Linux Virtual Server)
概念
基本概念
LVS 是章文嵩博士开发,基于 Linux 内核 Netfilter 实现的四层负载均衡(传输层,基于 IP + 端口调度)。
工作在内核态,性能极高,支持大量并发。
组成角色:
-
VS(Virtual Server,调度器 / Director):负载均衡服务器,接收用户请求,分发后端服务器
-
RS(Real Server,真实服务器):后端提供业务服务的服务器
-
VIP:虚拟 IP,用户访问的统一入口
-
RIP:真实服务器内网 IP
-
DIP:调度器后端内网 IP
工作原理
客户端发起请求访问 VIP,数据包到达 Director。
调度器根据预设调度算法,挑选一台 RS,将请求包转发给后端真实服务器;RS 处理请求后,把响应数据包返回客户端。
LVS 工作在 TCP/IP 四层(传输层),只识别 IP、端口,不解析 HTTP 应用层内容。
工作模式
NAT 模式(网络地址转换)
原理
客户端请求→Director;调度器修改数据包目标 IP转发给 RS;
RS 响应数据包必须经过 Director,调度器修改源 IP 为 VIP 返回客户端。
特点:
-
RS 网关必须指向 DIP
-
RS 可以是任意操作系统
-
调度器会成为瓶颈(所有进出流量都经过 VS)
DR 模式(直接路由,生产最常用)
原理
请求报文:客户端→Director,调度器修改 MAC 地址,转发给同网段 RS(目标 MAC 改为 RS 网卡 MAC)
响应报文:RS 直接封装 VIP 作为源 IP,不经过调度器,直接返回客户端
特点:
-
请求走 VS,响应直连客户端;调度器压力小
-
VS 与 RS 必须在同一局域网
-
RS 网卡需要配置 VIP(抑制 ARP)
TUN 模式(IP 隧道)
原理
Director 把原始数据包封装一层新 IP 隧道报文,转发给跨网段 RS;
RS 解封装处理业务,响应包直接回客户端,不经过 VS。
特点:
-
VS 和 RS 可以跨公网、跨网段
-
RS 需要支持 IP 隧道模块
FULLNAT 模式(阿里扩展模式,非官方原生)
同时修改源 IP + 目标 IP,内网之间通信;支持跨网段,但是性能低于 DR。
常见调度算法
静态算法(不考虑 RS 负载)
-
RR 轮询:依次分发
-
WRR 加权轮询:权重越高分配越多请求
-
DH 目标地址哈希
-
SH 源地址哈希
动态算法(感知负载)
-
LC 最少连接
-
WLC 加权最少连接(默认常用)
-
LBLC、LBLCR
LVS配置
参数说明:
DIP:server3 192.168.234.135 RIP:server4 192.168.234.136 server5 192.168.234.137 VIP:192.168.234.100
外加一台测试虚拟机server6 192.168.234.138
ipvsadm
ipvsadm 是 Linux 下用于管理 IPVS(IP Virtual Server,IP 虚拟服务器) 的命令行工具,主要用于构建 LVS(Linux Virtual Server)负载均衡集群。它允许管理员配置和管理虚拟服务、真实服务器(后端节点)以及负载均衡策略。
| 参数 | 含义 |
|---|---|
-A |
添加虚拟服务 VS(VIP: 端口) |
-E |
修改虚拟服务 |
-D |
删除虚拟服务 |
-a |
添加后端真实服务器 RS |
-e |
修改真实服务器 |
-d |
删除真实服务器 |
-L / -l |
查看集群规则 |
-n |
数字格式显示 IP、端口(不解析域名,常用-Ln) |
-C |
清空全部 IPVS 规则 |
-Z |
清空连接统计计数器 |
-S |
保存规则(ipvsadm-save) |
-R |
载入规则(ipvsadm-restore) |
协议与模式参数
| 参数 | 说明 |
|---|---|
-t VIP:port |
TCP 协议虚拟服务(最常用) |
-u VIP:port |
UDP 协议虚拟服务 |
-s 算法 |
指定调度算法:rr、wrr、lc、wlc (默认) |
-r RIP:port |
指定后端真实服务器地址 |
-g |
DR 直接路由模式(生产首选) |
-m |
NAT 地址转换模式 |
-i |
TUN 隧道模式 |
-w 数字 |
设置 RS 权重 |
辅助参数
| 参数 | 作用 |
|---|---|
-c |
查看当前活跃连接 |
--stats |
输出数据包、连接统计 |
--rate |
查看流量速率 |
标准示例命令
#1 添加虚拟服务VIP,wlc算法 ipvsadm -A -t 192.168.1.100:80 -s wlc #2 添加RS,DR模式,权重1 ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.10:80 -g -w 1 #3 添加RS,NAT模式 ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -m -w 1 #4 查看规则 ipvsadm -Ln #5 清空所有规则 ipvsadm -C #6 持久化保存规则 ipvsadm-save > /etc/sysconfig/ipvsadm
arptables
概念
arptables:用户空间命令工具,依托 Linux 内核 Netfilter 框架,专门用于过滤 ARP 报文(2.5 层,介于二层 MAC 与三层 IP 之间)。
类比关系:
arptables ↔ ARP报文 = iptables ↔ IP数据包
iptables 只能处理 IP 包,无法拦截 ARP 广播帧,ARP 流量必须由 arptables 管控。
核心架构
-
仅有一张表:filter 表
-
两条内置链
链 作用 INPUT 进入本机的 ARP 报文 OUTPUT 本机向外发出的 ARP 报文 -
常见动作
-
ACCEPT:允许 ARP 报文
-
DROP:丢弃 ARP 报文
-
RETURN:跳出当前链
主要用途
-
防范 ARP 欺骗、ARP 攻击,拦截非法 ARP 广播;
-
LVS DR 模式 ARP 抑制方案之一:阻止 RS 响应 VIP 的 ARP 请求
DR 模式冲突:VS 和所有 RS 都配置 VIP,如果 RS 应答 VIP 的 ARP,客户端流量直接访问 RS,绕过调度器失效。
两种抑制手段:①内核参数
arp_ignore/arp_announce(最常用);②arptables 丢弃 ARP 应答报文。
常用核心参数
| 参数 | 功能 |
|---|---|
-A |
追加规则 |
-I |
头部插入规则 |
-D |
删除规则 |
-L |
查看规则,arptables -Ln数字显示 |
-F |
清空所有规则 |
-P |
设置链默认策略 |
-s |
匹配 ARP 源 IP |
-d |
匹配 ARP 目标 IP |
-j |
指定动作(ACCEPT/DROP) |
典型示例
# 丢弃本机向外发送、目标为VIP的ARP响应 arptables -A OUTPUT -d 192.168.1.100 -j DROP # 查看规则 arptables -Ln # 清空规则 arptables -F
iptables /arptables/ebtables 层级区分
| 工具 | 工作层级 | 处理对象 |
|---|---|---|
| ebtables | 二层(以太网帧) | MAC 帧,网桥环境 |
| arptables | 2.5 层 | ARP 报文 |
| iptables | 三层 / 四层 | IP 数据包、TCP/UDP |
VS调度器配置
安装ipvsadm
[root@server1 ~]# yum install -y ipvsadm
进行配置 server3上进行
#查看目前规则 [root@server1 ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn 添加vip [root@server1 ~]# ip addr add 192.168.234.100/24 dev eth0 添加虚拟服务 [root@server1 ~]# ipvsadm -A -t 192.168.234.100:80 -s rr

向虚拟服务添加真实服务器RS
[root@server1 ~]# ipvsadm -a -t 192.168.234.100:80 -r 192.168.234.136:80 -g -w 1 [root@server1 ~]# ipvsadm -a -t 192.168.234.100:80 -r 192.168.234.137:80 -g -w 1
保存配置
ipvsadm-save > /etc/sysconfig/ipvsadm

RS调度器配置
server4:
安装测试服务
[root@server2 ~]# yum install -y httpd [root@server2 ~]# systemctl start httpd [root@server2 ~]# echo server4 > /var/www/html/index.html [root@server2 ~]# systemctl enable httpd

RS也需要添加vip
[root@server2 ~]# ip a a 192.168.234.100/24 dev eth0

server5同样
server6测试机上测试
for i in {1..10}; do curl 192.168.234.100; done

问题
1.测试机测试时只显示其中一RS其中一台虚拟机,另一台并未调用
解决:在 RS 上使用 arptables 丢弃向外发出的 VIP ARP 应答报文、
禁用arp
[root@server3 ~]# yum install arptables [root@server3 ~]# arptables -A INPUT -d 192.168.36.100 -j DROP [root@server3 ~]# arptables -A OUTPUT -s 192.168.36.100 -j mangle --mangle-ip-s 192.168.36.134 [root@server3 ~]# arptables-save > /etc/sysconfig/arptables [root@server3 ~]# systemctl enable arptables

2.修改网卡时网卡无法重启

查看报错信息可知其无法找到ens33网卡,此时查看ip地址发现无ens33网卡,网卡名称为eth0

输入
vim /sysconfig/network-scripts/ifcfg-ens33 #进入文件内修改设备名称为“eth0",并检查有无其他错误,修改后保存退出

此时重新启动网卡发现重启成功,但网卡文件名仍为”ifcfg-ens33“,输入
mv /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-eth0 #修改文件名称方便辨认

LVS NAT模式
LVS/NAT 的优点是服务器可以运行任何支持 TCP/IP 的操作系统,它只需要一个 IP 地址配置在调度器上,服务器组可以用私有的 IP 地址。
缺点是它的伸缩能力有限, 当服务器结点数目升到 20 时,调度器本身有可能成为系统的新瓶颈,因为在 VS/NAT 中请求和响应报文都需要通过负载调度器。
示例参数
Load Balance双网卡 eth0: 192.168.64.128 (对外) eth1: 192.168.234.135(对内) Virtual IP: 192.168.64.128 Gateway: 192.168.234.135 Realserver1: 192.168.234.136 Realserver2: 192.168.234.137
其中双网卡需要为虚拟机另加一个网卡并进行配置,VS的第二块网卡和server6网卡做以下更改

其中对内网卡eth0:

对外网卡eth1:

开启路由机制
vi /etc/sysctl.conf net.ipv4.ip_forward = 1

执行命令生效
sysctl --system
加载 nat 模块
modprobe iptable_nat
注:如果不加载此模块,也可以在第一次访问时成功,但是会在再次访问时出现延迟过长,或访问超时现象
加载 lvs规则
ipvsadm -A -t 192.168.64.128:80 -s rr ipvsadm -a -t 192.168.64.128:80 -r 192.168.234.136:80 -m ipvsadm -a -t 192.168.64.128:80 -r 192.168.234.137:80 -m

RS上配置静态路由
所有RS上都要配置
查看路由信息
[root@server2 ~]# ip r default via 192.168.234.2 dev eth0 proto static metric 100 192.168.234.0/24 dev eth0 proto kernel scope link src 192.168.234.136 metric 100
删除原有露营配置,必须指向调度器的IP
[root@server2 ~]# ip r d default via 192.168.234.2 [root@server2 ~]# ip r 192.168.234.0/24 dev eth0 proto kernel scope link src 192.168.234.136 metric 100 [root@server2 ~]# ip r a default via 192.168.234.135
所有RS以此类推
测试

keepalived高可用
基础概念
Keepalived 基于 VRRP 协议(虚拟路由冗余协议),实现 Linux 服务器故障转移(HA 高可用)。
常搭配 LVS 使用,实现 LVS 调度器 VS 主备架构:防止单点故障。
VRRP 核心思想
多台服务器组成一个VRRP 组,共享同一个虚拟 IP(VIP)。
-
MASTER(主节点):正常工作,持续发送 VRRP 通告报文;持有 VIP
-
BACKUP(备节点):监听主节点报文
超过预设时间收不到主节点消息,判定主故障,备节点升级为 Master,抢占 VIP,接管业务。
两大核心功能
-
VRRP 高可用:实现 VIP 漂移,解决调度器单点故障
-
健康检测(Check)
检测后端 Real Server(RS)服务状态
RS 宕机 / 服务异常,自动从 ipvsadm 集群中剔除;恢复后自动加入
重点:Keepalived 不负责负载均衡转发,负载均衡由内核 IPVS 实现;Keepalived 只做高可用 + 健康检查。
核心组件与配置
Keepalived 由 核心组件 和 配置文件 两部分组成,配置决定其行为逻辑。
核心组件
● vrrp_instance:VRRP 实例,是 Keepalived 配置的核心单元,一个实例对应一个 VIP 及一组主备节点。
● Global_defs:全局配置,定义集群标识(如 router_id)、邮件通知(故障时发告警邮件)等基础参数。
● Track_script:健康检查脚本,用于检测主节点上 “核心业务服务”(如 Nginx、LVS)是否存活。若服务挂了,即使主节点本身存活,也会主动释放 VIP,触发切换(避免 “主节点存活但服务不可用” 的问题)。
核心配置文件路径
/etc/keepalived/keepalived.conf
master和BACKUP配置
server1:
清除资源
[root@server1 ~]# ip a d 192.168.36.100/24 dev eth0 [root@server1 ~]# ipvsadm -C
安装高可用软件
[root@server1 ~]# yum install -y keepalived [root@server1 ~]# vim /etc/keepalived/keepalived.conf

server6同理,MASTER改为BACKUP,同时权重调低,少于MASTER权重
systemctl start keepalived.service tail -f /var/log/messages

可看到server6作为备用机,停止server1后,server6自动接管

用本机访问

pacemaker高可用
基础概念
Pacemaker:Linux 集群资源管理器(CRM),属于开源高可用集群软件。
常搭配 Corosync 消息层组件使用,整套架构统称 PCS 集群(Corosync+Pacemaker)。
和 Keepalived 核心区分:
-
Keepalived:基于 VRRP,适合VIP 漂移、LVS 主备,结构简单,一般最多 2 台节点;只管控 VIP。
-
Pacemaker+Corosync:完整集群资源管理,支持 3 节点、多资源、多种模式(主备、双主、多实例),可以管理 VIP、Apache、NFS、数据库、LVS 等任意服务资源。
组件分工
-
Corosync
集群底层通信层。负责集群节点之间心跳通信、节点状态同步、传递成员信息;检测节点宕机。
通信端口:5404、5405、5406。
-
Pacemaker
上层资源调度管理器。根据 Corosync 上报节点状态,实现:
资源启动、停止、迁移、故障转移、资源约束。
-
PCS 工具(pcsd)
命令行管理工具,CentOS7/8 默认管理入口;
旧版本工具:crmsh。
集群资源(Resource)
集群中需要被托管的对象都叫资源:
虚拟 IP(VIP)、Apache、Nginx、挂载存储、LVS、数据库等。
资源类型:
-
ocf 资源:开放集群框架,功能最强(常用)
-
lsb 资源:系统 /etc/init.d 传统脚本
-
systemd 资源:托管 systemd 服务
-
primitive(原始资源):最小单元资源
创建集群步骤
免密配置
[root@server3 ~]# ssh-keygen [root@server3 ~]# ssh-copy-id server6

时间同步
server3与server6都需要进行
[root@server3 ~]# vim /etc/chrony.conf

[root@server3 ~]# timedatectl [root@server3 ~]# systemctl restart chronyd [root@server3 ~]# systemctl enable --now chronyd
安装集群软件
[root@server3 ~]# yum install -y pacemaker pcs psmisc policycoreutils-python [root@server3 ~]# ssh server6 yum install -y pacemaker pcs psmisc policycoreutils-python #给server6也安装
配置防火墙
——这两台虚拟机已经禁用,不用多余操作
[root@server3 ~]# setenforce 0 [root@server3 ~]# sed -i.bak "s/SELINUX=enforcing/SELINUX=permissive/g" /etc/selinux/ config [root@server3 ~]# systemctl mask firewalld.service [root@server3 ~]# systemctl stop firewalld.service [root@server3 ~]# iptables --flush
启动pcsd服务
[root@server3 ~]# systemctl start pcsd.service [root@server3 ~]# systemctl enable pcsd.service [root@server3 ~]# ssh server6 systemctl start pcsd.service [root@server3 ~]# ssh server6 systemctl enable pcsd.service
配置身份认证
——server3和server6相同
[root@server3 ~]# passwd hacluster

集群节点身份认证
——两台节点任意一个完成即可
[root@pcmk-1 ~]# pcs cluster auth server3 server6
输入用户名”hacluster”和密码

认证后的节点加入集群
[root@server3 ~]# pcs cluster --force setup --name mycluster server3 server6

集群创建完成
处理pcs中警告
pcs status

pcs start vip pcs resource create vip ocf:heartbeat:IPaddr2 ip=192.168.234.100 cidr_netmask=32 op monitor interval=30s
haproxy
概念
haproxy 是一款开源高性能 TCP/HTTP 四层、七层负载均衡软件,单进程事件驱动模型。
-
四层负载均衡(TCP 模式):只转发数据包,解析 IP + 端口,不解析应用层;适合 MySQL、Redis 等。
-
七层负载均衡(HTTP 模式):解析 HTTP 请求,可以基于 URL、Host、Cookie 实现更灵活的调度。
-
LVS:内核四层负载均衡,性能最强,只能四层;
-
HAProxy:用户态,同时支持四层 + 七层;
-
Nginx:七层为主,四层能力较弱。
核心配置文件
路径:/etc/haproxy/haproxy.conf
配置分为:
-
global 全局段:进程、日志、最大连接、系统参数
-
defaults 默认段:frontend/backend 继承通用参数(超时、日志模式)
-
frontend 前端:对外监听端口,接收客户端请求
-
backend 后端:定义真实服务器集群、调度算法
-
listen:整合 frontend+backend,简写模式
配置
[root@server3 ~]#yum install -y haproxy.x86_64 [root@server3 ~]# pcs resource create haproxy systemd:haproxy op monitor interval=1min [root@server3 ~]# pcs status

此时发现服务和vip不在同一节点
[root@server3 ~]# pcs resource group add hagroup vip haproxy

LAMP架构
nginx平滑升级
nginx的gcc文件做如下更改

此时server3所用nginx版本为1.30.0

下载新版本后进行解压缩并且更改文件配置和原版本一样


配置环境后新版本只用make编译,不进行安装
[root@server3 nginx-1.30.4]# cd /usr/local/nginx/sbin

[root@server3 sbin]# cp nginx nginx.bak [root@server3 sbin]# cd [root@server3 ~]# cd nginx-1.30.4 [root@server3 nginx-1.30.4]# cd objs cp -f nginx/usr/local/nginx/sbin/nginx


ps ax|grep nginx

kill -USR2 8480

此时发现nginx已经换为1.30.4,但是新旧进程同时存在

关闭原先的worker进程
kill -WINCH 8480

此时访问皆为新版本,等待新版本稳定后退出旧版本master进程
版本回退
还原nginx程序:# cp -f nginx.old nginx 唤醒原进程:# kill -HUP 8480 回收新版本的worker进程: kill -WINCH 8517 关闭新版本主进程: kill -QUIT 8517
nginx并发优化
通过更改worker_processes数量
[root@server3 ~]# cd nginx-1.30.3/ [root@server3 nginx-1.30.3]# cd /usr/local/ [root@server3 local]# cd nginx [root@server3 nginx]# cd conf/ [root@server3 conf]# vim nginx.conf

根据CPU数量更改work_processes数量

[root@server3 ~]# nginx -s reload [root@server3 ~]# ps ax|grep nginx.conf 1333 pts/0 S+ 0:00 grep --color=auto nginx.conf [root@server3 ~]# ps ax|grep nginx 1313 ? Ss 0:00 nginx: master process nginx 1320 ? S 0:00 nginx: worker process 1321 ? S 0:00 nginx: worker process 1335 pts/0 S+ 0:00 grep --color=auto nginx

修改CPU内核
[root@server3 conf]# vim nginx.conf [root@server3 conf]# nginx -s reload [root@server3 conf]# ps ax|grep nginx


修改用户进程可打开文件数限制 /etc/security/limits.conf nginx - nofile 65535

nginx作为http服务器时: max_clients = worker_processes * worker_connections nginx作为反向代理服务器时: max_clients = worker_processes * worker_connections / 2
nginx限流
控制单IP并发连接数:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
//$binary_remote_addr 表示通过remote_addr这个标识来做限制
//zone=addr:10m 表示生成一个大小为10M,名字为addr的内存区域
...
server {
location /download/ {
limit_conn addr 1; #限制并发数
limit_rate 50k; #限制带宽
}
}
限制单位时间内的请求数目,以及速度限制:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
//rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次
...
server {
location / {
limit_req zone=one;
# limit_req zone=one burst=5
# limit_req zone=one burst=5 nodelay;
}
}
nginx配置管理
自动索引:下载方便
location / {
autoindex on;
}
Nginx expire缓存配置: 缓存可以降低网站带宽,加速用户访问
location ~ .*\.(gif|jpg|png)$ {
expires 365d;
root /www;
}
日志轮询:
#cat nginxlog.sh #!/bin/bash cd /usr/local/nginx/logs && mv access.log access_$(date +%F -d -1day).log kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
禁用不必要的日志记录,以节省磁盘IO的消耗
location ~ .*\.(js|jpg|jpeg|png|css|bmp|gif)$ {
access_log off;
}
站点目录和文件的限制
location ~ ^/images/.*\.(sh|php)$ {
deny all;
}
中文乱码
charset utf-8;
限制IP
location / {
deny 172.25.0.10;
allow 172.25.0.0/24;
deny all;
}
if ($remote_addr = 172.25.0.254) {
return 403;
}
nginx重定向
防止域名恶意解析到服务器IP:
server {
listen 80;
server_name _;
return 500;
}
也可以重定向:
server {
listen 80;
server_name _;
rewrite ^(.*) http://www.westos.org permanent;
}
80重定向443:
server {
listen 80;
server_name www.westos.org;
rewrite ^/(.*)$ https://www.westos.org/$1 permanent;
}
www.westos.org/bbs 重定向bbs.westos.org:
rewrite ^/bbs$ http://bbs.westos.org permanent;
rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent;
bbs.westos.org 重定向www.westos.org/bbs:
if ($host = "bbs.westos.org"){
rewrite ^/(.*)$ http://www.westos.org/bbs/$1 permanent;
}
nginx 防盗链
location ~ \.(jpg|png)$ {
valid_referers none blocked www.westos.org;
if ($invalid_referer) {
return 403;
#rewrite ^/ http://www2.westos.org/daolian.jpg;
}
}
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)