负载均衡-LVS全解析

文章目录

负载均衡-LVS全解析

LVS介绍

Linux 虚拟服务器(LVS,Linux Virtual Servers) ,使用负载均衡技术将多台服务器组成一个虚拟服务器。 它为适应快速增长的网络访问需求提供了一个负载能力易于扩展,而价格低廉的解决方案。

LVS是 章文嵩博士 于1998年创建的一款开源负载均衡软件。LVS工作在内核空间中,能够根据请求报文 的目标IP和目标 PORT 将请求调度转发至后端服务器集群中的某节点。

LVS术语

Director:负载均衡器(入口),VS (Virtual Server)

  • VS一般配两个IP地址:VIP (向外提供服务的IP地址),DIP(与后端RS通信的IP地址)。

RS(Real Server):真实后端服务器(Nginx/APACHE/TOMCAT)

VIP:虚拟IP(用户访问的IP),向外提供服务的IP地址

DIP:与后端RS通信的IP地址。

CIP:客户端IP RIP:后端服务器IP

LVS由 ipvsadm 和 ipvs 组成

  • ipvsadm用户空间命令行工具,用于在Director上定义集群服务和添加集群上的 Real Servers。

    • LVS没有单独配置文件!
    • 所有配置通过ipvsadm命令管理。
  • ipvs:工作于**内核上 netfilter **中 INPUT 钩子上的程序代码。

要想将某台主机配置为 Director(负载均衡器),首选确保当前内核支持 ipvs 并安装 ipvsadm。另外,由 于 Director 要调度转发所有客户端的请求,负载压力较大,生产环境中Director 不要使用虚拟机。

工作原理

ipvs使用内核netfilter子系统处理进入本机器的数据包:

  1. 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间。
  2. PREROUTING 链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT 链。
  3. IPVS 是工作在 INPUT 链上的代码块。当用户请求到达 INPUT 时,IPVS 会将用户请求和自己已定义 好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里 的目标IP地址及端口,并将新的数据包发往 POSTROUTING 链。
  4. POSTROUTING 链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将 数据包最终发送给后端的服务器。

工作模式

LVS 的常用工作模式有四种,分别是:

  • lvs-nat

  • lvs-dr

  • lvs-tun

  • lvs-fullnet

NAT 模式

NAT模式(网络地址转换)特点
  • 流量来回都走LVS
  • 配置最简单
  • 性能一般,LVS会成为瓶颈
  • 适合小并发
工作方式

通过将请求报文的目标地址和目标端口修改为某RS的IP和PORT来实现报文转发。

原报文:

源 IP 源 MAC 目标 IP 目标 MAC
Client IP Client MAC Director VIP Director MAC

更改为:

源 IP 源 MAC 目标 IP 目标 MAC
Client IP Client MAC RS IP RS MAC
工作原理

1.当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报 文的源IP为CIP,目标IP为VIP。

2.PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。

3.IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,后 将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP。

4.POSTROUTING链通过选路,将数据包发送给Real Server。

  1. Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP 为RIP,目标IP为CIP。
  2. Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。
特点
  1. RS应该和DIP应该使用私网地址,且RS的网关要指向DIP;
  2. 请求和响应报文都要经由director转发;极高负载的场景中,director可能会成为系统瓶颈;
  3. 支持端口映射;
  4. RS可以使用任意OS;
  5. RS的RIP和Director的DIP必须在同一IP网络;

缺陷:对Director Server压力会比较大,请求和响应都需经过director server,director往往会成为系统 的性能瓶颈

DR 模式

DR模式(Direct Routing直接路由)特点★★★★★
  • 生产环境99%用这个
  • 请求走LVS,响应直接回客户端
  • 性能最强,几乎无瓶颈
  • 要求LVS和RS在同一个网段
工作方式

通过为请求报文重新封装一个MAC首部进行报文转发;新Mac首部的源MAC是DIP所在网卡的MAC,目 标MAC为某RS所在接口的MAC;整个过程源报文的IP首部不会发生变化(源IP为CIP,目标IP始终为 VIP);

原报文:

