介绍
优缺点以及适用场景
优点:能负载更多的Realserver减轻LB的压力,性能高于tun模式。
缺点:不支持端口转发(VIP:80必须代理RIP:80),Realserver和LVS需要在同一网段下。
适用:适用于大多数公司,也是大多数公司用的最多的模式。
DR模式:路由模式原理,ip不变主要改MAC地址
1.客户端把请求数据包发给DirectorServer
2.DirectorServer拆包查看(源ip:CIP源MAC:CIP-MAC, 目标ip:VIP 目标MAC:VIP-MAC),这个包是给自己的就会收下数据包。
3.DirectorServer通过算法(rr wrr)找一台合适的RealServer,修改数据包(源ip:CIP源MAC:DIP-MAC, 目标ip:VIP 目标MAC:RIP-MAC),封装发给后端Realserver
4.RealServer收报/拆包发现目标MAC是给自己的就会收下数据包。
5.RealServer会把需要回复的数据加入数据包中并修改数据包(源ip:VIP 源MAC:vip-MAC,目标ip:CIP 目标MAC:CIP-MAC),封包发给客户端
DR模式中后端RealServer为什么要抑制ARP广播
arp工作在数据链路层和网络层,只有找到对方的MAC地址后才能进行TCP三次握手建立链接
当客户端发起arp广播时会询问"vip对应的MAC地址是谁?",LB和RS都有vip,都会对回复arp响应,这样就会出现数据包不经过lvs转发直接发送给后端RealServer的情况。
1、传统部署
lvs基于四层ip+端口转发,不支持基于url和目录的转发
一、准备环境
二、部署
1、LB部署脚本
# yum -y install ipvsadm
# cat /usr/local/sbin/lvs_dr.sh
#!/bin/bash
# 开启路由转发
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.1.200
rs1=192.168.1.11
rs2=192.168.1.12
#注意这里的网卡名字
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up
# 让vip走虚拟网卡
route add -host $vip dev ens33:2
$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
------------------------------
-A: 表示添加一条虚拟服务器记录
-D: 表示删除虚拟服务ipvsadm -D -t 172.168.1.100:80 删除后它下面的规则也都没有了
-a: 表示添加一条真实服务器的映射规则
-d: 表示删除后端realserver,删除时不要指定权重和模式
-s:表示算法
-t: 表示增加tcp端口
-r:表示增加realserver地址和tcp端口
-g: 表示DR模式
-w: 表示权重
2、RealServer部署脚本
# yum -y install nginx
# cat /usr/local/sbin/lvs_dr_rs.sh
#/bin/bash
vip=192.168.1.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
# 让vip走虚拟网卡
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
3、执行脚本
[root@lb ~]# bash /usr/local/sbin/lvs_dr.sh
[root@web1 ~]# bash /usr/local/sbin/lvs_dr_rs.sh
[root@web2 ~]# bash /usr/local/sbin/lvs_dr_rs.sh
4、监控检测脚本
# cat /usr/local/sbin/lvs_dr_check.sh
#!/bin/bash
VIP=192.168.1.200:80
RIP1=192.168.1.11:80
RIP2=192.168.1.12:80
while true
do
for IP in $RIP1 $RIP2
do
curl -s http://$IP > /dev/null 2>&1
if [[ $? -eq 0 ]]
then
# 检测后端realserver没问题则加入集群
ipvsadm -Ln |grep -q $IP || ipvsadm -a -t $VIP -r $IP
else
# 如果检测后端realserver有问题则踢出集群,删除的时候不要指定模式和权重
ipvsadm -Ln |grep -q $IP && ipvsadm -d -t $VIP -r $IP
fi
done
sleep 1
done
5、注意:不要在LB上用curl测试命令,因为每台服务器上都有vip,直接用curl访问是无法成功的,最好用客户端浏览器/cmd访问。(用linux做客户端最好没有缓存)