企业级调度器LVS

news2025/5/24 10:12:51
访问效果
涉及内容:浏览拆分、 DNS 解析、反向代理、负载均衡、数据库等

集群

1.1 集群类型简介

对于⼀个业务项⽬集群来说,根据业务中的特性和特点,它主要有三种分类:
高扩展 (LB) :单个主机负载不足的时候,采取增加主机的方式来满足负载需求的解决方案。
高可用(HA):集群中的某主机失效时,避免业务中断,我们将其任务转交给其他主机的解决方案。
高性能 (HPA) :通过某些技术,实现同样资源来承受更多用户请求负载的解决方案。

1.2 扩展集群

扩展集群 (Load Balancing Cluster), 也称 " 负载均衡集群 "
它是指在当前业务环境集群中,所有的主机节点都处于正常的工作活动状态,它们共同承担起用户的请求带来的工作负载压力,保证用户的正常访问。

1.3 可用集群

可⽤集群 (High Availability Cluster) ,也称 " 主机冗余 " 集群。
它是指将 核心业务使用多台 ( 一般是 2 ) 主机共同工作,支撑并保障核心业务的正常运行,尤其是业务的对外不间断的对外提供服务。核心特点就是 " 冗余 " .
它存在的目的就是为了解决单点故障 (Single Point of Failure) 问题的。
A = MTBF / (MTBF + MTTR)
MTBF(Mean Time Between Failure), 即平均故障间隔时间,表示产品多长时间出现一次问题。
MTTR(Mean Time To Restoration) ,即平均恢复时间 产品,从故障到稳定状态的维修花费时间。
1 = 365 = 8760 小时。
90 % 的可用性 = ( 1 - 90 % ) * 365 = 36.5 , 又称 1 9

1.4 ⾼性能集群(HPA)

⾼性能集群 (High Perfermance Computing Cluster) ,也称科学计算集群。
它是基于前两种技术实现的集群基础上,将多个计算机通过高速网络连接起来,协同工作以完成复杂的计算任务或处理大量数据的系统。高效利用这些主机资源,结合某些特有的技术方案,提供的强大的计算能力,从而实现特定用户 | 大型任务的高复杂度数据处理功能,比如生物计算、大场景模拟计算、预测计算等。

1.5 集群实现细节

前置知识:OSI 七层模型
物理层 ( 网线、 MAC)
数据链路层 (ARP PPTP)
网络层 (IP ICMP)
传输层 (Port)
会话层 (Session ssl tsl rpc)
表示层 ( 各种文件格式, JPEG ASCll)
应用层 (HTTP / HTTPS 、各种应用服务 )
LVS 可以实现二~四层的负载均衡效果
Nginx 可以实现四~七等的负载均衡效果
Haproxy 可以实现四~七层的负载均衡效果
阿里云  可以实现四~七层的负载均衡效果
               
阿里云ALB(七层负载均衡),阿里云NLB(四层负载均衡),阿里云 CLB(传统型负载均衡)
               https://help.aliyun.com/zh/slb/
AWS 可以实现四~七层的负载均衡效果
               ALB(七层负载均衡),AWS NLB(四层负载均衡),AWS CLB(传统型负载均衡)
               https://aws.amazon.com/cn/elasticloadbalancing/

1.6 ⼯作的协议层次分类[M]

⼯作在传输层(四层)的负载均衡:
传输层负载均衡基于四层通用协议( TCP / UDP )进行调度
LVS
nginx (基于 stream 划模块)
haproxy (基于 tcp 模式)
阿里云 NLB CLB
AWS NLB CLB
⼯作在应⽤层(七层)的负载均衡:
应用层负载均衡通常基于应用层特定协议进行调度,又被称为 proxy server
基于 http 协议的负载均衡: nginx httpd haproxy mode http , ......
基于 fastcgi 协议的负载均衡: nginx httpd ......
基于 mysql 协议的负载均衡: mysql-proxy mycat ......

2 LVS基础

防⽕墙的五表五链

security : 对数据包的 mac 信息进行过滤
filter :对主机接收的数据包实现过滤功能,它是 iptables 的默认规则。
nat : 对主机接收的数据包实现转换功能,端口映射,地址映射等 , 使用场景比较多表。
mangle : 用于对特定数据包的修改,报文拆开,修改,封装表
raw : 特殊场景下实现的自定义规则
PREROUTING : 数据包进入路由表之前             INPUT : 通过路由表后目的地为本机
FORWARD : 通过路由表后,目的地不为本机    OUTPUT : 由本机产生,向外转发
POSTROUTIONG : 发送到网卡接口之前
效果图
数据包转发场景:
nat prerouting forwardfilter forwardnat postrouting 离开主机
数据包处理场景:
nat prerouting forwardfilter input local processroutingnat output filter output nat
postrouting 】离开主机
SNAT DNAT
⽹络数据包,我们主要是根据请求报⽂中的数据地址转换划分为 SNAT DNAT ,⽽不是响应数据包。

1.1 LVS简介

  LVS ,全称 Linux Virtual Server ,即 Linux 虚拟服务器。它是 1998 5 月由章文嵩博士发起的一个中国的开源软件项目,官方网站是 http :// www.linuxvirtualserver.org
   LVS 基于 IP 负载均衡 | 内容请求分发等技术,整合了一些特有的理念和思想后的一套解决方案。普通的 linux 主机可以基于 lvs 提供的负载均衡技术,实现一个高扩展的 linux 的服务器集群。
官方网站: http :// www.linuxvirtualserver.org /
完整资料: http :// www.austintek.com / LVS / LVS-HOWTO / HOWTO / index.html

1.2 项目结构

⼀般来说,LVS集群有三部分组成

