访问效果

涉及内容:浏览拆分、
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
】离开主机
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
常见术语
物理术语
-
⽤于描述主机的常见术语
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
</
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(
可以省略
)
参数。