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
工作流程:
(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/
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 ]
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
此时通过测试机进行测试:
[[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
当我们第一次访问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,并多次清除访问数据重新访问,仍能实现负载均衡,实验成功
5)如何实现健康检查
虽然可以通过ipvsadm我们可以实现负载均衡,但是当我们的后台服务器有一台挂掉时,ipvsadm并不能使挂掉的服务器下线,这会导致访问的时候会有报错,所以需要通过其他软件实现健康检查
在调度器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
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
测试:
将后台服务器server2的httpd服务关闭后,server2服务器会被自动下线