Lvs的DR模式需要在每一个real server上面配置上VIP和RIP,但是VIP是隐藏的,并不真正进行解析工作,只是用作请求回复的源ip。我们需要在一张网卡上面配置两个ip即:VIP和RIP
以下是LVS_DR模式的原理图:
大致过程:当cip向我们的负载均衡器发出请求时,此时的源iP是:cip,目标ip是vip,而由于我们的vip在lvs机器和后面两台real-server机器上面都有,但是我们并不能让请求发到后面两台real-server上面,否则负载均衡就毫无意义,因此要让real-server忽略arp响应,不允许收关于目标地址是vip的数据包,但是可以让real-server上的vip将数据包转发出去。此时cip的请求将发送到lvs机器上面,因为就只有lvs上的vip对其进行了相应。当lvs机器接收到数据包后,此时lvs上的dip将进行工作,dip将数据包上的源ip也就是cip的mac地址:cipmac改为自己的mac地址即:dipmac,将数据包上目标ip的mca地址改为后面两台web服务器其中之一的mac地址,即RIPMAC。由于mac地址是唯一的,所以尽管后面两台web服务器都有vip,也不会将数据包同时发给这两台服务器,只会发送给其中一台,至于发送给哪一台,则要看lvs的负载均衡算法。当real-server将发送过来的请求处理完毕之后,便直接以vip的地址作为源ip将资源发送给目标地址cip,此时便不用经过lvs负载均衡器,因为cip是唯一的,指在一台机器上存在。由此便完成了负载均衡。
缺点:消耗过多的ip资源
有点:相对于NAT模式,DR模式遇到的瓶颈更小,因为DR模式下返回请求时,并不用经过lvs负载均衡,因此并不会造成过度的拥挤。
环境配置:一台lvs服务器,一台client客户端,两台nginx web服务器
1.client客户端:192.168.23.128
2.lvs负载均衡服务器:192.168.23.144
3.nginxweb服务器1:192.168.23.145
4.nginxweb服务器2:192.168.23.146
第一步:lvs服务器上添加vip和路由:
1.查看本机网卡名称:
1.查看自己虚拟机的网卡名称:
[root@lvs-server ~]# ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.23.144 netmask 255.255.255.0 broadcast 192.168.23.255
inet6 fe80::20c:29ff:fe9b:8c4f prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:9b:8c:4f txqueuelen 1000 (Ethernet)
RX packets 31380 bytes 30858220 (29.4 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 46908 bytes 7435020 (7.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
可以看到我们目前网卡名称为ens160
2.添加vip:
[root@lvs-server ~]# ifconfig ens160:0 192.168.23.147 broadcast 192.168.23.255 netmask 255.255.255.0 up
其中 192.168.23.147 就是我们的vip 虚拟IP的设计,遵循本网段未使用的IP即可。这里的VIP与虚拟机上真实的ip要配到同一个网卡上,即都在ens160上面。就好比一个手机上面插了多张手机卡
3.查看是否成功:
[root@lvs-server ~]# ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.23.144 netmask 255.255.255.0 broadcast 192.168.23.255
inet6 fe80::20c:29ff:fe9b:8c4f prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:9b:8c:4f txqueuelen 1000 (Ethernet)
RX packets 34832 bytes 31256490 (29.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 57717 bytes 9368402 (8.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens160:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.23.147 netmask 255.255.255.0 broadcast 192.168.23.255
ether 00:0c:29:9b:8c:4f txqueuelen 1000 (Ethernet)
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
可以看到,出现了 ens160:0 说明配置成功。上面的IP也就是我们配置的vip:192.168.23.147,广播地址和掩码也都是我们指定的。
4.添加路由:
route add -host 192.168.23.147 dev ens160:0
第二步:设置路由转发:
1.修改配置文件
[root@lvs-server ~]# vim /etc/sysctl.conf
#往配置文件里新增以下内容(配置完毕wq保存退出即可):
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.ens160.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
服务器不是一台路由器,那么它不会发送重定向,所以可以关闭该功能。
net.ipv4.ip_forward = 1:开启路由功能
net.ipv4.conf.all.send_redirects = 0:#禁止转发重定向报文
net.ipv4.conf.ens160.send_redirects = 0:禁止ens160转发重定向报文
net.ipv4.conf.default.send_redirects = 0:禁止转发默认重定向报文
第三步:LVS设置负载均衡条目/规则:
1.安装ipvsadm:
[root@lvs-server ~]# yum -y install ipvsadm
2.清除ipvsadm规则(新安装的ipvsadm不用执行该命令)
[root@lvs-server ~]# ipvsadm -C
3.添加VIP规则
[root@lvs-server ~]# ipvsadm -A -t 192.168.23.147:80 -s rr
#参数说明:这里的-A 是添加virtual server,即我们配置的vip
-t 指定使用tcp协议
-s 指定调度策略/负载算法为rr(轮询)
4.添加real-server:
[root@lvs-server ~]# ipvsadm -a -t 192.168.23.147:80 -r 192.168.23.145:80 -g
[root@lvs-server ~]# ipvsadm -a -t 192.168.23.147:80 -r 192.168.23.146:80 -g
#参数说明:这里的 -a 是添加real-server也就是我们后面那两台web服务器。-r 指定realserver是谁,-g 是指定LVS类型为DR模式。如果用 -i 则是TUN模式,-m则是NAT模式。
5.LVS让配置永久生效:
[root@lvs-server ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@lvs-server ~]# systemctl enable ipvsadm.service
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.
#查看一下我们做的配置:
[root@lvs-server ~]# cat /etc/sysconfig/ipvsadm
-A -t bogon:http -s rr
-a -t bogon:http -r bogon:http -g -w 1
-a -t bogon:http -r bogon:http -g -w 1
第四步:在两个web上面配置web服务:
1.安装web服务:
[root@web01 ~]# yum -y install nginx
#此台机器是:192.168.23.145
[root@web02 ~]# yum -y install nginx
#此台机器是:195.168.23.146
2.等待两台机器安装完毕,修改nginx的默认欢迎页面:
[root@web01 html]# cd /usr/local/nginx/html/ #我的nginx是源码编译安装,与yum安装的html目录不一致,你们找到自己nginx的index.html页面自行修改即可
[root@web01 html]# ls
50x.html index.html
[root@web01 html]# vim index.html
#写入以下内容:This is web01
[root@web02 html]# cd /usr/local/nginx/html/ #我的nginx是源码编译安装,与yum安装的html目录不一致,你们找到自己nginx的index.html页面自行修改即可
[root@web02 html]# ls
50x.html index.html
[root@web01 html]# vim index.html
#写入以下内容:This is web02
将两台web服务器都修改完毕即可,这里我们的两台服务器的index.html里面的内容故意不一致,以便后续能够看清负载均衡的效果。
3.将两台web服务器都启动nginx服务:
[root@web01 ~]# systemctl start nginx
[root@web01 ~]# systemctl enable nginx
[root@web02 ~]# systemctl start nginx
[root@web02 ~]# systemctl enable nginx
4.给两个web服务器的lo网卡设置子网掩码为32位vip
[root@web01 html]# ifconfig lo:0 192.168.23.147/32
[root@web01 html]# ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.23.145 netmask 255.255.255.0 broadcast 192.168.23.255
inet6 fe80::20c:29ff:fed1:9322 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:d1:93:22 txqueuelen 1000 (Ethernet)
RX packets 56717 bytes 34772358 (33.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 122818 bytes 20900580 (19.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.23.147 netmask 0.0.0.0
loop txqueuelen 1000 (Local Loopback)
[root@web02 html]# ifconfig lo:0 192.168.23.147/32
[root@web02 html]#
[root@web02 html]#
[root@web02 html]# ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.23.146 netmask 255.255.255.0 broadcast 192.168.23.255
inet6 fe80::20c:29ff:fe10:444e prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:10:44:4e txqueuelen 1000 (Ethernet)
RX packets 57961 bytes 34889982 (33.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 124671 bytes 21135392 (20.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.23.147 netmask 0.0.0.0
loop txqueuelen 1000 (Local Loopback)
设置成功后,使用ifconfig命令查看,可以看到lo下面多了一个 lo:0就是我们刚才设置的vip。
注意两台web服务器都要设置!
5.给两个web服务器设置内核参数:
[root@web01 html]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
#忽略arp响应 ,不允许收
[root@web01 html]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#为了让vip发包出去,但允许发
[root@web02 html]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
#忽略arp响应 ,不允许收
[root@web02 html]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#为了让vip发包出去,但允许发
这样一来,real-server上面的vip就不会接收到来自client的请求,因此只有lvs上面的vip会接收到请求。后续lvs通过调度算法将请求分发给real-server后,real-server处理完毕后,通过real-server上的vip将结果响应给用户,做到了只能发包不接受包。
第五步:在客户端上测试:
1.在clent机器上下载curl软件
[root@client ~]# yum -y install curl
2.访问lvs的vip看是否实现了负载均衡:
[root@client ~]# curl 192.168.23.147
This is web02
[root@client ~]# curl 192.168.23.147
This is web01
[root@client ~]# curl 192.168.23.147
This is web02
[root@client ~]# curl 192.168.23.147
This is web01
可以看到,已经实现了负载均衡!至此实验完毕。