负载调度器 (load balancer) ,负责将客户的请求调度到后端主机上。
服务器池 (server pool) ,真正响应用户请求的后端主机。
共享存储 (shared storage) ,存储配置、元数据等相关信息
LVS 集群提供了四种主要的资源调度功能:
NAT(NAT)  修改请求数据包的目标 ip 地址,实现请求转发功能
Tunneling(TUN)  给请求数据包外部增加新的 ip 首部,实现请求转发功能
DirectRouting(DR)  修改请求数据包的 mac 地址,实现请求转发功能
FULLNAT 结合 SYNPROXY 技术,修改数据包的源 ip 地址和目标 ip 地址,实现请求转发功能
1.3  常见术语
物理术语 - ⽤于描述主机的常见术语
DSDirector Server   
指的是 LVS 集群中的负责调度 (Dispatcher) 或者负载均衡 (Load Balancer) 的主机,即部署 LVS 的主机。 也称 VS(Virtual Server)
RSReal Server  
指的是这正相应用户主机的后端服务器主机。 也称 BS(Backend Server)
逻辑术语 - 用于描述逻辑关系的常见术语
VIPVirtual Server IP
LVS 主机上用于向外部用户提供服务的 ip 地址,作为用户请求的目标的 IP 地址。
它是一个在物理主机上没有物理网卡的 ip 地址,一般用于 LVS 主机的外网 ip
DIPDirector Server IP
LVS 主机上和后端提供真正服务的主机通信的 IP 地址。  
它是一个独立的物理网卡上的地址,一般用于 LVS 主机的内网 ip
RIPReal Server IP
LVS 调度主机后端,真正响应用户请求的主机 IP 地址。
CIPClient IP    
发起请求的用户客户端 IP 地址。 一般都是外网 ip 地址。
这四者之间的访问关系: CIP <--> VIP == DIP <--> RIP
实践的时候往往在 LVS 上配置两个网卡,⼀个对外,⼀个对内
为了达到不同网段的 ip 地址能够达到正常的通信,我们需要开启 linux 服务的 ip 转发功能
   
方法一:在 / etc / sysctl.conf 中开启功能    net.ipv4.ip_forward = 1    
方法二:直接修改 ip_forward 文件   echo 1 > / proc / sys / net / ipv4 / ip_forward
注意: 0 代表禁用, 1 代表开启。
1.4 工作流程
LVS 集群环境中,用户请求的处理流程如下:
1 用户在客户端发起访问服务的请求
2 经过层层的 dns 解析原理,获取服务的提供 ip 地址 -- VIP
3 客户端向 VIP 所在的 LVS 主机 (VS) 发起服务请求
4 LVS 主机 (VS) 接收到用户请求,根据自身的配置,将用户请求转交到后端的某主机 (RS)
5 用户请求经 LVS DIP 网卡,进入到公司内网环境
6 根据数据包的结构,找到真正提供服务的后端主机 (RS)
7 公司内部的后端主机,处理用户请求后,采用某种方式返回给客户端

1.3 软件环境

LVS 软件 由 2 部分程序组成: ipvs ipvsadm
ipvs(ip virtual server):一个 支持多种 IP 负载均衡技术的 IP 虚拟服务器的软件。
ipvsadm 是工作在用户空间的命令行工具,负责为 ipvs 的资源调度编写转交规则。
查看内核模块关于 ipvs 的信息
grep -i -C 2 ipvs /boot/config-6.8.0-51-generic  注:颜色的是uname -r 系统的版本号 
注:里面字符的表示含义如下
m 表现为模块方式,按需加载。
y 表现为直接内签到内核中,开机就加载。
modinfo ip_vs    # 查看模块信息

1.4 软件部署

ubuntu系统为例
apt info ipvsadm #查看版本信息
apt install ipvsadm #安装软件
dpkg -L ipvsadm #查看软件
ipvsadm --version  #查看版本信息

1.5 集群状态查看

命令格式: ipvsadm - Ln
格式详解:
- L 显示当前的服务或者目标主机信息    
- n 地址和端口的数字输出
有规则⽂件 /proc/net/ip_vs 专⻔记录这些规则信息

1.6 工作模式解读

LVS 官方支持三种工作模式,分别是 NAT 模式, DR 模式, TUN 模式
1. NAT 模式
NAT Network address translation (网络地址转换)
LVS 本质上使用的类似于 iptables 里面的 DNAT 策略
- LVS 工作于内核上,而不是 iptables 的五表五链上
整个网络环境需要涉及到两个网段:公网网段、私网网段
请求报文和响应报文都必须经由 LVS 转发, LVS 易成为系统瓶颈
- 数据包进入到私网的时候,转换的是目标 ip 地址,因为提供服务的是 RIP 主机
- 数据包进入到外网的时候,转换的是源 ip 地址,因为数据包来的时候,找的就是 VIP
RIP DIP 应在同一个 IP 网络,且应使用私网地址;
- 由于数据包在流转的时候,尤其是 RS 响应的数据包要走到 lvs 主机,所以必须 配置网关地址DIP
- 支持端口映射,可修改请求报文的目标 PORT
其他内容
- VS 必须是 Linux 系统, RS 可以是任意 OS 系统
- LVS 主机需要开启 ip_forward 转发
小结
NAT 双网段  来去数据包流经LVS主机    LVS主机开启数据包转发
2. DR 模式
DR Direct Routing(直接路由)
LVS 默认模式 ,应用广泛,通过为请求报文重新封装一个 MAC 首部进行转发,源 MAC DIP 所在的接口的 MAC ,目标 MAC 是某挑选出的 RS RIP 所在接口的 MAC 地址;源 IP/ PORT ,以及目标 IP / PORT 均保持不变,但源 MAC 和目标 MAC 会发生改变, DR 模式下,数据链路层之上的内容不会发生变化。
DR模式的特点
LVS 服务器 和 RS 服务器 上都配置有 VIP 地址
RS RIP 可以使用私网地址,也可以是公网地址
LVS 服务器只处理请求报文,不处理响应报文
RS 服务器可以使用大多数 OS 系统(支持相关网络设置即可)
3 TUN 模式
TUN IP tunneling IP 隧道)
 TUN 模式不修改请求报文的 IP 首部(源 IP CIP ,目标 IP VIP ),而是在原 IP 报文之外再封装一个 IP 首部 (源 IP DIP ,目标 IP RIP ),再将报文发往后端 RS RS 直接响应客户端(源 IP VIP ,目标 IP CIP ), TUN   模式与 DR 模式的区别是 TUN 模式下 LVS 服务器和后端 RS 可以不在同一个物理网络,可以跨公网。
