LVS-DR群集

一、理论

LVS-DR(Linux Virtual Server Director Server,linux虚拟服务器 导演服务器)工作模式,是生产环境中最常用的一种模式。

DR模式解析

拓扑图

客户机 路由器

交换机 Director server

Real server

Director作为群集的访问入口,不作为网关使用,节点Director Server与Real Server在同一个网络中,返回给客户端的数据不需要经过Director Server。Director Server与Real Server都需要配置VIP地址。

工作原理:

1、客户端发送请求到Director Server,请求的数据报文(源ip是cip,目标ip是vip)到达内核空间。

2、Director Server和Real Server在同一个网络中,数据通过二层数据链路层来传输。(通过中间的交换机传输)

3、内核空间判断数据包的目标ip是本机vip,此时ipvs比对数据包请求的服务是否为集群服务,是集群服务就重新封装数据包。修改源mac地址为Director Server的mac地址,修改目标mac地址为Real Server的mac地址,源ip地址与目标ip地址没有改变,然后将数据包发送给Real Server。

4、到达Real Server的请求报文的mac地址是自身的mac地址,就接收此报文。数据包重新封装报文(源ip地址为vip,目标ip为cip),将响应报文通过lo接口传送给物理网卡然后向外发出。

5、Real Server直接将响应报文传送到客户端。

LVS-DR模式的特点:

Director Server和Real Server必须在同一个物理网络中。

Real Server可以使用私有地址,也可以使用公网地址。如果使用公网地址,可以通过互联网对RIP进行直接访问。

所有的请求报文经由Director Server,但回复响应报文不能经过Director Server。

Real Server的网关不允许指向Director Server IP,即不允许数据包经过Director Server。

Real Server上的lo接口配置VIP的IP地址。

LVS-DR模式中的arp问题。

问题一

在lvs-dr负载均衡集群中,负载均衡器与节点服务器都要配置相同的vip地址,在局域网中具有相同的IP地址。势必会造成各服务器arp通信的紊乱。

当arp广播发送到lvs-dr集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到arp广播

只有前端的负载均衡器进行响应,其他节点服务器不应该响应arp广播。

解决方法:

对节点服务器进行处理,使其不响应针对vip的arp请求。

使用虚接口lo:0承载vip地址

设置内核参数arp_ignore=1 系统只响应目的ip为本地ip的arp请求。

问题二

real server返回报文(源ip是vip)经路由器转发,重新封装报文时,需要先获取路由器的mac地址,发送arp请求时,linux默认使用ip包的源ip地址(即vip)作为arp请求包中的源ip地址,而不使用发送接口的ip地址,路由器收到arp请求后,将更新arp表项,原有的vip对应director的mac地址会被更新为vip对应real server的mac地址。

解决方法:

对节点服务器进行处理,设置内核参数arp_announce=2 系统不使用ip包的源地址来设置arp请求的源地址,而选择发送接口的ip地址。

二、实践

bash 复制代码
1、实验环境
lvs
	ens160 	192.168.10.101
      ens160:0 	192.168.10.100
web01
	ens160 	192.168.10.102
	lo:0 	192.168.10.100
web02
	ens160 	192.168.10.103
	lo:0 	192.168.10.100
nfs
	ens160	192.168.10.104
client
	ens160	192.168.10.105

2、lvs配置
[root@lvs network-scripts]# cat ifcfg-ens160:0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=192.168.10.100
NETMASK=255.255.255.255
GATEWAY=192.168.10.254
DNS1=114.114.114.114
DNS2=8.8.8.8
DEFROUTE=yesIPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=eui64
NAME=ens160:0
DEVICE=ens160:0
ONBOOT=yes
[root@lvs network-scripts]# systemctl restart NetworkManager
[root@lvs network-scripts]# ip a
ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:23:90:5d brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.101/24 brd 192.168.10.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 192.168.10.100/32 scope global noprefixroute ens160:0

