LVS 负载均衡(Linux Virtual Server)

概念
基本概念

LVS 是章文嵩博士开发,基于 Linux 内核 Netfilter 实现的四层负载均衡(传输层,基于 IP + 端口调度)。

工作在内核态,性能极高,支持大量并发。

组成角色:

  1. VS(Virtual Server,调度器 / Director):负载均衡服务器,接收用户请求,分发后端服务器

  2. RS(Real Server,真实服务器):后端提供业务服务的服务器

  3. VIP:虚拟 IP,用户访问的统一入口

  4. RIP:真实服务器内网 IP

  5. 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 负载)

  1. RR 轮询:依次分发

  2. WRR 加权轮询:权重越高分配越多请求

  3. DH 目标地址哈希

  4. SH 源地址哈希

动态算法(感知负载)

  1. LC 最少连接

  2. WLC 加权最少连接(默认常用)

  3. 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 管控。

核心架构
  1. 仅有一张表:filter 表

  2. 两条内置链

    作用
    INPUT 进入本机的 ARP 报文
    OUTPUT 本机向外发出的 ARP 报文
  3. 常见动作

  • ACCEPT:允许 ARP 报文

  • DROP:丢弃 ARP 报文

  • RETURN:跳出当前链

主要用途
  1. 防范 ARP 欺骗、ARP 攻击,拦截非法 ARP 广播;

  2. 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,接管业务。

两大核心功能
  1. VRRP 高可用:实现 VIP 漂移,解决调度器单点故障

  2. 健康检测(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 等任意服务资源。

组件分工
  1. Corosync

    集群底层通信层。负责集群节点之间心跳通信、节点状态同步、传递成员信息;检测节点宕机。

    通信端口:5404、5405、5406。

  2. Pacemaker

    上层资源调度管理器。根据 Corosync 上报节点状态,实现:

    资源启动、停止、迁移、故障转移、资源约束。

  3. 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

配置分为:

  1. global 全局段:进程、日志、最大连接、系统参数

  2. defaults 默认段:frontend/backend 继承通用参数(超时、日志模式)

  3. frontend 前端:对外监听端口,接收客户端请求

  4. backend 后端:定义真实服务器集群、调度算法

  5. 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;
 }
 }
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