源 IP 源 MAC 目标 IP 目标 MAC
Client IP Client MAC Director VIP Director MAC

原报文:

源 IP 源 MAC 目标 IP 目标 MAC
Client IP Director DIP 对应的 MAC Director VIP RS MAC
工作原理
  1. 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报 文的源IP为CIP,目标IP为VIP
  2. PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
  3. IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC 地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和 目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
  4. 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP 的MAC地址,那么此时数据包将会发至Real Server。
  5. RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo 接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
  6. 响应报文最终送达至客户端
特点
  1. RS的lo网卡配置一个IP地址(地址为VIP)。

  2. 确保路由器只会把目标IP为VIP的请求报文发往Director,即会忽略RS上的VIP;

    实现方案如下:

    • 路由器静态绑定Director的VIP和MAC地址

    • 禁止RS响应VIP的ARP请求;

      (a) arptables;

      (b) 修改各RS的内核参数,并把VIP配置在特定的接口上实现禁止其响应;

  3. RS的RIP跟Director的DIP必须在同一物理网络中;RS的网关不能指向DIP

  4. RS的RIP可以使用私有地址,也可以使用公网地址;

  5. 请求报文必须由Director调度,但响应报文不经过Director,RS直接用VIP作为源IP发送响应报文;

  6. 不支持端口映射;

缺陷:RS和DS必须在同一机房中,因为它是由二层进行转发的根据MAC地址来进行匹配

TUN 模式

TUNNEL隧道模式特点
  • 跨网段、跨机房
  • 配置复杂
  • 一般公司不用
工作模式

不修改请求报文的IP首部(源IP仍为CIP,目标IP仍为VIP),而是在原有的IP首部之外再封装一个IP首部 (源IP为DIP,目标IP为RIP);

原报文:

源 IP 源 MAC 目标 IP 目标 MAC
Client IP Client MAC Director VIP Director MAC

更改为:

封装源 IP 封装目标 IP 源 IP 源 MAC 目标 IP 目标 MAC
DIP RIP Client IP Client MAC Director VIP Director MAC
工作原理
  1. 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报 文的源IP为CIP,目标IP为VIP 。
  2. PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
  3. IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装 源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP
  4. POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所 以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP
  5. RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有 一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接 口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP
  6. 响应报文最终送达至客户端
特点
  1. RIP,DIP,VIP必须都是公网地址;
  2. RS的网关不能,也不可能指向DIP;
  3. 请求报文经由Director调度,但响应报文将直接发给CIP;
  4. 不支持端口映射;
  5. RS的OS必须支持IP隧道功能;

调度算法

LVS的调度算法分为静态与动态两类。

静态算法

根据算法进行调度,不考虑后端服务器的实际连接情况和负载情况。

  • RR:轮叫调度(Round Robin) 调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每 一台服务器,而不管服务器上实际的连接数和系统负载。
  • WRR:加权轮叫(Weight RR) 调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处 理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整 其权值。
  • DH:目标地址散列调度(Destination Hash ) 根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器 是可用的且未超载,将请求发送到该服务器,否则返回空。
  • SH:源地址 hash(Source Hash) 源地址散列"调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的 服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

动态算法

前端的调度器会根据后端真实服务器的实际连接情况来分配请求。

  • LC:最少链接(Least Connections) 调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集 群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。
  • WLC:加权最少连接(默认采用的就是这种)(Weighted Least Connections) 在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡 性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负 载情况,并动态地调整其权值。
  • SED:最短延迟调度(Shortest Expected Delay ) 在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活 动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连 接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。
  • NQ永不排队/最少队列调度(Never Queue Scheduling NQ) 无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有 一个主机很空间。在SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲 着,不考虑非活动连接,才用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连 接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力。
  • LBLC:基于局部性的最少链接(locality-Based Least Connections) 基于局部性的最少链接"调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算 法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载, 将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用 "最少链接"的原则选出一个可用的服务器,将请求发送到该服务器。
  • LBLCR:带复制的基于局部性最少连接(Locality-Based Least Connections with Replication) 带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群 系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维 护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服 务器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服 务器;若服务器超载,则按"最小连接"原则从这个集群中选出一台服务器,将该服务器加入到服务 器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服 务器组中删除,以降低复制的程度。

