LVS原理及实例

目录

LVS原理

LVS概念

lvs集群的类型

lvs-nat

解释

传输过程

lvs-dr

解释

传输过程 

特点

lvs-tun

 LVS(Linux Virtual Server)常见的调度算法

防火墙标记(Firewall Marking)结合轮询调度

实战案例

lvs的nat模式配置

准备工作

配置过程

测试结果

lvs的dr模式综合实践

虚拟机配置(准备五个虚拟机)

​编辑​编辑​编辑​编辑​编辑配置过程

测试结果

lvs的防火墙标记解决轮询调度问题

错误示范

正确示范

​编辑测试结果


LVS原理

LVS(Linux Virtual Server,Linux 虚拟服务器)的基本原理是通过将多个真实服务器组合成一个虚拟服务器集群,实现对客户端请求的高效负载均衡和高可用性服务。 其主要工作流程如下:

1. 客户端向虚拟服务器(VIP)发送请求。

2. 负载均衡器(通常称为 Director)接收到请求。

3. Director 根据预先配置的负载均衡算法(如轮询、加权轮询、最少连接等)选择一个合适的真实服务器(Real Server)。

4. Director 将客户端请求转发到选定的 Real Server。

5. Real Server 处理请求,并将响应直接返回给客户端。

为了实现请求的转发,LVS 支持多种工作模式,如 NAT(Network Address Translation,网络地址转换)模式、TUN(IP Tunneling,IP 隧道)模式和 DR(Direct Routing,直接路由)模式。

在 NAT 模式中,Director 不仅负责调度,还对请求和响应数据包进行网络地址转换。

在 TUN 模式中,Director 将请求数据包封装后发送给 Real Server,Real Server 处理后直接将响应返回给客户端。

在 DR 模式中,Director 根据算法选择 Real Server 后,将请求的 MAC 地址修改为选定 Real Server 的 MAC 地址,然后通过局域网将请求直接发送给 Real Server,Real Server 处理后直接响应给客户端。

通过 LVS 的负载均衡机制,可以提高服务器集群的整体性能、可扩展性和可用性,确保客户端能够获得快速和可靠的服务。

LVS概念

名称意义
VS(Virtual Server)/虚拟服务器负责调度,将客户端的请求分配到合适的后端服务器
RS(Real Server)/真实服务器负责真正提供服务,处理来自 VS 调度分配的请求
CIP(Client IP)/客户端主机IP地址客户端用户计算机请求集群服务器的IP地址,该地址用作发送给集群的请求的源IP地址
VIP(Virtual serve IP)/虚拟IP地址Director用于向客户端计算机提供服务的IP地址
DIP(Director IP)/Director的IP地址Director用于连接内外网网络的IP地址
RIP(Real server IP)/真实IP地址在集群下面节点上使用的IP地址

访问过程:CIP<-->VIP == DIP<-->RIP

lvs集群的类型

(此处我们详细讲解lvs-nat和lvs-br)

lvs-nat

解释

LVS(Linux Virtual Server)的网络地址转换(NAT)模式是一种在网络层(第四层)实现负载均衡的方法。在NAT模式中,Director Server(DS)充当所有服务器节点的网关,既是客户端请求的入口,也是Real Server响应客户端的出口。优点是可以进行端口转换,缺点是存在性能瓶颈。它主要工作在OSI模型的第三层(网络层)和第四层(传输层)。NAT允许内部网络使用私有IP地址,并通过公共IP地址进行外部通信。

传输过程

1.客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口 (9000port)

2.VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口

3.RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口 (9000port)

4.VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口(9000-->80)

5.VS服务器把修改过报文的响应数据包回传给客户端 6.lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞

客户请求到达vip后进入PREROUTING,在没有ipvs的时候因该进入本机INPUT,当IPVS存在后访问请求在通 过PREROUTING后被ipvs结果并作nat转发 因为ipvs的作用点是在PREROUTING和INPUT链之间,所以如果在prerouting中设定规则会干扰ipvs的工 作。所以在做lvs时要把iptables的火墙策略全清理掉。

lvs-dr

解释

LVS(Linux Virtual Server)的 DR(Direct Routing,直接路由)模式,这种模式适用于非ARP设备的Real Server,Real Server网络是局域网,同样支持大量Real Server(高达100个),Real Server有自己的路由器。优点是性能最佳,缺点是不支持跨网段和端口转换。工作在数据链路层。在DR模式中,RS接收到访问请求后不需要回传给VS调度器,直接把回传数据发送给client,所以RS和vs 上都要有vip

传输过程 

1.客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC

2.VS调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端IP+客户端 的MAC+VIP+RS1的MAC

3.RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的 MAC

特点

1.Director和各RS都配置有VIP

