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地址。
二、实践
1、实验环境
lvsens160 192.168.10.101ens160:0 192.168.10.100
web01ens160 192.168.10.102lo:0 192.168.10.100
web02ens160 192.168.10.103lo:0 192.168.10.100
nfsens160 192.168.10.104
clientens160 192.168.10.1052、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 1000link/ether 00:0c:29:23:90:5d brd ff:ff:ff:ff:ff:ffinet 192.168.10.101/24 brd 192.168.10.255 scope global noprefixroute ens160valid_lft forever preferred_lft foreverinet 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 1000inet 192.168.10.100/32 scope global lo:0valid_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
web014、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
web025、客户机验证
[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
web02lvs查看访问
[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:806、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
nfs7、客户机验证
[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