相较于 DR 模型来说,它修改的是 更深层的 ip 报文,所以性能有些差。但是好处是可以跨网络。

3 调度分类

lvs 的调度算法,站在 " 是否考虑到后端主机负载 " 的⻆度可以划分为以下三类
静态方法:仅仅从调度策略本身实现的功能角度进行工作  RR WRR DH SH
RR Round Robin ,轮询算法
WRR Weight RR ,加权轮询算法
SH Source Hash ,源 IP 地址 hash
DH Destinatio Hash ,目标 IP 地址 hash
动态方法:在满足调度策略本身实现功的前提下,还要考虑后端主机的动态负载效果
LC WLC LBLC LBLCR SED NQ
LC Least Connections ,最少连接算法
WLC Weighted Least Connections ,加权最少连接算法,此算法是 LVS 默认调度算法
SED Shortest Expected Delay ,最短延迟调度算法,此算法是 WLC 算法的改进版
LBLC Locality-Based Least Connections ,基于局部性的最少链接调度算法
LBLCR Locality-Based Least Connections with Replication ,带复制的基于局部性的最少链接调度算法
高版本内核中新增的调度算法 : 4.15 版本的内核中新增的方法     FO OVF MH TNDR
FO Weighted Fail Over ,权重过载算法
OVF Overflow-connection ,溢出连接算法
MH Masquerading Hashing ,源 IP 地址 hash
TNDR Two Node Direct Routing ,直接路由调度,而不使用 NAT 网络转换

4 LVS实践

1.增加集群
命令格式: ipvsadm - A - t | u | f service_address : port [ - s scheduler] [ - p [timeout]]
格式详解:    
- A 增加 lvs 集群   
- t 指定 lvs 主机地址信息       
        - t 指定 lvs 集群服务主机的 tcp 端口     
        - u 指定 lvs 集群服务主机的 udp 端口        
         -f 指定 lvs 集群服务主机采用的防火墙自定义规则的标记,默认是数字       
- s 指定 lvs 集群的调度策略,默认是 wlc
例:
ipvsadm - A - t 192.168.8.14 : 80
ipvsadm - A - t 192.168.8.15 : 80
2.编辑集群
命令格式: ipvsadm - E - t service_address : port [ - s scheduler]
格式详解:
- E 编辑 lvs 集群的信息
注意: 更改集群信息的时候,只能更改已存在的 lvs 集群的细节属性,不能直接将 lvs 的地址更改
例:
ipvsadm - E - t 192.168.8.15 : 80 - s lc
ipvsadm - E - t 192.168.8.14 : 80 - p 30
3.删除集群
命令格式: ipvsadm - D - t service_address : port
格式详解:
- D 删除指定 lvs 集群的信息
- C 删除所有 lvs 集群的信息
   
注意: 删除集群信息的时候,必须指定已存在的 lvs 集群地址,协议也必须正确
例:
方法 1
ipvsadm - D - t 192.168.8.14 : 80
ipvsadm - D - t 192.168.8.15 : 80
方法 2
ipvsadm - C
4.主机命令
增加主机
命令格式: ipvsadm - a - t service_address : port - r server-address : port - g | m | i [options]
格式详解:
   
- a lvs 集群增加一个真实主机 RS    
- r 指定真实主机的地址信息,格式是 IP : [Port],Port 可以省略    
- g | m | i 设定后端主机的转发模式        
    - g 采用默认的 direct routing 模式       
    - m 采用 masquerading nat 模式        
     - i 采用 ipip tunneling 模式
      三者只能选择其一    
- w 指定真实主机的权重信息
例:
ipvsadm - A - t 192.168.8.14 : 80
ipvsadm - a - t 192.168.8.14 : 80 - r 192.168.8.16
ipvsadm - a - t 192.168.8.14 : 80 - r 192.168.16
ipvsadm - a - t 192.168.8.14 : 80 - r 192.168
添加主机的时候,增加扩展属性
- r 指定 RS 主机端口的效果,只有采用 - m 参数的时候会生效,否则都使用默认的 80 端口
ipvsadm - a - t 192.168.8.14 : 80 - r 192.168.8.15 : 88
ipvsadm - a - t 192.168.8.14 : 80 - r 192.168.8.15 : 88 - m
ipvsadm - a - t 192.168.8.14 : 80 - r 192.168.8.15 : 89 - m - w 3
注意:
在向 lvs 集群中增加真实主机的话,一定要保证指定的 lvs 集群地址存在而且正确。
lvs 本质上是一种网络扩展方案,即使网络不通,也可以随意增加真实主机的地址,只是不能用。
- r 指定 RS 主机端口的效果,只有采用 - m 参数的时候会生效,否则都使用默认的 80 端口。
编辑主机
命令格式: ipvsadm - e - t service_address : port - r server-address : port [options]
格式详解:    
- e 修改真实主机的属性信息    
- m 设定真实主机的转发模型信息为 nat 模型
   
