负载均衡LVS-DR群集部署

一、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

3、验证

发表回复