LVS实践

ipvsadm 命令

bash 复制代码
## 定义集群服务
ipvsadm -A|E -t|u|f service-address [-s scheduler]
		[-p [timeout]] [-M netmask]
-A:                 表示添加一个新的集群服务
-E:                 编辑一个集群服务 
-t:                 表示tcp协议 
-u:                 表示udp协议 
-f:                 表示firewall-Mark,防火墙标记 
service-address:    集群服务的IP地址,即VIP 
-s                   指定调度算法
-p                   持久连接时长,如#ipvsadm -Lcn ,查看持久连接状态
-M                   定义掩码 

# 删除一个集群服务
ipvsadm -D -t|u|f service-address

# 清空所有的规则
ipvsadm -C

# 重新载入规则
ipvsadm -R

# 保存规则
ipvsadm -S [-n]

## 管理集群服务中RealServer
ipvsadm -a|e -t|u|f service-address -r server-address
			  [-g|i|m] [-w weight]
-a                添加一个新的realserver规则
-e                编辑realserver规则 
-t                tcp协议
-u                udp协议 
-f                firewall-Mark,防火墙标记 
service-address   realserver的IP地址
-g                表示定八义为LVS-DR模型
-i                表示定义为LVS-TUN模型 
-m               表示定义为LVS-NAT模型  
-w               定义权重,后面跟具体的权值  
# 删除一个realserver
ipvsadm -d -t|u|f service-address -r server-address          
# 查看定义的规则
ipvsadm -L|l [options]
ipvsadm -L -n

# 清空计数器
ipvsadm -Z [-t|u|f service-address]

NAT 模式

网络拓扑
主机名 IP 地址 网关 DNS 服务器角色
client2.mrj.cloud 10.1.1.21(vmnet1) 10.1.1.10 223.5.5.5 客户端
client1.mrj.cloud 10.1.8.21(vmnet8) 10.1.8.10 223.5.5.5 客户端
lvs.mrj.cloud (router) 10.1.1.10(vmnet1)10.1.8.10(vmnet8) 无网关10.1.8.2 无 DNS223.5.5.5 LVS 服务器、路由器
web1.mrj.cloud 10.1.8.11(vmnet8) 10.1.8.10 223.5.5.5 Web 服务器
web2.mrj.cloud 10.1.8.12(vmnet8) 10.1.8.10 223.5.5.5 Web 服务器
web3.mrj.cloud 10.1.8.13(vmnet8) 10.1.8.10 223.5.5.5 Web 服务器

网络说明:

  1. 所有主机:第一块网卡名为 ens33,第二块网卡名为 ens36
  2. 默认第一块网卡模式为nat,第二块网卡模式为hostonly
  3. 网关设置:10.1.1.0/24 网段网关为10.1.1.10,10.1.8.0/24 网段网关为10.1.8.10

注意:本次实验的网关指向 LVS 服务器。

基础配置

主机名、IP 地址、网关

bash 复制代码
# clent2:
hostnamectl set-hostname client2.mrj.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.1.21/24 ipv4.gateway 10.1.1.10 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33

# clent1:
hostnamectl set-hostname client1.mrj.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.21/24 ipv4.gateway 10.1.8.10 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33

# lvs:
hostnamectl set-hostname lvs.mrj.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.10/24 ipv4.gateway 10.1.8.2 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33
nmcli connection add type ethernet con-name ens35 ifname ens35 ipv4.method manual ipv4.addresses 10.1.1.10/24 autoconnect yes
nmcli connection up ens35

# web1:
hostnamectl set-hostname web1.mrj.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.11/24 ipv4.gateway 10.1.8.10 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33

# web2:
hostnamectl set-hostname web2.mrj.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.12/24 ipv4.gateway 10.1.8.10 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33