注意:
修改真实主机信息的时候,必须指定已存在的 lvs 集群地址,协议也必须正确
- m - i 不能同时使用
ipvsadm - e - t 192.168.8.14 : 80 - r 192.168.8.16 : 80 - m # 转换成 NAT 模式
注意:  Tun 转发模式的标志是 Tunnel Nat 转发模式的标志是 Masq
对非默认端口的 RS 主机使用 - i ,它只会对同 ip 的默认 80 端口生效
如果想让 Rs 主机的模式从 nat 模式转换为其他模式的话,⽆法直接修改,只能先删后增。
删除主机
命令格式: ipvsadm - d - t service_address : port - r server-address : port
格式详解:    
- d 删除真实主机的属性信息
注意:
       lvs 服务主机和 rs 真实主机的地址必须指定正确        
单个删除 RS 主机有些繁琐,我们可以直接采用删除 lvs 主机的效果清空所有目标主机
单个清理主机
ipvsadm - d - t 192.168.8.14 : 80 - r 192.168.8.15 : 89
ipvsadm - d - t 192.168.8.14 : 80 - r 192.168.8.16
ipvsadm - d - t 192.168.8.14 : 80 - r 192.168.16
ipvsadm - d - t 192.168.8.14 : 80 - r 192.168
规则命令
对于 ipvsadm 来说,我们可以通过 ipvsadm-save 的命令来查看和保存 lvs 的相关规则。
命令格式: ipvsadm-save [ - n]
格式详解:    
- n 以精确的数字格式打印出 lvs 规则,如果不加 - n 的话,他会基于域名解析,将相应的 ip 转换成主机名展示 使用 ipvsadm - Sn 可以实现同样的效果
保存规则
通过 ipvsadm-save + > 的方式实现 规则的保存
ipvsadm-save - n > n-ipvsadm
ipvsadm-save > non-ipvsadm
清空规则
命令格式: ipvsadm - C
格式详解:
- C 清空 lvs 服务集群规则
导⼊规则
命令格式: ipvsadm-restore < 规则文件
注意:    
我们在导入的规则的时候,如果备份是基于主机名的 lvs 规则,主机名解析记录的正确与否很关键。 我们使用 ipvsadm - R 也可是实现同样的效果
导⼊ 携带 -n 的备份规则⽂件
ipvsadm-restore < n-ipvsadm
规则保存
对于 ipvsadm 设置的规则来说,它是我们操作 lvs 规则的常⻅⽅法,⽽且是以命令⾏的⽅式来运⾏的,但是这种命令⾏编写的规则,好处就是灵活⽣效快,但是缺点就是重启主机后规则⾃动清空。
准备规则
ipvsadm -A -t 192.168.8.14:80
ipvsadm -A -t 192.168.8.15:80
ipvsadm -a -t 192.168.8.15:80 -r 192.168.8.17
ipvsadm -a -t 192.168.8.14:80 -r 192.168.8.18

cat /etc/ipvsadm.rules  #查看默认的规则保存⽂件
service ipvsadm save   #保存规则

增加⼀条规则
ipvsadm -a -t 192.168.8.14:80 -r 10.0.0.130 -m -w 30
ipvsadm -Ln

保存新规则到规则⽂件
ipvsadm-save -n > /etc/ipvsadm.rules
cat /etc/ipvsadm.rules

但是这种⽅式保存服务后,重启主机后,默认不会⾃动加载
reboot
ipvsadm -Ln

代码实现效果如下

但是这种⽅式保存服务后,重启主机后,默认不会⾃动加载
开机自动加载方式1
修改 ipvsadm 的配置⽂件
root @ubuntu24-13: ~ # vim /etc/default/ipvsadm
# if you want to start ipvsadm on boot set this to true
AUTO = "true" # false 改为 true
重启主机后,可以看到会⾃动加载规则⽂件
开机自动加载方式2
root @ubuntu24-13: ~ # cat /etc/rc.local
#!/bin/bash
ipvsadm-restore < / etc / ipvsadm.rules
为该文件增加执行权限
root @ubuntu24-13: ~ # chmod +x /etc/rc.local
Rocky系统规则保存策略
ipvsadm - A - t 192.168.8.14 : 80
ipvsadm - A - t 192.168.8.15 : 80
ipvsadm - a - t 192.168.8.15 : 80 - r 192.168.8.17
ipvsadm - a - t 192.168.8.14 : 80 - r 192.168.8.18
ipvsadm-save - n > / etc / sysconfig / ipvsadm   #保存规则
systemctl enable ipvsadm.service    #设置为开启⾃启

5 防⽕墙标识

FWM:FireWall Mark  

LVS Linux Virtual Server )的防火墙标记 FWM Firewall Mark )是一种用于在 LVS 负载均衡环境中对报文进行分类和管理的技术。
功能定制
1 使⽤ iptables 定义防⽕墙标记
Director 主机上执行命令
iptables - t mangle - A PREROUTING - d $vip - p $proto m multiport -- dports $port1 , $port2 ,
- j MARK -- set-mark NUMBER
命令解析
- t mangle 指定操作的是 mangle 表;
- A PREROUTING 将规则追加到 PREROUTING 链;
- d $vip 指定目标地址为 LVS VIP 地址;
- p $proto 指定协议;
- m multiport -- dports $port1 , $port2 , 指定目标端口;
- j MARK -- set-mark NUMBER 表示执行 MARK 动作并设置标记值为 NUMBER
2 基于标记定义集群服务
Director 主机上执行命令
ipvsadm - A -f NUMBER (options)
命令解析
- A 表示添加一个新的集群服务,
-f NUMBER 指定基于标记 NUMBER 来定义集群,
(options) 可设置调度算法等其他选项。
3 iptables 命令实践
对于 ubuntu 服务器版本的话,默认没有 iptables 命令
apt install iptables
iptables - t mangle - A PREROUTING - d 192.168.8.13 - p tcp - m multiport -- dports 80 , 443 - j MARK
-- set-mark 10     # 定制防⽕墙标记
定制转发规则
ipvsadm - C
ipvsadm - A -f 10 - s rr
ipvsadm - a -f 10 - r 192.168.8.7 - g
ipvsadm - a -f 10 - r 192.168.8.17 - g
解释上面的命令
效果如下: FWM 10 rr就是上面要求的结果。FWM 11 wlc 是不加-s 调度策略,直接使⽤默认的调度策略结果。

