为了让您了解LVS的另外设置方式,本次我们使用VIP的方式,而不是两张网卡的方式(当然您也可以用两张网卡的方式)。VIP的方式是后面我们将讲到的LVS + Keepalived组合工作模式的常用方式。所谓VIP就是虚拟IP,是指这个IP不会固定捆绑到某一个网卡设备,而是通过ifconfig命令绑定,并在“适当时候”这种绑定关系会随之变化。
DIP:192.168.1.57
VIP:192.168.1.100
[root@bogon ~]# ifconfig ens33:0 192.168.1.100 broadcast 192.168.1.100 netmask 255.255.255.255 up
[root@bogon ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.57 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::2a8d:be6:a4a8:ea0 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:24:26:9c txqueuelen 1000 (Ethernet)
RX packets 98059 bytes 7746619 (7.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 942 bytes 114751 (112.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.100 netmask 255.255.255.255 broadcast 192.168.1.100
ether 00:0c:29:24:26:9c 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 1 (Local Loopback)
RX packets 273 bytes 25704 (25.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 273 bytes 25704 (25.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@bogon ~]# route add -host 192.168.1.100 dev ens33:0
[root@bogon ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.1.1 0.0.0.0 UG 101 0 0 ens33
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.1.100 0.0.0.0 255.255.255.255 UH 0 0 0 ens33
C:\Users\1234>ping 192.168.1.100
正在 Ping 192.168.1.100 具有 32 字节的数据:
来自 192.168.1.100 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.1.100 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.1.100 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.1.100 的回复: 字节=32 时间<1ms TTL=64
192.168.1.100 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
以上,我们完成了LVS主机设置LVS-DR工作模式的准备工作。注意:
RIP:192.168.1.51
真实服务器的准备工作,需要保证真实服务器能够访问外网网关,并且保证由LVS改写的报文能够被Real Server处理,这就需要做一个回环IP。
将报文的帧重新交给交换机的时候,交换机会根据目标MAC重新发往realserver,当realserver收到请求之后目标地址由于是VIP,因此为了让realserver接收目标地址为vip的报文,在每个realserver必须配置vip的地址,不然不匹配报文无法接收,也就意味着每个realserver都必须配置vip
# 指定广播地址为自己本机,不对外做任何广播,说明不需要与任何主机通信,只将在响应客户端的请求的时候将自己做为源地址。
[root@bogon www.test1.com]# ifconfig lo:0 192.168.1.100 broadcast 192.168.1.100 netmask 255.255.255.255 up
[root@bogon www.test1.com]# ifconfig
ens33: flags=4163 mtu 1500
inet 192.168.1.51 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::853a:c1a1:7172:a45d prefixlen 64 scopeid 0x20
inet6 fe80::2a8d:be6:a4a8:ea0 prefixlen 64 scopeid 0x20
ether 00:0c:29:1a:76:7e txqueuelen 1000 (Ethernet)
RX packets 100117 bytes 7785003 (7.4 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1568 bytes 218186 (213.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1 (Local Loopback)
RX packets 72 bytes 6248 (6.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 72 bytes 6248 (6.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo:0: flags=73 mtu 65536
inet 192.168.1.100 netmask 255.255.255.255
loop txqueuelen 1 (Local Loopback)
响应报文从哪个接口出去,则将哪个接口的地址当做源地址。所以,为了使得源地址是VIP还必须加一条路由,如果主机目标地址是vip的,那么一定要通过lo接口出去。
[root@bogon www.test1.com]# route add -host 192.168.1.100 dev lo:0
[root@bogon www.test1.com]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.1.1 0.0.0.0 UG 100 0 0 ens33
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.1.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
事实上路由器将报文转发至directory之前要先进行arp广播请求,arp广播的意义是将vip转换为mac地址,那么按理来讲我们的realserver都配置了vip,也就意味着所有配置vip的主机都能响应其报文,很显然这么就乱套了,所以我们就期望进来的请求只到达directory,不然负载均衡就没有意义了。
[root@bogon www.test1.com]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@bogon www.test1.com]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@bogon www.test1.com]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@bogon www.test1.com]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
以上设置完成。完成后,您需要通过ping命令,检查一下网关是否可用(最好可以瓶ping一下外网的某个地址,例如163.com)。LVS-DR模式下,Real Server是直接向请求方返回结果,所以一定要保证网关时可用的。
[root@bogon www.test1.com]# ping www.baidu.com
PING www.a.shifen.com (61.135.169.125) 56(84) bytes of data.
64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=1 ttl=55 time=18.0 ms
64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=2 ttl=55 time=17.6 ms
64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=3 ttl=55 time=19.6 ms
64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=4 ttl=55 time=17.1 ms
^C
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3010ms
rtt min/avg/max/mdev = 17.130/18.112/19.602/0.932 ms
很重要的一点:Nginx服务器要监听在VIP上,即 lo:0 上。
[root@localhost ~]# curl 192.168.1.100
192.168.3.11
Nginx的安装配置请参考:Nginx 服务器安装与配置
Nginx虚拟机的配置请参考
按照同样的步骤多陪几台服务器,便于测试。
完成准备工作后,我们可以开始安装和配置LVS了。
[root@bogon www.test1.com]# ipvsadm -C
[root@bogon www.test1.com]# ipvsadm -At 192.168.1.100:80 -s rr
[root@bogon www.test1.com]# ipvsadm -at 192.168.1.100:80 -r 192.168.1.51 -g
介绍一下新出现的参数:
接下来,我们就可以在外网,通过192.168.1.100这个IP访问配置的这几台Real Server上的Nginx服务了:
测试时,每次请求之前要清空浏览器缓存,这样才可以看到轮询的结果。
使用命令 ipvsadm -lcn ,出现如下问题:
CP 00:54 SYN_RECV h100:12949 192.168.1.100:80 h104:80
原因如下:
realserver的服务监听IP我选择了监听指定的IP,即eth0的IP,而未监听lo,即本地地址,那么即使收到了由directoryserver转发的请求,通过本地广播给本机的lo:0,因为服务没有监听lo,所以也不会有响应。
arp_ignore 响应级别:当接收到ARP请求时是否选择响应的级别。
arp_announce 向外通知级别:定义将自己地址主动向外通知的级别;
例如:假设一台主机,两个网卡,MAC1和MAC2
MAC1上边的网络接口有 eth0 和 lo。
IP地址配置为:
这里eth0和lo:1在同一子网。
MAC2 上边就一个接口eth0,配置IP 192.168.122.7/24。
若arp_announce=1:我们知道如果要通信,则一定是经过eth0接口,所以
注意到LVS-DR模型,VIP、DIP和RIP都在同一网段哦,所以设置arp_announce=1是不行的,因为RS主机上eth0上的RIP和lo:0上的VIP在同一网段,所以收到ARP广播是会响应的。
若arp_announce=2:通告最佳本地地址,即只有目标地址在网络接口的通信接口上,才予以回应。即通信接口(eth0)上的地址就是目标地址,才予以响应。
再了解一个概念:
一个RS主机有两个网络接口(不是两个网卡哦,说白了就是eth0和lo是两个接口,但是是同一个网卡,所以只有一个MAC,但是所有向外通信都是通过eth0这个接口),一个eth0一个lo,对吧,我们将VIP配置到lo接口的别名lo:0上,如果VIP要通信,则一定是通过eth0,对吧,也就是说当收到ARP广播请求VIP地址时,请求是通过eth0进来的,而VIP将以eth0的MAC并通过eth0予以响应,所以我们只要设置了忽略响应级别和响应级别,即设置只要请求的IP不是配置在eth0接口上,一律不予响应(arp_ignore的意义)
关于LVS-DR中的一个普遍误区:lo:0配置路由