# web3:
hostnamectl set-hostname web3.mrj.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.13/24 ipv4.gateway 10.1.8.10 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33
配置路由
bash 复制代码
# 开启路由
[root@lvs ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@lvs ~]# systemctl enable firewalld.service --now
[root@lvs ~]# firewall-cmd --set-default-zone=trusted
success
[root@lvs ~]# firewall-cmd --add-masquerade --permanent
success
[root@lvs ~]# firewall-cmd --add-masquerade
success
配置 web

注意:所有web都要执行以下命令。

bash 复制代码
# 部署 web
[root@web1-3 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@web1-3 ~]# yum install -y nginx
[root@web1-3 ~]# echo Welcome to $(hostname) > /usr/share/nginx/html/index.html 
[root@web1-3 ~]# systemctl enable nginx.service --now

# 访问后端 nginx
[root@client1 ~]# curl 10.1.8.11
Welcome to web1.mrj.cloud
[root@client1 ~]# curl 10.1.8.12
Welcome to web2.mrj.cloud
[root@client1 ~]# curl 10.1.8.13
Welcome to web3.mrj.cloud
配置 LVS
bash 复制代码
# 安装 ipvsadm
[root@lvs ~]# yum install -y ipvsadm

# 等ipvs规则配置完成后再启动ipvsadm服务、
# ipvsadm 服务启动的时候,从该文件中读取ipvs规则
[root@lvs ~]# touch /etc/sysconfig/ipvsadm
[root@lvs ~]# systemctl enable ipvsadm --now

# 创建轮询负载
## 增加一个tcp模式虚拟IP,调度模式:轮询
[root@lvs ~]# ipvsadm -A -t 10.1.1.10:80 -s rr

# 为虚拟IP增加后端真实主机,模式masquerade(NAT)
[root@lvs ~]# ipvsadm -a -t 10.1.1.10:80 -r 10.1.8.11 -m
[root@lvs ~]# ipvsadm -a -t 10.1.1.10:80 -r 10.1.8.12 -m
[root@lvs ~]# ipvsadm -a -t 10.1.1.10:80 -r 10.1.8.13 -m