6 NAT实践[M]

前提操作条件
注意:    
为了避免网络效果出错,我们应该讲宿主机上的 vmnet1 网卡信息给清空掉或者直接将网卡禁用    
后端主机在没有网的情况下部署 web ,采用系统镜像的方式来安装。
最终达到的效果
[root @rocky9-12 ~ ] # curl 10.0.0.13
< h1 > hello RS2 </ h1 >
[root @rocky9-12 ~ ] # curl 10.0.0.13
< h1 > hello RS1 </ h1 >
[root @rocky9-12 ~ ] # curl 10.0.0.13
< h1 > hello RS2 </ h1 >
[root @rocky9-12 ~ ] # curl 10.0.0.13
< h1 > hello RS1 </ h1 >
配置主机⽹络环境
各个主机的⽹卡设备基本配置
定制lvs-client主机ip   (略 不用更改)
定制lvs-server主机ip
定制⽹卡配置, ens33 NAT 模式, ens37 是仅主机模式,仅主机模式不⽤配置⽹关
root@ubuntu24-13:~# cat /etc/netplan/50-cloud-init.yaml
network:
    version: 2
    ethernets:
        ens33:
            addresses:
            - 10.0.0.13/24
            nameservers:
                addresses:
                - 10.0.0.2
            routes:
            -   to: default
                via: 10.0.0.2
        ens37:
            addresses:
            - 192.168.8.13/24
