LVS-DR(Direct Routing )直接路由

1.DR模式工作原理(工作在二层)

它通过修改请求报文的目标mac地址进行转发
Director:VIP DIP
RS:VIP RIP
1.保证前端路由器将目标IP为VIP的请求报文发送给director(静态绑定 arptables 修改rs主机内核的参数)
2.rs的rip可以使用私有地址,但也可以使用公网地址
3.请求报文经由director调度,但向英国报文一定不能经由director
4.rs跟director必须在同一物理网络中(同一物理网络不等于同网段)
5.RS网关不能指向dip

工作流程:
LVS-DR(Direct Routing )直接路由

(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
© 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) 响应报文最终送达至客户端

DR模式负载均衡搭建

准备工作:
准备三台虚拟机server1,2,3
将server1作为lvs调度器,server2,3作为后台服务器

1)配置yum源

[[email protected] ~]# vim /etc/yum.repos.d/rhel-source.repo 
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.24.250/rhel6.5
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

##负载均衡
[LoadBalancer]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.24.250/rhel6.5/LoadBalancer
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

[[email protected] ~]# yum clean all
[[email protected] ~]# yum repolist

##将另外两台虚拟机的yum源一并配好
[[email protected] ~]# scp /etc/yum.repos.d/rhel-source.repo [email protected]:/etc/yum.repos.d/
[[email protected] ~]# scp /etc/yum.repos.d/rhel-source.repo [email protected]:/etc/yum.repos.d/

LVS-DR(Direct Routing )直接路由

LVS-DR(Direct Routing )直接路由

2)配置lvs调度器(server1)

##下载lvs编写工具
[[email protected] ~]# yum install ipvsadm -y
[[email protected] ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

##绑定vip
[[email protected] ~]# ip addr add 172.25.24.100/24 dev eth0

##加载rule
[[email protected] ~]# ipvsadm -C   ##	清空ipvs转发表
[[email protected] ~]# ipvsadm -l   ##查看ipvs转发表内容
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags

[[email protected] ~]# ipvsadm -A -t 172.25.24.100:80 -s rr  ##-A:添加一个虚拟服务 -t:tcp服务 -s:轮循策略
[[email protected] ~]# ipvsadm -a -t 172.25.24.100:80 -r 172.25.24.2:80 -g   ##将server2,3设置为后台服务器
[[email protected] ~]# ipvsadm -a -t 172.25.24.100:80 -r 172.25.24.3:80 -g

[[email protected] ~]# ipvsadm -l  ##再次查看
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.24.100:http rr
  -> server2:http                 Route   1      0          0         
  -> server3:http                 Route   1      0          0         
[[email protected] ~]# /etc/init.d/ipvsadm save   ##保存设置也可以用指令service ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm:      [  OK  ]

LVS-DR(Direct Routing )直接路由

LVS-DR(Direct Routing )直接路由

3)配置后台服务机(server2,server3)
此处以server2为例,server3上配置操作相同

[[email protected] ~]# yum install httpd -y
##修改默认发布页,方便显示测试成果
[[email protected] ~]# vim /var/www/html/index.html
server2
[[email protected] ~]# /etc/init.d/httpd start 
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.24.2 for ServerName
                                                           [  OK  ]
                                                           
##绑定vip
[[email protected] ~]# ip addr add 172.25.24.100/32 dev eth0

LVS-DR(Direct Routing )直接路由
此时通过测试机进行测试:

[[email protected] ~]# curl 172.25.24.100  ##访问172.25.24.100
server2
[[email protected] ~]# curl 172.25.24.100
server2
[[email protected] ~]# arp -an | grep 100    ##查看访问目标的物理地址
? (172.25.24.100) at 52:54:00:9e:a7:2b [ether] on br0
[[email protected] ~]# arp -d 172.25.24.100   ##清除访问数据
[[email protected] ~]# curl 172.25.24.100    ##再次访问
server2
[[email protected] ~]# arp -an | grep 100    ##查看访问目标地址
? (172.25.24.100) at 52:54:00:64:ec:41 [ether] on br0
[[email protected] ~]# curl 172.25.24.100    
server3

LVS-DR(Direct Routing )直接路由
LVS-DR(Direct Routing )直接路由
LVS-DR(Direct Routing )直接路由
当我们第一次访问100时并不能实现负载均衡,查看访问目标的物理地址后发现访问的为server2上的eth0,在清除访问数据后再次访问时才成功访问server1,并实现了负载均衡。
但这显然时不符合我们的预期目标的,为了使用户每次访问都访问server1而不是直接访问我们的后台服务器,我们需要将后台服务器的关于100的广播响应功能关闭

##方法一:arptables