# 保存转发规则到文件中
[root@lvs ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm

# 核实配置是否生效
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.1.1.10:80 rr
  -> 10.1.8.11:80                 Masq    1      0          0         
  -> 10.1.8.12:80                 Masq    1      0          0         
  -> 10.1.8.13:80                 Masq    1      0          0

# 多次访问验证  
[root@client2 ~]# for i in {1..90};do curl -s 10.1.1.10 ;done|sort|uniq -c
    30 Welcome to web1.mrj.cloud
    30 Welcome to web2.mrj.cloud
    30 Welcome to web3.mrj.cloud

负载均衡模式更改为加权轮询。

bash 复制代码
# 修改 调度模式为:带权重的轮询
[root@lvs ~]# ipvsadm -E -t 10.1.1.10:80 -s wrr

# 设置权重为2
[root@lvs ~]# ipvsadm -e -t 10.1.1.10:80 -r 10.1.8.12 -m -w 2

# 设置权重为3
[root@lvs ~]# ipvsadm -e -t 10.1.1.10:80 -r 10.1.8.13 -m -w 3

[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.1.1.10:80 wrr
  -> 10.1.8.11:80                 Masq    1      0          30        
  -> 10.1.8.12:80                 Masq    2      0          30        
  -> 10.1.8.13:80                 Masq    3      0          30

# 多次访问验证
[root@client2 ~]# for i in {1..90};do curl -s 10.1.1.10 ;done|sort|uniq -c
15 Welcome to web1.mrj.cloud
30 Welcome to web2.mrj.cloud
45 Welcome to web3.mrj.cloud
思考
  1. 此时client1是否可以通过10.1.1.10访问后端服务器?具体原因是什么? 答案:不能访问。因为client1发出去的数据包是经过LVS的ipvs模块处理的,而后端web服务器收到 数据包后根据来源地址10.1.8.21进行回复,也就是直接返回给client1,导致数据包没有返回给LVS 处理。
  2. 如果不能,需要如何配置才能实现访问?
bash 复制代码
[root@web1-3 ~]# nmcli connection modify ens33 ipv4.routes '10.1.8.21 255.255.255.255 10.1.8.10'
[root@web1-3 ~]# nmcli connection up ens33

# 测试
[root@client1 ~]# for i in {1..90};do curl -s 10.1.1.10 ;done|sort|uniq -c
    15 Welcome to web1.mrj.cloud
    30 Welcome to web2.mrj.cloud
    45 Welcome to web3.mrj.cloud

DR 模式

网络拓扑
主机名 IP 地址 网关 DNS 服务器角色
client2.mrj.cloud 10.1.1.21(vmnet1) 10.1.1.20 223.5.5.5 客户端
client1.mrj.cloud 10.1.8.21(vmnet8) 10.1.8.20 223.5.5.5 客户端
router.mrj.cloud 10.1.1.20(vmnet1)10.1.8.20(vmnet8) 无网关10.1.8.2 无 DNS223.5.5.5 路由器
lvs.mrj.cloud 10.1.8.10(vmnet8) 10.1.8.20 223.5.5.5 LVS 服务器
web1.mrj.cloud 10.1.8.11(vmnet8) 10.1.8.20 223.5.5.5 Web 服务器
web2.mrj.cloud 10.1.8.12(vmnet8) 10.1.8.20 223.5.5.5 Web 服务器
web3.mrj.cloud 10.1.8.13(vmnet8) 10.1.8.20 223.5.5.5 Web 服务器

网络说明:

  1. 所有主机:第一块网卡名为 ens33,第二块网卡名为 ens36
  2. 默认第一块网卡模式为 nat,第二块网卡模式为 hostonly
  3. 网关设置:10.1.1.0/24 网段网关为10.1.1.20,10.1.8.0/24 网段网关为10.1.8.20
基础配置

主机名、IP 地址、网关

bash 复制代码
# clent2:
hostnamectl set-hostname client2.mrj.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.1.21/24 ipv4.gateway 10.1.1.20 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33

# clent1:
hostnamectl set-hostname client1.mrj.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.21/24 ipv4.gateway 10.1.8.20 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33

# router
hostnamectl set-hostname router.mrj.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.20/24 ipv4.gateway 10.1.8.2 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33
nmcli connection add type ethernet con-name ens35 ifname ens35 ipv4.method manual ipv4.addresses 10.1.1.20/24 autoconnect yes
nmcli connection up ens35

# lvs:
hostnamectl set-hostname lvs.mrj.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.10/24 ipv4.gateway 10.1.8.20 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33

# web1:
hostnamectl set-hostname web1.mrj.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.11/24 ipv4.gateway 10.1.8.20 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33

# web2:
hostnamectl set-hostname web2.mrj.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.12/24 ipv4.gateway 10.1.8.20 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33

# web3:
hostnamectl set-hostname web3.mrj.cloud
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.13/24 ipv4.gateway 10.1.8.20 ipv4.dns 223.5.5.5 autoconnect yes
nmcli connection up ens33
配置 router
bash 复制代码
# 开启路由
[root@router ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# 或者sed -i "s/ip_forward=0/ip_forward=1/g" /etc/sysctl.conf
[root@router ~]# sysctl -p

[root@router ~]# systemctl enable firewalld.service --now
[root@router ~]# firewall-cmd --set-default-zone=trusted
success
[root@router ~]# firewall-cmd --add-masquerade
success
[root@router ~]# firewall-cmd --add-masquerade --permanent
success
配置 web

注意:所有web都要执行以下命令。

bash 复制代码
# 部署 web
[root@web1-3 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@web1-3 ~]# yum install -y nginx
[root@web1-3 ~]# echo Welcome to $(hostname) > /usr/share/nginx/html/index.html 
[root@web1-3 ~]# systemctl enable nginx.service --now

# 访问后端 nginx
[root@client1 ~]# curl 10.1.8.11
Welcome to web1.mrj.cloud
[root@client1 ~]# curl 10.1.8.12
Welcome to web2.mrj.cloud
[root@client1 ~]# curl 10.1.8.13
Welcome to web3.mrj.cloud
配置 LVS-RS

所有后端主机都要做相同配置。

bash 复制代码
[root@web1-3 ~]#
# 增加虚拟网卡,子网掩码一定要设置为 32 位
nmcli connection add type dummy ifname dummy con-name dummy ipv4.method manual 
ipv4.addresses 10.1.8.100/32
nmcli connection up dummy
# 配置 arp 参数,关闭arp对dummy网卡的解析
cat >> /etc/sysctl.conf << EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.dummy.arp_ignore = 1
net.ipv4.conf.dummy.arp_announce = 2
EOF
sysctl -p

内核参数:net.ipv4.conf.all.arp_ignore

作用:控制主机收到 ARP 请求时,是否回复 ARP 响应(即是否告知对方 "该 IP 对应的 MAC 地址 是我")。

参数值及含义:

参数值 行为说明
0(默认) 只要本机有该 IP 地址(无论哪个网卡),就回复 ARP 响应。问题:多网卡场景下,可能导致 "ARP 漂移"(例如网卡 A 的 IP 被网卡 B 响应)。
1 仅当 ARP 请求的目标 IP 与接收请求的网卡上的主 IP 完全匹配时,才回复响应。(主 IP 指网卡配置的第一个 IP 地址)
2 仅当 ARP 请求的目标 IP 与接收请求的网卡上的任一 IP(包括 secondary IP)匹配时,才回复响应。
3 不回复 ARP 请求(除非是本地环回地址)。
4-7 更复杂的策略(如忽略来自非本网络的请求),较少使用。

典型场景:

  • 服务器有多个网卡(如 eth0、eth1),分别属于不同子网,需避免跨网卡响应 ARP 请求。
  • 配置虚拟 IP(如 Keepalived 高可用集群的 VIP)时,防止非主节点响应 VIP 的 ARP 请求。

内核参数:net.ipv4.conf.all.arp_announce

作用:控制主机发送 ARP 通告(主动告知 "我的 IP 对应的 MAC 地址")时,如何选择源 IP 地址。

参数值及含义:

参数值 行为说明
0(默认) 允许使用任意本地 IP 作为 ARP 通告的源 IP(可能选择与目标网络无关的 IP)。问题:跨子网通信时,可能导致其他主机学习到错误的 IP-MAC 映射。
1 尽量使用与目标 IP 同子网的本地 IP 作为源 IP;若没有,则使用接收接口的 IP。
2(推荐) 严格选择与目标 IP 同子网的本地 IP 作为源 IP;若没有,则不发送 ARP 通告(或使用环回地址)。

典型场景:

  • 多网卡服务器访问外部网络时,确保 ARP 通告的源 IP 属于目标网络所在的子网,避免其他主 机误将 IP 关联到错误的网卡 MAC。
  • 负载均衡或高可用集群中,防止虚拟 IP 被错误的物理网卡 MAC 通告。
配置 LVS-DS
bash 复制代码
[root@lvs ~]# 
# 配置虚拟网卡
nmcli connection add type dummy ifname dummy con-name dummy ipv4.method manual ipv4.addresses 10.1.8.100/32
nmcli connection up dummy

# 安装 ipvsadm
yum install -y ipvsadm
touch /etc/sysconfig/ipvsadm
systemctl enable ipvsadm --now

# 创建轮询负载
ipvsadm -A -t 10.1.8.100:80 -s rr
ipvsadm -a -t 10.1.8.100:80 -r 10.1.8.11:80
ipvsadm -a -t 10.1.8.100:80 -r 10.1.8.12:80
ipvsadm -a -t 10.1.8.100:80 -r 10.1.8.13:80
ipvsadm-save -n > /etc/sysconfig/ipvsadm

# 核实配置是否生效
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.1.8.100:80 rr
  -> 10.1.8.11:80                 Route   1      0          0         
  -> 10.1.8.12:80                 Route   1      0          0         
  -> 10.1.8.13:80                 Route   1      0          0  

# Forward 值为 Route,代表当前模式为 DR
访问验证
bash 复制代码
[root@client1 ~]# for i in {1..90};do curl -s 10.1.8.100 ;done|sort|uniq -c
    30 Welcome to web1.mrj.cloud
    30 Welcome to web2.mrj.cloud
    30 Welcome to web3.mrj.cloud
[root@client2 ~]# for i in {1..90};do curl -s 10.1.8.100 ;done|sort|uniq -c
    30 Welcome to web1.mrj.cloud
    30 Welcome to web2.mrj.cloud
    30 Welcome to web3.mrj.cloud
参考脚本

Real Server 配置

bash 复制代码
#!/bin/bash
# description : 配置Real Server

. /etc/rc.d/init.d/functions

VIP=10.1.8.100

case "$1" in
	start)
		echo -n "Start LVS Real Server ... "
		
		# 设置 VIP
		if nmcli connection |grep -q dummy;then
	       nmcli connection modify dummy ipv4.method manual ipv4.addresses $VIP/32
		else
          nmcli connection add type dummy ifname dummy con-name dummy ipv4.method 
manual ipv4.addresses $VIP/32
		fi
		nmcli connection up dummy
		
    # 关闭 ARP
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/dummy/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/dummy/arp_announce
    echo OK
    ;;
    stop) 
    echo -n "Stop LVS Real Server ... "
    # 关闭 VIP
    nmcli connection delete dummy
    # 启用 ARP
    echo "0" >/proc/sys/net/ipv4/conf/dummy/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/dummy/arp_announce
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
    echo OK
    ;;
    *)
    echo "Usage: $0 start|stop"
    exit 1
    ;;
