企业级调度器LVS

访问效果

涉及内容:浏览拆分、 DNS 解析、反向代理、负载均衡、数据库等

1集群

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 】离开主机
SNATDNAT
⽹络数据包,我们主要是根据请求报⽂中的数据地址转换划分为 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 常见术语
物理术语 - ⽤于描述主机的常见术语
DS:Director Server。
指的是 LVS 集群中的负责调度 (Dispatcher) 或者负载均衡 (Load Balancer) 的主机,即部署 LVS 的主机。 也称 VS(Virtual Server) 。
RS:Real Server。
指的是这正相应用户主机的后端服务器主机。 也称 BS(Backend Server) 。
逻辑术语 - 用于描述逻辑关系的常见术语
VIP:Virtual Server IP
LVS 主机上用于向外部用户提供服务的 ip 地址,作为用户请求的目标的 IP 地址。
它是一个在物理主机上没有物理网卡的 ip 地址,一般用于 LVS 主机的外网 ip 。
DIP:Director Server IP
LVS 主机上和后端提供真正服务的主机通信的 IP 地址。
它是一个独立的物理网卡上的地址,一般用于 LVS 主机的内网 ip 。
RIP:Real Server IP
在 LVS 调度主机后端,真正响应用户请求的主机 IP 地址。
CIP:Client 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 \ \[root @rocky9-12 \~ \] # curl 10.0.0.13 \< h1 \> hello RS1 \ \[root @rocky9-12 \~ \] # curl 10.0.0.13 \< h1 \> hello RS2 \ \[root @rocky9-12 \~ \] # curl 10.0.0.13 \< h1 \> hello RS1 \ **配置主机⽹络环境** 各个主机的⽹卡设备基本配置 ![](https://i-blog.csdnimg.cn/direct/a8b76e553c104c7b99fb4dc36a88d61f.png) **定制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 '\hello RS1\' \> /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 \ \[root @rocky9-12 \~ \] # curl 10.0.0.13 \< h1 \> hello RS1 \ \[root @rocky9-12 \~ \] # curl 10.0.0.13 \< h1 \> hello RS2 \ \[root @rocky9-12 \~ \] # curl 10.0.0.13 \< h1 \> hello RS1 \ 结果显示:可以看到实现了流量的正常转发效果 ![](https://i-blog.csdnimg.cn/direct/d3fce1173e414b8ba536456d0298cc9d.png) 按照我们刚才的实验情况:这四类 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 【在客户机上进行测试】 得到如下结果 ![](https://i-blog.csdnimg.cn/direct/0bd0c5673f9b476a8aa989f146fb595a.png) ## 7 多业务NAT实践 ⼀个 lvs 调度器,实现多种不同业务集群的负载均衡 主机资源 ![](https://i-blog.csdnimg.cn/direct/150d32277a374a4db14c3f44a47aef37.png) 未完待续。。。 ## 8 DR实践\[M


注意:给单⽹卡的 RS 主机设置多 ip ,可以基于⽹卡别名⽅式,因为有现成的 lo 回环⽹卡,我们直接给 lo 配置也可以。
实践效果

root @rocky9-12 \~ \] # curl 192.168.8.100 \< h1 \> hello RS2 \ \[root @rocky9-12 \~ \] # curl 192.168.8.100 \< h1 \> hello RS1 \ 注意: **保障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 ![](https://i-blog.csdnimg.cn/direct/cafddf1b88e949bea0ed3028e6ff8d35.png) 结果显示: 在该网段下,同时有 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 结果显示: 存在默认的内网通信路由信息,所以无需定制路由 ![](https://i-blog.csdnimg.cn/direct/29536656797b4c08b4040ad4a80f86d3.png) lvs-server 主机定制数据包转发 (同上操作 略) 定制路由策略 ip route add default via 192.168.8.13 ip route list ![](https://i-blog.csdnimg.cn/direct/80ef938516644005a44d0a1f6a89d04f.png) **RS1** 主机定制⽹络环境 lvs-rs1 主机定制默认的⽹关出⼝为 lvs 主机 ip route del default ip route add default via 192.168.8.13 ip route list ![](https://i-blog.csdnimg.cn/direct/cf0430f128ed4a7497f8c6dcec381266.png) 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 ![](https://i-blog.csdnimg.cn/direct/5edd90dad7044b1696cbdd1df72b6c33.png) 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 ![](https://i-blog.csdnimg.cn/direct/f7f4887145fa44d3bb0f3a44111fcf5a.png) **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 ![](https://i-blog.csdnimg.cn/direct/0a076d996b7547a591f58a3ba9c6dd06.png) 客⼾端访问 lvs 的对外 ip 地址 \[root @rocky9-12 \~ \] # curl 192.168.8.100 \< h1 \> hello RS2 \ \[root @rocky9-12 \~ \] # curl 192.168.8.100 \< h1 \> hello RS1 \ 结果显⽰: lvs 实现了多集群的负载均衡效果 1 基础的网络配置很重要, lvs-server 和所有 Rs 在同一个私网内 2 客户端的网关配置、内网主机的网关配置对数据包的流转很重要 3 VIP 的配置以及 ip 冲突的措施 3 配置 ipvs 规则的时候,记住要使用 - g( 可以省略 ) 参数。

相关推荐
清寒敲代码9 小时前
LVS集群的基本原理和相关配置
运维·服务器·lvs
_abab10 小时前
Keepalived 与 LVS 集成及多实例配置详解
lvs·keepalived
咖啡进修指南10 小时前
LVS原理详解及LVS负载均衡工作模式
linux·负载均衡·lvs
π大星星️2 天前
LVS + Keepalived + Nginx 高可用负载均衡系统实验
nginx·负载均衡·lvs
运维成长记2 天前
企业级调度器LVS TUN实践
lvs
影龙帝皖9 天前
Linux服务之lvs+keepalived nginx+keepalived负载均衡实例解析
linux·nginx·lvs
影龙帝皖10 天前
Linux服务之lvs集群与dr模式部署
linux·服务器·lvs
hnlucky12 天前
通俗易懂版知识点:Keepalived + LVS + Web + NFS 高可用集群到底是干什么的?
linux·前端·学习·github·web·可用性测试·lvs
晴天Y2817 天前
创建虚拟服务时实现持久连接。
lvs