一、LVS-DR工作原理
1、DR模式概述
DR(Direct Routing)
- 通过在调度器LB上修改数据包的目的MAC地址实现转发。注意,源IP地址仍然是CIP, 目的IP地址仍然是VIP。
- 请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB, 因此,并发访问量大时使用效率很高(和NAT模式比)
- 因DR模式是通过MAC地址的改写机制实现的转发,因此,所有RS节点和调度器LB只能在一个局域网LAN中(小缺点)。
- 需要注意RS节点的VIP的绑定(lo:vip/32,lo1:vip/32) 和ARP抑制问题。
- 强调下: RS节点的默认网关不需要是调度器LB的DIP, 而直接是DC机房分配的上级路由器的IP (这是RS带有外网P地址的情况),理论讲:只要RS可以出网即可,不是必须要配置外网IP。
- 由于DR模式的调度器仅进行了目的MAC地址的改写,因此,调度器LB无法改变请求的报文的目的端口(和NAT要区别)
- 当前,调度器LB支持几乎所有的UNIX,LINUX系统,但目前不支持WINDOWS系统。真实服务器RS节点可以是WINDOWS系统。
- 总的来说DR模式效率很高,但是配置也较麻烦,因此,访问量不是特别大的公司可以用haproxy/nginx取代之。这符合运维的原则:简单、易用、高效。日1000-2000W PV或并发请求1万-以下都可以考虑用haproxy/nginx (LVS NAT模式) 直接对外的访问业务,例如:web服务做RS节点,RS最好用公网IP地址。如果不直接对外的业务,例如: MySQL,存储系统RS节点,最好只用内部IP地址。 DR模式的核心特点就是更改目标MAC地址进行转发
cip为客户端的地址 vip为虚拟地址 rip为真实的服务器 lip为本地地址
2、如何分析LVS-DR数据包流向?
整个流程:
客户端------>网关
源IP地址:客户端IP 目标IP地址:VIP
源MAC地址:客户端MAC 目标MAC地址:网关MAC
网关------->分发器
源IP地址:客户端IP 目标IP地址:分发器VIP
源MAC地址:网关MAC 目标MAC地址:分发器VIP的MAC
分发器--------->服务器
先发广播找到服务器的RIP对应的MAC然后:
源IP地址:分发器DIP 目标IP地址:服务器VIP
源MAC地址:分发器DIP对应的MAC 目标MAC地址:服务器RIP对应的MAC
服务器---------->网关
源IP地址:服务器VIP 目标IP地址:客户端IP
源MAC地址:服务器RIP对应的MAC 目标MAC地址:网关的MAC
网关----------->客户端
源IP地址:服务器VIP 目标IP地址:客户端IP
源MAC地址:网关的MAC 目标MAC地址:客户端的MAC
3、DR模式的优缺点
优点:VS/DR跟 VS/TUN 方法相同,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量。
缺点:要求负载均衡器的网卡必须与物理网卡在一个物理段上
4、DR中存在的ARP问题
在LVS-DR负载均衡集群中,负载均衡器与节点服务器都要配置相同的VIP地址
在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱
当一个ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上的,它们都会接收到ARP广播 ,此时只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP广播 ,对节点服务器进行处理,使其不响应针对VIP的ARP请求
使用虚接口lo:0承载ⅥP地址 设置内核参数 arp_ignore=1:系统只响应目的IP为本地IP的ARP请求 RealServe返回报文(源IP是VIP)经路由器转发,在重新封装报文时需要先获取路由器的MAC地址
解决方法 修改/etc/sysctl.conf文件 对节点服务器进行处理,使其不响应针对VIP的ARP请求 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2
二、LVS-DR部署
1、实验目的
为了进一步提高公司网站的负载能力,公司决定扩展现有的网站平台,基于LVS构筑负载均衡群集。考虑到群集的访问效率,管理员准备采用LVS群集的DR模式,共享存储设备存放在内部专有网络中
2、实验拓扑
3、实验过程
两台LVS服务器都安装工具包
[root@lvs1 ~]# yum install keepalived ipvsadm -y '//keepalived:双机热备要用到的,ipvsadm:调度管理要用'
[root@lvs2 ~]# yum install keepalived ipvsadm -y
两台LVS服务器都开启路由转发,关闭重定向
[root@lvs1 ~]# vim /etc/sysctl.conf
'//尾行插入下段配置'
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@lvs1 ~]# sysctl -p '//重载配置,使之生效'
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
两台LVS服务器都创建脚本便于service管理
[root@lvs1 network-scripts]# vim /etc/init.d/dr.sh
'//编辑以下脚本内容'
#!/bin/bash
GW=192.168.100.1
VIP=192.168.100.10 ##虚拟ip
RIP1=192.168.100.201 ##真实web服务器ip
RIP2=192.168.100.202
case "1" in
start)
/sbin/ipvsadm --save>/etc/sysconfig/ipvsadm ##保存配置
systemctl start ipvsadm ##启动服务
/sbin/ifconfig ens33:0VIP broadcast VIP netmask 255.255.255.255 broadcastVIP up
##设置ens33:0地址,广播地址,子网掩码,并开启
/sbin/route add -host VIP dev ens33:0 ##添加路由网段信息
/sbin/ipvsadm -A -tVIP:80 -s rr ##指定虚拟服务访问入口,指定轮询算法
/sbin/ipvsadm -a -t VIP:80 -rRIP1:80 -g ##指定真实服务器,dr模式
/sbin/ipvsadm -a -t VIP:80 -rRIP2:80 -g
echo "ipvsadm starting --------------------[ok]"
;;
stop)
/sbin/ipvsadm -C ##清空缓存
systemctl stop ipvsadm ##关闭服务
ifconfig ens33:0 down ##关闭接口
route del VIP ##删除路由信息
echo "ipvsamd stoped----------------------[ok]"
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ];then ##判断文件存在与否决定状态
echo "ipvsadm stoped---------------"
exit 1
else
echo "ipvsamd Runing ---------[ok]"
fi
;;
*)
echo "Usage:0 {start|stop|status}"
exit 1
esac
exit 0
[root@lvs1 network-scripts]# chmod +x /etc/init.d/dr.sh
两台LVS服务器都修改网卡为仅主机模式
两台LVS服务器都为ens33配置IP地址、ens33:0配置ⅥP地址
[root@lvs1 ~]# cd /etc/sysconfig/network-scripts/
[root@lvs1 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33:0
[root@lvs1 network-scripts]# vim ifcfg-ens33:0 '//配置虚拟ip地址'
'//删除原本内容,添加以下配置'
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.100.10
NETMASK=255.255.255.0
[root@lvs1 network-scripts]# vim ifcfg-ens33
'//...省略内容,修改为static'
BOOTPROTO=static
'//...省略内容,尾行添加内容'
IPADDR=192.168.100.100
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
[root@lvs2 network-scripts]# vim ifcfg-ens33
'//注意lvs2的IP地址为192.168.100.101'
IPADDR=192.168.100.101
两台LVS服务器都重启各项配置
[root@lvs1 network-scripts]# systemctl restart network
[root@lvs1 network-scripts]# ifup ens33:0
[root@lvs1 network-scripts]# service dr.sh start
ipvsadm starting --------------------[ok]
[root@lvs1 network-scripts]# systemctl stop firewalld.service
[root@lvs1 network-scripts]# setenforce 0
'使用ifconfig查看虚拟接口是否打开 如果打不开 将networkmanger关掉再重新尝试'
配置两台节点IP地址绑定VIP LVS-DR中,两台节点服务器要配置绑定VIP地址
VIP地址仅用作Web响应数据包的源地址,并不监听客户机的访问请求
都修改为仅主机模式
两台节点服务器为ens33配置IP地址,为lo:0配置VIP地址
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 network-scripts]# cp -p ifcfg-lo ifcfg-lo:0
[root@web1 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.100.10
NETMASK=255.255.255.0
ONBOOT=yes
[root@web1 network-scripts]# vim ifcfg-ens33
'//...省略内容,修改为static'
BOOTPROTO=static
'//...省略内容,尾行添加内容'
IPADDR=192.168.100.201
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
'//其中web2服务器修改为192.168.100.202'
IPADDR=192.168.100.202
节点服务器配置抑制ARP响应 配置抑制ARP脚本
[root@web1 network-scripts]# vim /etc/init.d/web.sh
#!/bin/bash
VIP=192.168.100.10
case "1" in
start)
ifconfig lo:0VIP netmask 255.255.255.255 broadcast VIP
/sbin/route add -hostVIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore '//arp忽略'
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
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK "
;;
stop)
ifconfig lo:0 down
route del VIP /dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore '//arp开启'
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 "RealServer Stopd"
;;
*)
echo "Usage:0 {start|stop}"
exit 1
esac
exit 0
[root@web1 network-scripts]# chmod +x /etc/init.d/web.sh
两台节点服务器配置测试网址 在两台节点服务器上安装配置并启用httpd服务器,分别创建测试网页,测试网页内容要不相同,以区别不同的节点服务器
[root@web1 ~]# yum install httpd -y
[root@web2 ~]# yum install httpd -y
[root@web1 ~]# vim /var/www/html/index.html
<h1>this shang web</h1>
[root@web2 ~]# vim /var/www/html/index.html
<h1>this is zhen web</h1>
重启各项服务
[root@web1 network-scripts]# systemctl restart network
[root@web1 network-scripts]# ifup lo:0
[root@web1 network-scripts]# service web.sh start
RealServer Start OK
[root@web1 network-scripts]# systemctl start httpd
[root@web1 network-scripts]# systemctl stop firewalld.service
[root@web1 network-scripts]# setenforce 0