LVS的工作模式有三种:LVS/NAT;LVS/DR;LVS/Tun
本文主要讲的是LVS/DR模式
重将请求报文的目标MAC地址设定为挑选出的RS的MAC地址
(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c) IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
(d) 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
(e) RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
(f) 响应报文最终送达至客户端
2. LVS-DR模型的特性
特点1:保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS
RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
RS跟Director Server必须在同一个物理网络中
所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
不支持地址转换,也不支持端口映射
RS可以是大多数常见的操作系统
RS的网关绝不允许指向DIP(因为我们不允许他经过director)
RS上的lo接口配置VIP的IP地址
缺陷:RS和DS必须在同一机房中
3. 特点1的解决方案:
在前端路由器做静态地址路由绑定,将对于VIP的地址仅路由到Director Server
存在问题:用户未必有路由操作权限,因为有可能是运营商提供的,所以这个方法未必实用
arptables:在arp的层次上实现在ARP解析时做防火墙规则,过滤RS响应ARP请求。这是由iptables提供的
修改RS上内核参数(arp_ignore和arp_announce)将RS上的VIP配置在lo接口的别名上,并限制其不能响应对VIP地址解析请求。
准备三台机器,IP如下
dir机器(director调度服务器) |
192.168.182.129 |
rs机器(real server 真实服务器) |
192.168.182.130 |
rs机器(real server 真实服务器) |
192.168.182.132 |
VIP(虚拟IP) |
192.168.182.136 |
在调度服务器192.168.182.129上安装ipvsadm
yum install -y ipvsadm
在两台真实服务器上安装nginx
安装nginx的目的是为了验证LVS的转发是否成功,nginx要安装在真实服务器上
安装过程略,可参考博客:https://blog.csdn.net/u014642915/article/details/60870058
两个nginx的主页面写入不同的信息用来进行验证负载:
echo "182.132" >/usr/local/nginx/html/index.html
echo "182.130" >/usr/local/nginx/html/index.html
nginx默认开启80端口,如果需要开启其他端口需修改配置文件nginx.conf进行修改
调度服务器192.168.182.129 上编写脚本:
vim /etc/init.d/lvsrs.sh
#! /bin/bash
#director服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
#调用ipvsadm命令,填写实际路径可用which ipvsadm来查看实际路径
ipv=/sbin/ipvsadm
vip=192.168.182.136
rs1=192.168.182.130
rs2=192.168.182.132
#注意这里的网卡名字
ifdown etho #为了不让网卡设置多次
ifup etho
ifconfig etho:2 $vip broadcast $vip netmask 255.255.255.255 up
#配置到vip的路由
route add -host $vip dev etho:2
#配置ipvsadm,调度算法rr;-w 1表示开启权重,80表示nginx的80端口
$ipv -C
$ipv -A -t $vip:80 -s rr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
两台真实服务器192.168.182.130、192.168.182.132上编写脚本
vim /etc/init.d/lvsrs.sh
#/bin/bash
vip=192.168.182.136
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
#避免重复设置
ifconfig lo:0 down
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
说明:其中netmask 255.255.255.255 up 一定要这样写,不然调度服务和真实服务之前的网络会不通
真实服务器上lvsrs脚本的另一种写法
vim /etc/init.d/lvsrs
#/bin/bash
case "$1" in
start)
echo "Start LVS of realserver"
vip=192.168.182.136
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
#避免重复设置
ifconfig lo:0 down
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
echo "Close LVS Director realserver"
ifconfig lo:0 down
route del -net $vip netmask 255.255.255.255
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "$0: Usage: $0 {start|stop}"
exit 1
esac
#给其执行权限chmod +x /etc/init.d/lvsrs
#启动
/etc/init.d/lvsrs start
#关闭
/etc/init.d/lvsrs stop
调度服务器的lvsrs脚本也可以参照上面的格式,请自行书写
DIR上进行两项检查,执行两个命令:ifconfig 和 ip add
ifconfig
ip add
添加了一个虚拟ip(VIP) eth0:2 地址是192.168.182.136
SR上进行一项检查:
ifconfig
添加了一个虚拟ip(VIP) lo:0 地址是192.168.182.136
1.直接访问http://192.168.182.136:80 看能否访问
2.关闭其中一个nginx 看是否能继续访问另一个nginx的页面
感谢博主:https://blog.csdn.net/Ki8Qzvka6Gz4n450m/article/details/79119665