[root@localhost network-scripts]# sysctl -p  # lvs和RS共同使用vip,因此需要关闭内核的重定向参数响应。
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens160.send_redirects = 0

[root@lvs ~]# dnf -y install ipvsadm
[root@lvs ~]# ipvsadm -A -t 192.168.10.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.102 -g -w 1
[root@lvs ~]# ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.103 -g -w 1
[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  192.168.10.100:80 rr
  -> 192.168.10.102:80            Route   1      0          0         
  -> 192.168.10.103:80            Route   1      0          0   

3、web01配置
[root@web01 ~]# vip='192.168.10.100'
[root@web01 ~]# ip addr add ${vip}/32 dev lo label lo:0  # label表示指定标签,lo:0是标签。
[root@web01 ~]# ip route add local ${vip}/32 dev lo
RTNETLINK answers: File exists
[root@web01 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.10.254  0.0.0.0         UG    100    0        0 ens160
192.168.10.0    0.0.0.0         255.255.255.0   U     100    0        0 ens160
[root@web01 ~]# ip route
default via 192.168.10.254 dev ens160 proto static metric 100 
192.168.10.0/24 dev ens160 proto kernel scope link src 192.168.10.102 metric 100 
[root@web01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 192.168.10.100/32 scope global lo:0
       valid_lft forever preferred_lft forever
[root@web01 ~]# sysctl -p  # ignore 忽略 announce 公布
net.ipv4.conf.all.arp_ignore = 1  
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

参数解释:
net.ipv4.conf.all.arp_ignore = 1  禁用igp协议对arp请求的响应,确保所有arp流量都按照配置处理,而不是通过igp路由来处理。

net.ipv4.conf.all.arp_announce = 2 调整了arp注明的超时时间,设置了2秒。防止过多的arp缓存更新请求,减少网络流量和资源消耗。

net.ipv4.conf.default.arp_ignore = 1 禁用igp对arp请求的响应,作用范围更广泛,在默认接口上。

net.ipv4.conf.default.arp_announce = 2  调整arp注明时间于默认接口,设置为2秒。

net.ipv4.conf.lo.arp_ignore = 1  禁用回环口(loopback)界面上的arp请求忽略。

net.ipv4.conf.lo.arp_announce = 2  调整loopback接口的arp注明时间,控制内部网络中arp缓存的更新频率,减少网络流量和资源消耗。

[root@web01 ~]# dnf -y install httpd
[root@web01 ~]# cat /var/www/html/index.html 
web01
[root@web01 ~]# systemctl start httpd
[root@web01 ~]# curl 192.168.10.102
web01
[root@web01 ~]# curl 192.168.10.100
web01

4、web02配置
[root@web02 ~]# ip addr add 192.168.10.100/32 dev lo label lo:0
[root@web02 ~]# ip route add local 192.168.10.100/32 dev lo
RTNETLINK answers: File exists
[root@web02 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

[root@web01 ~]# dnf -y install httpd
[root@web02 ~]# cat /var/www/html/index.html
web02
[root@web01 ~]# systemctl start httpd
[root@web02 ~]# curl 192.168.10.103
web02
[root@web02 ~]# curl 192.168.10.100
web02

5、客户机验证
[root@client ~]# curl 192.168.10.100
web01
[root@client ~]# curl 192.168.10.100
web02
[root@client ~]# curl 192.168.10.100
web01
[root@client ~]# curl 192.168.10.100
web02
[root@client ~]# curl 192.168.10.100
web01
[root@client ~]# curl 192.168.10.100
web02

lvs查看访问
[root@lvs ~]# ipvsadm -lnc
TCP 01:43  FIN_WAIT    192.168.10.105:55868 192.168.10.100:80  192.168.10.102:80
TCP 01:42  FIN_WAIT    192.168.10.105:55852 192.168.10.100:80  192.168.10.102:80
TCP 01:28  FIN_WAIT    192.168.10.105:35658 192.168.10.100:80  192.168.10.103:80
TCP 01:31  FIN_WAIT    192.168.10.105:35708 192.168.10.100:80  192.168.10.103:80
TCP 01:43  FIN_WAIT    192.168.10.105:55862 192.168.10.100:80  192.168.10.103:80
TCP 01:29  FIN_WAIT    192.168.10.105:35674 192.168.10.100:80  192.168.10.102:80



6、nfs配置及102、103挂载
[root@nfs ~]# dnf -y install nfs-utils rpcbind
[root@nfs ~]# mkdir /opt/sooo
[root@nfs ~]# cat /etc/exports
/opt/sooo 192.168.10.0/24(rw,sync,no_root_squash)
[root@nfs ~]# systemctl start rpcbind
[root@nfs ~]# systemctl start  nfs
[root@nfs ~]# netstat -anpt | grep rpc
tcp        0      0 0.0.0.0:53527           0.0.0.0:*               LISTEN      2204/rpc.statd      
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      2196/rpcbind        
tcp        0      0 0.0.0.0:20048           0.0.0.0:*               LISTEN      2216/rpc.mountd     
tcp6       0      0 :::58323                :::*                    LISTEN      2204/rpc.statd      
tcp6       0      0 :::111                  :::*                    LISTEN      2196/rpcbind        
tcp6       0      0 :::20048                :::*                    LISTEN      2216/rpc.mountd     


[root@web01 ~]# mount 192.168.10.104:/opt/sooo /var/www/html
[root@web01 ~]# tail -1 /etc/mtab
192.168.10.104:/opt/sooo /var/www/html nfs4 rw,relatime,vers=4.2,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.10.102,local_lock=none,addr=192.168.10.104 0 0

[root@web02 ~]# mount 192.168.10.104:/opt/sooo /var/www/html
[root@web02 ~]# tail -1 /etc/mtab
192.168.10.104:/opt/sooo /var/www/html nfs4 rw,relatime,vers=4.2,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.10.103,local_lock=none,addr=192.168.10.104 0 0

[root@nfs sooo]# cat index.html 
nfs

7、客户机验证
[root@client ~]# curl 192.168.10.100
nfs
[root@client ~]# curl 192.168.10.100
nfs
[root@client ~]# curl 192.168.10.100
nfs
[root@client ~]# curl 192.168.10.100
nfs

[root@lvs ~]# ipvsadm -lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:46  FIN_WAIT    192.168.10.105:42100 192.168.10.100:80  192.168.10.102:80
TCP 01:46  FIN_WAIT    192.168.10.105:42098 192.168.10.100:80  192.168.10.103:80
TCP 01:45  FIN_WAIT    192.168.10.105:42084 192.168.10.100:80  192.168.10.102:80
TCP 01:47  FIN_WAIT    192.168.10.105:42110 192.168.10.100:80  192.168.10.103:80
相关推荐
lulinhao1 小时前
VLAN的作用和原理
网络·笔记·vlan
LB21122 小时前
Maven(黑马)
linux·服务器·maven
拍客圈2 小时前
宝塔专属清理区域,宝塔清理MySQL日志(高效释放空间)
运维·服务器
Mr.小海2 小时前
vmware虚拟机固定IP
网络·网络协议·tcp/ip
Stardep2 小时前
Linux下目录递归拷贝的单进程实现
linux·运维·服务器·实验
nako_sayuri2 小时前
Linux进程间通信----简易进程池实现
linux·服务器·进程池
捏尼卜波卜2 小时前
TCP 四次挥手
服务器·网络·tcp/ip
stormsha3 小时前
MCP架构全解析:从核心原理到企业级实践
服务器·c++·架构
mooyuan天天3 小时前
pikachu靶场通关笔记06 XSS关卡02-反射型POST
网络·web安全·反射型xss·pikachu靶场·xss漏洞
HinsCoder3 小时前
【技能拾遗】——家庭宽带单线复用布线与配置(移动2025版)
运维·网络·笔记·智能路由器·iptv·移动·单线复用