2.确保前端路由器将目标IP为VIP的请求报文发往Director

3.在前端网关做静态绑定VIP和Director的MAC地址

lvs-tun

LVS(Linux Virtual Server)的 TUN(IP Tunneling,IP 隧道)模式是另一种负载均衡模式。

在 TUN 模式中,Director 接收到客户端请求后,根据负载均衡算法选择一台合适的 Real Server。然后,Director 将请求数据包重新封装在一个新的 IP 数据包中,并将其发送给所选的 Real Server。

Real Server 接收到数据包后,解封装得到原始的请求数据包,并进行处理。处理完成后,Real Server 直接将响应数据包返回给客户端,而不经过 Director。

TUN 模式的优点是可以跨越不同的网络区域对服务器进行负载均衡,Real Server 可以位于不同的物理网络。但它也有一些缺点,比如需要所有服务器支持 IP 隧道功能,会增加一定的系统开销。

 LVS(Linux Virtual Server)常见的调度算法

静态调度算法RR,WRR,DH,SH
动态调度算法LC,WLC,LBLC,LBLCR
静态调度算法

1. 轮询(Round Robin,RR):将请求依次分配给各个真实服务器,依次循环。

2. 加权轮询(Weighted Round Robin,WRR):给每个真实服务器设置一个权重,根据权重的比例将请求分配给服务器。权重越高,分配到的请求越多。

3.目标地址散列(Destination Hashing,  DH):根据请求的目标 IP 地址进行哈希运算,将请求分配到固定的服务器。

4.源地址散列(Source Hashing,  SH):根据请求的源 IP 地址进行哈希运算,将请求分配到固定的服务器。

动态调度算法

1. 最少连接(Least Connections,LC):将新的请求分配给当前连接数最少的真实服务器。

2. 加权最少连接(Weighted Least Connections,WLC):为真实服务器设置权重,综合考虑服务器的权重和当前连接数来分配请求。

3. 基于局部性的最少连接(Locality-Based Least Connections,LBLC):主要考虑请求的目标 IP 地址,优先将请求分配给同一 IP 地址对应的真实服务器。

4. 带复制的基于局部性最少连接(Locality-Based Least Connections with Replication,LBLCR):结合了 LBLC 和复制功能,对于目标 IP 地址相同的请求,如果对应的真实服务器没有活动连接,则可以在有活动连接的真实服务器中选择一个,并复制该连接。

防火墙标记(Firewall Marking)结合轮询调度

在 LVS 环境中,使用防火墙标记(Firewall Marking)结合轮询调度可以实现更灵活和定制化的负载均衡策略。

通过防火墙标记,可以为不同的连接或数据包打上特定的标记。然后,在 LVS 的配置中,可以根据这些标记来进行调度决策,而不仅仅依赖于默认的轮询方式。

实战案例

lvs的nat模式配置

准备工作

lvs主机需要两个网络适配器,其中一个为NAT模式,另外一个为仅主机模式,还需要两个server主机,一个为server1还有一个为server2,都为仅主机模式

配置过程

配置ip

lvs主机