esac

Director Server 配置

bash 复制代码
#!/bin/bash
# description : 配置 Director Server

. /etc/rc.d/init.d/functions

# 安装 ipvsadm
if rpm -q ipvsadm &>/dev/null;then
   true
else
   yum install -y ipvsadm &>/dev/null
fi

VIP=10.1.8.100
PORT=80
rs1=10.1.8.11
rs2=10.1.8.12
rs3=10.1.8.13
interface=ens33
con_name=ens33
ipv=/sbin/ipvsadm

case "$1" in
  start)
    echo -n "Start LVS Director Server ... "
    
    # 设置 VIP
    if ip -br addr | grep -q $VIP;then
       true
	else
	nmcli connection modify ${con_name} +ipv4.addresses $VIP/32
	nmcli connection up ${con_name}
fi

    # 设置 LB
    $ipv -C
    $ipv -A -t $VIP:${PORT} -s wrr 
    $ipv -a -t $VIP:${PORT} -r $rs1:${PORT} -g -w 1
    $ipv -a -t $VIP:${PORT} -r $rs2:${PORT} -g -w 1
    $ipv -a -t $VIP:${PORT} -r $rs3:${PORT} -g -w 1
    echo OK
    ;;
    stop)
    echo -n "Stop LVS Director Server ... "
    
    # 关闭 VIP
    if ip -br addr | grep -q $VIP;then
    nmcli connection modify ${con_name} -ipv4.addresses $VIP/32
    nmcli connection up ${con_name}
    fi
    
    # 关闭 LB
    $ipv -C
    
    echo OK
    ;;
    *)
    echo "Usage: $0 start|stop"
    exit 1
    ;;
esac
相关推荐
测试运维日常笔记3 小时前
RHEL/CentOS 离线部署指南:配置本地 ISO 镜像作为 YUM 仓库
linux·运维·centos
HiDev_3 小时前
【非标自动化】硬核阅读理解620行梯形图-逆推工位逻辑
运维·自动化
长江&后浪3 小时前
华为wlan实验-三层旁挂
运维·服务器·网络·华为
蜀道山老天师4 小时前
Zabbix监控Docker容器应用实践完整指南
linux·运维·docker·容器·zabbix
hweiyu004 小时前
Linux命令:info
linux·运维
xiaoxiangsiyan4 小时前
机房交换机交换技术与服务器链路聚合深度指南
运维·服务器·网络·学习·自动化·bond
星空4 小时前
WordPress在docker中部署
运维·docker·容器
梦想的旅途25 小时前
企微社群裂变实战:自动化群接龙与活动打卡系统搭建
运维·自动化·企业微信
Neolnfra5 小时前
使用 Netdata 给服务器增加一个实时监控面板
运维·服务器