netplan apply  重启生效
定制lvs-RS1主机ip
定制网卡服务
[root@openeuler-14 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.8.14
PREFIX=24

[root@openeuler-14 ~]# nmcli connection down ens33       关闭网卡的连接
[root@openeuler-14 ~]# systemctl restart NetworkManager  重启网卡服务
定制lvs-RS2主机ip
定制⽹卡服务
[root@rocky9-15 ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
type=ethernet
autoconnect-priority=-999
interface-name=ens160
[ipv4]
address1=192.168.8.15/24
method=manual

[root@rocky9-15 ~]# nmcli connection down ens160       关闭网卡的连接
[root@rocky9-15 ~]# systemctl restart NetworkManager   重启网卡服务
lvs-server主机定制数据包转发
定制内核参数
root@ubuntu24-13:~# cat /etc/sysctl.d/forward.conf
net.ipv4.ip_forward = 1
root@ubuntu24-13:~# sysctl -p /etc/sysctl.d/forward.conf
net.ipv4.ip_forward = 1

测试效果
root@ubuntu24-13:~# sysctl -a | grep ip_forw
net.ipv4.ip_forward = 1
RS1和RS2 主机定制⽹关
注意:如果⽹关不指向 lvs 主机的 ip 地址,那么数据包交给其他主机,导致数据包⽆法原路通过 lvs 返回出去。但是因为他们属于同⼀个⽹段,数据包还是可以抓取到的,只不过没有意义⽽已。
[root @openeuler-14 ~ ] # ip route add default via 192.168.8.13
[root @openeuler-14 ~ ] # ip route list
default via 192.168.8.13 dev ens33
[root @rocky9-15 ~ ] # ip route add default via 192.168.8.13
[root @rocky9-15 ~ ] # ip route list
default via 192.168.8.13 dev ens160
RS1和RS2主机 定制本地镜像服务
挂载磁盘
[root @openeuler-14 ~ ] # mkdir /image
[root @openeuler-14 ~ ] # mount /dev/cdrom /image/
mount : / image : WARNING : source write-protected, mounted read-only.
定制软件源
[root @openeuler-14 ~ ] # mv /etc/yum.repos.d/openEuler.repo{,.bak}
[root @openeuler-14 ~ ] # cat > /etc/yum.repos.d/openEuler.repo <<-eof
[local_openeuler]
name = Local OpenEuler Repository
baseurl = file :/// image
enabled = 1
gpgcheck = 0
eof
更新软件源
[root @openeuler-14 ~ ] # yum makecache
关闭防⽕墙服务和selinux
[root @openeuler-14 ~ ] # systemctl disable --now firewalld.service
[root @openeuler-14 ~ ] # setenforce 0
部署httpd服务
[root @openeuler-14 ~ ] # yum install -y httpd vim
[root @openeuler-14 ~ ] # echo '<h1>hello RS1</h1>' > /var/www/html/index.html
[root @openeuler-14 ~ ] # systemctl start httpd
挂载磁盘
[root @rocky9-15 ~ ] # mkdir /image
[root @rocky9-15 ~ ] # mount /dev/cdrom /image
mount : / image : WARNING : source write-protected, mounted read-only.
定制软件源
[root @rocky9-15 ~ ] # mkdir /etc/yum.repos.d/bak
[root @rocky9-15 ~ ] # mv /etc/yum.repos.d/rocky* /etc/yum.repos.d/bak/
[root @rocky9-15 ~ ] # cat > /etc/yum.repos.d/rocky.repo <<-eof
[local-rocky-baseos]
name = Local Rocky 9.4 BaseOS Repository
baseurl = file :/// image / BaseOS
enabled = 1
gpgcheck = 0
[local-rocky-appstream]
name = Local Rocky 9.4 AppStream Repository
baseurl = file :/// image / AppStream
enabled = 1
gpgcheck = 0
eof
更新软件源
[root @rocky9-15 ~ ] # yum makecache
(下面的操作跟RS1上的操作一样 略)
lvs-server主机定制集群
root @ubuntu24-13: ~ # apt install ipvsadm  安装ipvsadm
定制lvs集群服务
root @ubuntu24-13: ~ # ipvsadm -A -t 10.0.0.13:80 -s rr
增加RS主机列表
root @ubuntu24-13: ~ # ipvsadm -a -t 10.0.0.13:80 -r 192.168.8.14 -m
root @ubuntu24-13: ~ # ipvsadm -a -t 10.0.0.13:80 -r 192.168.8.15 -m
注意: 我们这里用的是 nat 模式,所以再添加 RS 主机的时候,需要使用 - m 选项
客⼾端访问 lvs 的对外 ip 地址
[root @rocky9-12 ~ ] # curl 10.0.0.13
< h1 > hello RS2 </ h1 >
[root @rocky9-12 ~ ] # curl 10.0.0.13
< h1 > hello RS1 </ h1 >
[root @rocky9-12 ~ ] # curl 10.0.0.13
< h1 > hello RS2 </ h1 >
[root @rocky9-12 ~ ] # curl 10.0.0.13
< h1 > hello RS1 </ h1 >
结果显示:可以看到实现了流量的正常转发效果
按照我们刚才的实验情况:这四类 IP 的具体情况如下:
CIP 10.0.0.12 VIP 10.0.0.13 DIP 192.168.8.13
RIP1 192.168.8.14 RIP2 192.168.8.15
1 用户向具有公网 ip 地址的 LVS 主机地址 (VIP) 发起请求, (Src = CIP Dst = VIP)
2 LVS 主机接收到数据包后,修改数据包的目标地址为后端 RS1 主机并转发出去, (Src = CIP Dst = RIP1)
3 后端 RS1 主机处理完请求后,返回数据包给 LVS 主机, (Src = RIP1 Dst = CIP)
4 LVS 主机接收到数据包后,修改数据包的源地址为 LVS 的公网地址 (VIP) 并转发出去, (Src = VIP Dst = RIP1)
抓取数据包
yum install tcpdump -y   安装    在除了客户机上的所有主机进行安装
tcpdump -nn -i ens160   抓包    网卡 不是唯一的 根据网卡的实际名字进行修改 两个网卡选NAT的
curl 10.0.0.13 【在客户机上进行测试】
得到如下结果

7 多业务NAT实践

⼀个 lvs 调度器,实现多种不同业务集群的负载均衡
主机资源
未完待续。。。

8 DR实践[M]

注意:给单⽹卡的 RS 主机设置多 ip ,可以基于⽹卡别名⽅式,因为有现成的 lo 回环⽹卡,我们直接给 lo 配置也可以。
实践效果
[root @rocky9-12 ~ ] # curl 192.168.8.100
< h1 > hello RS2 </ h1 >
[root @rocky9-12 ~ ] # curl 192.168.8.100
< h1 > hello RS1 </ h1 >
注意: 保障80端口开启 最好是在未再仅主机的情况下进行安装nginx,tomcat等80端口的应用。
1 lvs-route主机操作内容
查看网卡配置
root@ubuntu24-13:~# cat /etc/netplan/50-cloud-init.yaml
network:
    version: 2
    ethernets:
        ens33:
            addresses:
            - 10.0.0.13/24
            nameservers:
              addresses:
                - 10.0.0.2
            routes:
              - to: default
                via: 10.0.0.2
        ens37:
            addresses:
            - 192.168.8.13/24

root@ubuntu24-13:~# netplan apply
2 定制 lvs-server 主机 ip
[root@openeuler-14 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens160

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes

NAME=ens160
UUID=0608a126-3c6e-49f5-b39d-962443bcdb92
DEVICE=ens160
ONBOOT=yes
IPADDR=192.168.8.14
PREFIX=24

[root@openeuler-14 ~]#systemctl restart NetworkManager
[root@openeuler-14 ~]# ip a add 192.168.8.100/32 dev ens160
lvs-server vip 最好配置到 ens160 上面,因为要通信,外面主机只能将信息发送到 ens160
定制 lvs-RS1 主机 ip
lvs-rs1和lvs-rs2 主机定制 lo ⽹卡 ip 地址
[root @rocky9-15  ~ ] # ip a add 192.168.8.100/32 dev lo
[root @rocky9-18  ~ ] # ip a add 192.168.8.100/32 dev lo
vip 地址测试
因为 lvs server 主机上,默认将互联⽹通信隔开了,所以 arping 命令⽆法安装
同时因为 lvs 主机上已经定制 lo ⽹卡的 ip 地址,所以,不能在 lvs 主机上直接测试 arp 的效果,否则会发⽣如下报错
[root @rocky9-18  ~] # arping 192.168.8.100
网络接口 lo 不适用 ARP
可以通过指定⽹卡的⽅式来测试
[root @rocky9-18  ~ ] # arping -I ens160 192.168.8.100
结果显示: 在该网段下,同时有 4 台主机存在 192.168.8.100 ip 地址。
基础环境配置
[root @rocky9-12 ~ ] # ip route del default # 删除默认的路由
[root @rocky9-12 ~ ] # ip route add default via 10.0.0.13 # 设定默认的路由,实现流量的发送
[root @rocky9-12 ~ ] # ip route list
default via 10.0.0.13  dev ens160
10.0.0.0 / 24 dev ens160 proto kernel scope link src 10.0.0.12 metric 100
lvs-route 主机基础⽹络环境配置
lvs-route 主机定制数据包转发
定制内核参数
vim /etc/sysctl.d/forward.conf     net.ipv4.ip_forward = 1
sysctl -p /etc/sysctl.d/forward.conf
sysctl -a | grep ip_forw   #测试效果
lvs-route 定制流向 lvs的⽹关地址ip route list
结果显示: 存在默认的内网通信路由信息,所以无需定制路由
lvs-server 主机定制数据包转发 (同上操作 略)
定制路由策略  
ip route add default via 192.168.8.13
ip route list
RS1 主机定制⽹络环境
lvs-rs1 主机定制默认的⽹关出⼝为 lvs 主机
ip route del default
ip route add default via 192.168.8.13
ip route list
lvs-rs1 主机定制 arp 策略
echo 1 > / proc / sys / net / ipv4 / conf / lo / arp_ignore
echo 2 > / proc / sys / net / ipv4 / conf / lo / arp_announce
echo 1 > / proc / sys / net / ipv4 / conf / all / arp_ignore
echo 2 > / proc / sys / net / ipv4 / conf / all / arp_announce
注意:
关于 arp 的抑制,需要具体的网卡和 all 搭配使用才生效,
all 相当于兜底的策略。
RS2 主机定制⽹络环境
lvs-rs2 主机定制默认的⽹关出⼝为 lvs 主机
ip route del default
ip route add default via 192.168.8.13
ip route list
lvs-rs2 主机定制 arp 策略
echo 1 > / proc / sys / net / ipv4 / conf / lo / arp_ignore
echo 2 > / proc / sys / net / ipv4 / conf / lo / arp_announce
echo 1 > / proc / sys / net / ipv4 / conf / all / arp_ignore
echo 2 > / proc / sys / net / ipv4 / conf / all / arp_announce
注意:这⼀步的⽹关地址定制操作,统统可以忽略,默认的⽹关策略都可以直接使⽤。这⾥定制⽹关的⽬的是便于后续数据包的抓取分析。
客⼾端主机定制⽹关
lvs-client 主机定制默认的⽹关出⼝为 lvs 主机
ip route del default    # 删除默认的路由
ip route add default via 10.0.0.13   # 设定默认的路由,实现流量的发送
ip route list
lvs-server 主机定制集群
ipvsadm -C
ipvsadm - A - t 192.168.8.100 : 80
ipvsadm - a - t 192.168.8.100 : 80 - r 192.168.8.14
ipvsadm - a - t 192.168.8.100 : 80 - r 192.168.8.15
ipvsadm - a - t 192.168.8.100 : 80 - r 192.168.8.17
注意:
我们这里用的是 dr 模式,所以添加 RS 主机的时候,不需要加 - g 选项,因为默认就是 - g 选项
ipvsadm -Ln
客⼾端访问 lvs 的对外 ip 地址
[root @rocky9-12 ~ ] # curl 192.168.8.100
< h1 > hello RS2 </ h1 >
[root @rocky9-12 ~ ] # curl 192.168.8.100
< h1 > hello RS1 </ h1 >
结果显⽰: lvs 实现了多集群的负载均衡效果
1 基础的网络配置很重要, lvs-server 和所有 Rs 在同一个私网内
2 客户端的网关配置、内网主机的网关配置对数据包的流转很重要
3 VIP 的配置以及 ip 冲突的措施
3 配置 ipvs 规则的时候,记住要使用 - g( 可以省略 ) 参数。
​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2384521.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Web前端】HTML网页编程基础

HTML5简介与基础骨架 HTML5是用来描述网页的一种语言&#xff0c;被称为超文本标记语言。用HTML5编写的文件&#xff0c;后缀以.html结尾 HTML是一种标记语言&#xff0c;标记语言是一套标记标签。标签是由尖括号包围的关键字&#xff0c;例如<html> 标签有两种表现形…

阿里开源 CosyVoice2:打造 TTS 文本转语音实战应用

1、引言 1.1、CosyVoice2 简介 阿里通义实验室推出音频基座大模型 FunAudioLLM,包含 SenseVoice 和 CosyVoice 两大模型。 CosyVoice:模拟音色与提升情感表现力 多语言 支持的语言: 中文、英文、日文、韩文、中文方言(粤语、四川话、上海话、天津话、武汉话等)跨语言及…

RabbitMQ可靠传输——持久性、发送方确认

一、持久性 前面学习消息确认机制时&#xff0c;是为了保证Broker到消费者直接的可靠传输的&#xff0c;但是如果是Broker出现问题&#xff08;如停止服务&#xff09;&#xff0c;如何保证消息可靠性&#xff1f;对此&#xff0c;RabbitMQ提供了持久化功能&#xff1a; 持久…

无人机开启未来配送新篇章

低空物流&#xff08;无人机物流&#xff09;是利用无人机等低空飞行器进行货物运输的物流方式&#xff0c;依托低空空域&#xff08;通常在120-300米&#xff09;实现快速、高效、灵活的配送服务。它是低空经济的重要组成部分&#xff0c;广泛应用于快递配送、医疗物资运输、农…

Qt状态机QStateMachine

QStateMachine QState 提供了一种强大且灵活的方式来表示状态机中的状态&#xff0c;通过与状态机类(QStateMachine)和转换类(QSignalTransition&#xff0c; QEventTransition)结合&#xff0c;可以实现复杂的状态逻辑和用户交互。合理使用嵌套状态机、信号转换、动作与动画、…

Java详解LeetCode 热题 100(20):LeetCode 48. 旋转图像(Rotate Image)详解

文章目录 1. 题目描述2. 理解题目3. 解法一&#xff1a;转置 翻转3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 适用场景 4. 解法二&#xff1a;四点旋转法4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 适用场景 5. 详细步骤分析与示例跟踪5.1 解法一&a…

CAU人工智能class4 批次归一化

归一化 在对输入数据进行预处理时会用到归一化&#xff0c;将输入数据的范围收缩到0到1之间&#xff0c;这有利于避免纲量对模型训练产生的影响。 但当模型过深时会产生下述问题&#xff1a; 当一个学习系统的输入分布发生变化时&#xff0c;这种现象称之为“内部协变量偏移”…

Android11以上通过adb复制文件到内置存储让文件管理器可见

之前Android版本如果需要将文件通过adb push放到内置存储&#xff0c;push到/data/media/10下的目录即可&#xff0c;直接放/sdcard/文件管理器是看不到的。 现在最新的Android版本直接将文件放在/sdcard或/data/media/10下文件管理器也看不到 可以将文件再复制一份到一下路径…

篇章二 需求分析(一)

目录 1.知名MQ 2.需求分析 2.1 核心概念 2.2 生产者消费者模型的类别 2.3 BrokerServer 内部的关键概念&#xff08;MQ&#xff09; 1.虚拟主机&#xff08;Virtual Host&#xff09; 2.交换机&#xff08;Exchange&#xff09; 3.队列&#xff08;Queue&#xff09; 4…

图解深度学习 - 机器学习简史

前言 深度学习并非总是解决问题的最佳方案&#xff1a;缺乏足够数据时&#xff0c;深度学习难以施展&#xff1b;某些情况下&#xff0c;其他机器学习算法可能更为高效。 若初学者首次接触的是深度学习&#xff0c;可能会形成一种偏见&#xff0c;视所有机器学习问题为深度学…

Gmsh 代码深度解析与应用实例

在科学计算与工程仿真领域&#xff0c;Gmsh 是一款广受欢迎的开源有限元网格生成器&#xff0c;它不仅支持复杂的几何建模&#xff0c;还能高效生成高质量的网格&#xff0c;并具备强大的后处理功能。本文将深入解析几段具有代表性的 Gmsh 代码&#xff0c;从基础几何创建到高级…

49页 @《人工智能生命体 新启点》中國龍 原创连载

《 人工智能生命体 新启点 》一书&#xff0c;以建立意识来建立起生命体&#xff0c;让其成为独立、自主的活动个体&#xff1b;也就可以理解为建立生命体的思想指导。 让我们能够赋予他灵魂&#xff01;

量化研究---bigquant策略交易api研究

api接口来平台的代码整理&#xff0c;原理是读取bigquant的模拟测试信号&#xff0c;下单&#xff0c;可以完美的对接qmt交易&#xff0c;我优化了交易api的部分内容 我开发对接qmt的交易系统 看api源代码 源代码 # 导入系统包 import os import json import requests from ty…

编译原理 期末速成

一、基本概念 1. 翻译程序 vs 编译程序 翻译程序的三种方式 编译&#xff1a;将高级语言编写的源程序翻译成等价的机器语言或汇编语言。&#xff08;生成文件&#xff0c;等价&#xff09;解释&#xff1a;将高级语言编写的源程序翻译一句执行一句&#xff0c;不生成目标文件…

echarts之漏斗图

vue3echarts实现漏斗图 echarts中文官网&#xff1a;https://echarts.apache.org/examples/zh/index.html 效果图如下&#xff1a; 整体代码如下&#xff1a; <template><div id"funnelChart" style"width:100%;height:400px;"></div&g…

零基础设计模式——第二部分:创建型模式 - 原型模式

第二部分&#xff1a;创建型模式 - 5. 原型模式 (Prototype Pattern) 我们已经探讨了单例、工厂方法、抽象工厂和生成器模式。现在&#xff0c;我们来看创建型模式的最后一个主要成员——原型模式。这种模式关注的是通过复制现有对象来创建新对象&#xff0c;而不是通过传统的…

java 进阶 1.0.3

Thread API说明 自己滚去看文档 CPU线程调度 每一个线程的优先使用权都是系统随机分配的&#xff0c;人人平等 谁先分配到就谁先用 也可以耍赖&#xff0c;就是赋予某一个线程拥有之高使用权&#xff1a;优先级 这样的操作就叫做线程调度 最基本的是系统轮流获得 java的做法是抢…

从 Docker 到 runC

从 Docker 到 runC:容器底层原理详解 目录 1. Docker 与 runC 的关系 2. Docker 的核心组件 3. runC 的核心功能 4. 实战示例:从 Docker 到 runC 4.1 示例场景:运行一个简单容器 4.2 Docker 底层调用 runC 的流程 4.3 查看 runC 的调用 4.4 直接调用 runC 创建容器 …

PET,Prompt Tuning,P Tuning,Lora,Qlora 大模型微调的简介

概览 到2025年&#xff0c;虽然PET&#xff08;Pattern-Exploiting Training&#xff09;和Prompt Tuning在学术界仍有探讨&#xff0c;但在工业和生产环境中它们已基本被LoRA/QLoRA等参数高效微调&#xff08;PEFT&#xff09;方法取代 。LoRA因其实现简单、推理零开销&#…

02-jenkins学习之旅-基础配置

0 配置主路径 jenkins安装目录下找到jenkins.xml文件&#xff0c;C:\ProgramData\Jenkins\.jenkins目录下会存放jenkins相关的配置信息。 1 jdk配置 jenkins是java开发开源的项目&#xff0c;进而服务器需要jdk环境 1.1 服务器安装jdk 1.2 jenkins jdk配置 2 git配置 在je…