1、Lvs的DR工作模式原理:
用直接路由技术实现虚拟服务器
DR模式是通过改写请求报文的目的MAC地址,将请求发送给真实服务器,服务器将响应消息直接发送给客户端
<1>通过在调度器上修改数据包的目的MAC地址实现转发,注意源地址仍然是CIP,目的地址仍然是VIP地址;
<2>请求的报文经过调度器,而服务器响应处理后的报文无需经过调度器,因此并发访问量大时使用效率很高(和NAT模式比)
<3>因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器只能在一个局域网里面
<4>服务器主机需要有VIP地址,并且需要配置ARP抑制。
DR工作模式下的数据流走向:client -> VS -> RS -> client
2、Lvs的部署
###实验环境
- server1 172.25.29.1 VS
- server2 172.25.29.2 RS
- server3 172.25.29.3 RS
###Server1:
[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# vim rhel-source.repo
[HighAvailability] //高可用
name=HighAvailability
baseurl=http://172.25.29.250/rhel6.5/HighAvailability
gpgcheck=0
[LoadBalancer] //负载均衡
name=LoadBalancer
baseurl=http://172.25.29.250/rhel6.5/LoadBalancer
gpgcheck=0
[ResilientStorage] //分布式存储
name=ResilientStorage
baseurl=http://172.25.29.250/rhel6.5/ResilientStorage
gpgcheck=0
[ScalableFileSystem] //大文件系统
name=ScalableFileSystem
baseurl=http://172.25.29.250/rhel6.5/ScalableFileSystem
gpgcheck=0
[root@server1 yum.repos.d]# yum install ipvsadm -y
[root@server1 yum.repos.d]# /etc/init.d/ipvsadm start
[root@server1 yum.repos.d]# ipvsadm -A -t 172.25.29.100:80 -s rr //-s 调度算法,DR模式不支持端口转发
[root@server1 yum.repos.d]# ipvsadm -a -t 172.25.29.100:80 -r 172.25.29.2:80 -g //-g 表示采用直连模式
[root@server1 yum.repos.d]# ipvsadm -a -t 172.25.29.100:80 -r 172.25.29.3:80 -g
[root@server1 yum.repos.d]# 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.29.100:http rr
-> server2:http Route 1 0 0
-> server3:http Route 1 0 0
[root@server1 yum.repos.d]# ip addr add 172.25.29.100/24 dev eth0
[root@server1 yum.repos.d]# ip addr
link/ether 52:54:00:00:1d:66 //MAC地址
###Server2:
[root@server2 ~]# /etc/init.d/httpd start
[root@server2 html]# cat index.html
Server2
[root@server2 ~]# yum install arptables_jf -y
[root@server2 ~]# ip addr add 172.25.29.100/24 dev eth0
[root@server2 ~]# ip addr
link/ether 52:54:00:9e:c6:99
###Server3:
[root@server3 ~]# /etc/init.d/httpd start
[root@server3 html]# cat index.html
server3
[root@server3 ~]# yum install arptables_jf -y
[root@server3 ~]# ip addr add 172.25.29.100/24 dev eth0
[root@server3 ~]# ip addr
link/ether 52:54:00:04:a7:ee
DS会修改客户端的目的MAC地址为RS,数据包到达RS,由链路层向上封装,故RS上必须有vip才能建立连接
###主机测试:
[root@foundation29 rhel6.5]# arp -an |grep 100
? (172.25.29.100) at 52:54:00:00:1d:66 [ether] on br0
[root@foundation29 rhel6.5]# arp -d 172.25.29.100
[root@foundation29 rhel6.5]# ping 172.25.29.100
[root@foundation29 rhel6.5]# arp -an |grep 100
? (172.25.29.100) at 52:54:00:9e:c6:99 [ether] on br0
[root@foundation29 rhel6.5]# arp -d 172.25.29.100
[root@foundation29 rhel6.5]# ping 172.25.29.100
[root@foundation29 rhel6.5]# arp -an |grep 100
? (172.25.29.100) at 52:54:00:04:a7:ee [ether] on br0
多次测试,可以看出其连接具有随机性,因为三台server在同一VLAN下具有相同的ip,因此并不能保证每次都访问的是调度器server1
为了解决这个问题,需要对RS进行ARP抑制,进行如下操作:
###Server2:
[root@server2 ~]# yum install arptables_jf -y
[root@server2 ~]# arptables -A IN -d 172.25.29.100 -j DROP
[root@server2 ~]# arptables -A OUT -s 172.25.29.100 -j mangle --mangle-ip-s 172.25.29.2 //以本身实际ip进行OUT
[root@server2 ~]# /etc/init.d/arptables_jf save
###Server3:
[root@server3 ~]# yum install arptables_jf -y
[root@server3 ~]# arptables -A IN -d 172.25.29.100 -j DROP
[root@server3 ~]# arptables -A OUT -s 172.25.29.100 -j mangle --mangle-ip-s 172.25.29.3
[root@server3 ~]# /etc/init.d/arptables_jf save
###主机测试:
[root@foundation29 rhel6.5]# arp -an |grep 100
? (172.25.29.100) at 52:54:00:00:1d:66 [ether] on br0 //每次都访问VS
[root@foundation29 rhel6.5]# curl 172.25.29.100
server2
[root@foundation29 rhel6.5]# curl 172.25.29.100
server3