##server2,3上操作基本相同
[[email protected] ~]# yum search arptables 
[[email protected] ~]# yum install arptables_jf.x86_64 -y
[[email protected] ~]# arptables -L
Chain IN (policy ACCEPT)
target     source-ip            destination-ip       source-hw          destination-hw     hlen   op         hrd        pro       

Chain OUT (policy ACCEPT)
target     source-ip            destination-ip       source-hw          destination-hw     hlen   op         hrd        pro       

Chain FORWARD (policy ACCEPT)
target     source-ip            destination-ip       source-hw          destination-hw     hlen   op         hrd        pro     

[[email protected] ~]# arptables -A IN -d 172.25.24.100 -j DROP  ##对172.25.24.100的广播不响应
[[email protected] ~]# arptables -A OUT -s 172.25.24.100 -j mangle --mangle-ip-s 172.25.24.2(两机分别为2,3)  ##当有100的访问时,用本机返回
[[email protected] ~]# /etc/init.d/arptables_jf save
Saving current rules to /etc/sysconfig/arptables:          [  OK  ]

##方法二:修改内核参数:
/etc/init.d/arptables_jf stop

arp_ignore 和arp_announce 参数都和ARP协议相关名主要用于控制系统返回arp响应和发送aro请求时的动作。这两个参数很重要,特别是在LVS的DR场景下,它们的配置直接影响到DR转发是否正常

arp_ignore 参数的作用是控制系统在受到外部的aro请求时,是否要返回arp响应
1:只响应目的IP地址为接收网卡的本地地址的arp请求

arp_announce 的作用时控制系统在对外发送arp请求时,如何选择arp请求数据包的源IP地址
2:忽略IP数据包的源地址IP,选择该发送网卡上最合适的本地地址作为arp请求的源地址

sysctl -a | grep arp_ignore

sysctl -a | grep arp_announce

sysctl -w net.ipv4.conf.lo.arp_ignore=1
sysctl -w net.ipv4.conf.lo.arp_announce=2
sysctl -w net.ipv4.conf.all.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_announce=2
sysctl -p

4)测试:
在测试机上不断访问100,并多次清除访问数据重新访问,仍能实现负载均衡,实验成功

LVS-DR(Direct Routing )直接路由
5)如何实现健康检查
虽然可以通过ipvsadm我们可以实现负载均衡,但是当我们的后台服务器有一台挂掉时,ipvsadm并不能使挂掉的服务器下线,这会导致访问的时候会有报错,所以需要通过其他软件实现健康检查

LVS-DR(Direct Routing )直接路由
LVS-DR(Direct Routing )直接路由

在调度器server1上
a.再次添加高级yum源

[[email protected] ~]# vim /etc/yum.repos.d/rhel-source.repo
[HighAvailability]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.24.250/rhel6.5/HighAvailability
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[[email protected] ~]# yum clean all
[[email protected] ~]# yum repolist

LVS-DR(Direct Routing )直接路由

b.下载ldirectord服务并进行配置

[[email protected] ~]# yum install ldirectord-3.9.5-3.1.x86_64.rpm  -y  ##安装包需要自己从官网下载
[[email protected] /]# rpm -qpl ldirectord-3.9.5-3.1.x86_64.rpm
warning: ldirectord-3.9.5-3.1.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 7b709911: NOKEY
/etc/ha.d
/etc/ha.d/resource.d
/etc/ha.d/resource.d/ldirectord
/etc/init.d/ldirectord
/etc/logrotate.d/ldirectord
/usr/lib/ocf/resource.d/heartbeat/ldirectord
/usr/sbin/ldirectord
/usr/share/doc/ldirectord-3.9.5
/usr/share/doc/ldirectord-3.9.5/COPYING
/usr/share/doc/ldirectord-3.9.5/ldirectord.cf
/usr/share/man/man8/ldirectord.8.gz
[[email protected] ~]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
[[email protected] ~]# vim /etc/ha.d/ldirectord.cf
virtual=172.25.24.100:80 ##   
        real=172.25.24.2:80 gate
        real=172.25.24.3:80 gate
        fallback=127.0.0.1:80 gate
        service=http
        scheduler=rr
        #persistent=600
        #netmask=255.255.255.255
        protocol=tcp
        checktype=negotiate
        checkport=80
        request="index.html"
        #receive="Test Page"
        #virtualhost=www.x.y.z   ##这两行必须注释掉不然会报错
[[email protected] ~]# ipvsadm -C   ##清空编写规则
[[email protected] ~]# /etc/init.d/ldirectord start     ##一定要先清空ipvsadm编写的规则再启动ldirectord
Starting ldirectord... success

LVS-DR(Direct Routing )直接路由

LVS-DR(Direct Routing )直接路由

测试:
将后台服务器server2的httpd服务关闭后,server2服务器会被自动下线
LVS-DR(Direct Routing )直接路由
LVS-DR(Direct Routing )直接路由