[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth1.connection 
[connection]
id=eth1
type=ethernet
interface-name=eth1
 
[ipv4]
address1=192.168.0.100/24
method=manual


 server1主机

[root@webserver1 ~]# cat /etc/NetworkManager/system-connections/eth0.connection 
[connection]
id=eth0
type=ethernet
interface-name=eth0
 
[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual


server2主机配置

[root@webserver2 ~]# cat /etc/NetworkManager/system-connections/eth0.connection 
[connection]
id=eth0
type=ethernet
interface-name=eth0
 
[ipv4]
address1=192.168.0.20/24,192.168.0.100
method=manual


在lvs主机中配置
lvs中打开内核路由功能,ip_forward = 1通常表示启用了 IP 转发功能,使网络适配器分别为nat和仅主机之间连通

vim /etc/sysctl.conf            #在最后一行添加
net.ipv4.ip_forwaed = 1                #启用了 IP 转发功能
 
sysctl -p             #使配置生效


下载ipvsadm

yum install ipvsadm -y


配置规则

ipvsadm -A -t 172.25.254.100:80 -s rr
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10 -m
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10 -m
 
ipvsadm -Ln
watch -n 1 ipvsadm -Ln --rate    #也可以使用监控命令来看


在server主机配置

yum install httpd -y        #两个都要下载httpd
 
echo webserver1-192.168.0.10 > /var/www/html/index.html        #server1中配置
ystemctl restart httpd
 
echo webserver1-192.168.0.10 > /var/www/html/index.html         #server2中配置
systemctl restart httpd

测试结果

lvs的dr模式综合实践


 

nodeipvip角色模式
client172.25.254.200客户端NAT
router

192.168.0.100

172.25.254.100

路由器NAT,仅主机
lvs192.168.0.50lo:192.168.0.200/32调度器仅主机
webserver1192.168.0.10lo:192.168.0.200/32真实服务器仅主机
webserver2192.168.0.20lo:192.168.0.200/32真实服务器仅主机

虚拟机配置(准备五个虚拟机)


配置过程

配置ip

配置client主机

[root@client ~]# cat /etc/NetworkManager/system-connections/eth0.connection 
[connection]
id=eth0
type=ethernet
interface-name=eth0
 
[ipv4]
address1=172.25.254.200/24,172.25.254.100
method=manual
 
 
[root@client ~]# nmcli connection reload
[root@client ~]# nmcli connection up eth0


配置router主机

[root@router ~]# cat /etc/NetworkManager/system-connections/eth0.connection 
[connection]
id=eth0
type=ethernet
interface-name=eth0
 
[ipv4]
address1=172.25.254.100/24,172.25.254.2
dns=114.114.114.114;
method=manual
 
 
[root@router ~]# cat /etc/NetworkManager/system-connections/eth1.connection 
[connection]
id=eth1
type=ethernet
interface-name=eth1
 
[ipv4]
address1=192.168.0.100/24
method=manual
 
 
[root@router ~]# nmcli connection reload
[root@router ~]# nmcli connection up eth0
[root@router ~]# nmcli connection up eth1

配置lvs主机(vip使用环回来创建)

[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth0.connection 
[connection]
id=eth0
type=ethernet
interface-name=eth0
 
[ipv4]
address1=192.168.0.50/24,192.168.0.100
method=manual
 
 
 
[root@lvs ~]# nmcli connection reload
[root@lvs ~]# nmcli connection up eth0
 
[root@lvs ~]# ip addr add dev lo 192.168.0.200/32

配置server1主机(vip使用环回来创建)

[root@server1 ~]# cat /etc/NetworkManager/system-connections/eth0.connection
[connection]
id=eth0
type=ethernet
interface-name=eth0
 
[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual
 
 
[root@server1 ~]# nmcli connection reload
[root@server1 ~]# nmcli connection up eth0
 
 
[root@server1 ~]# ip addr add dev lo 192.168.0.200/32

配置server2主机(vip使用环回来创建)

[root@server2 ~]# cat /etc/NetworkManager/system-connections/eth0.connection 
[connection]
id=eth0
type=ethernet
interface-name=eth0
 
[ipv4]
address1=192.168.0.20/24,192.168.0.100
method=manual
 
 
[root@server2 ~]# nmcli connection reload
[root@server2 ~]# nmcli connection up eth0
 
[root@server2 ~]# ip addr add dev lo 192.168.0.200/32


修改Linux内核参数。

server1和server2上面都要做

(rs主机中使vip不对外响应,将RS上的VIP配置为lo接口的别名,限制Linux仅对对应接口的ARP请求做响应;)

限制响应级别 :arp_ignore

0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应

限制通告级别 :arp_announce

0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 


配置ipvsadm
在lvs主机中进行配置 IP 虚拟服务器

yum install ipvsadm -y
 
ipvsadm -A -t 192.168.0.200:80 -s wrr
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2


启用 IP 转发功能
在router主机进行配置

(设置持久连接,保持客户端与后端服务器的连接关系)

vim /etc/sysctl.conf            #在最后一行添加
net.ipv4.ip_forward = 1
 
ipvsadm -p


 配置web服务

yum install httpd -y
 
echo 11111111 > /var/www/html/index.html        #server1中配置
ystemctl restart httpd
 
echo 22222222 > /var/www/html/index.html         #server2中配置
systemctl restart httpd

测试结果

for i in {1..10}; do curl 192.168.0.200; done

lvs的防火墙标记解决轮询调度问题

错误示范

ipvsadm -A -t 192.168.0.200:80 -s rr
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g
ipvsadm -A -t 192.168.0.200:443 -s rr
ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:80 -g
ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:80 -g

错误结果

[root@lvs ~]# curl  -k https://192.168.0.200;curl 192.168.0.200
1111111
1111111


正确示范

FWM:FireWall Mark

MARK target 可用于给特定的报文打标记,

--set-mark value

其中:value 可为0xffff格式,表示十六进制数字借助于防火墙标记来分类报文,而后基于标记定义集群服 务:可将多个不同的应用使用同一个集群服务进行调度

#在lvs主机打标记:

#并且lvs主机基于标记定义集群服务:

iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dport 80,443 -j MARK --set-mark 66
 
ipvsadm -A -f 66 -s rr    #设定调度规则
ipvsadm  -a -f 66 -r 192.168.0.10 -g
ipvsadm  -a -f 66 -r 192.168.0.20 -g


测试结果

  • 20
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值