LVS模式一:DR(Direct Routing)直接路由模式
client -> vs -> Rs ->client
- DR模式下调度器和服务器组都必须在物理上有一个网卡通过不分段的局域网相连,即通过交换机或者高速的HUB相连,中间没有隔有路由器。
- VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文
- 所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP的网络请求。
主机环境:
主机名 | IP |
---|---|
server1 | 172.25.64.1 |
server2 | 172.25.64.2 |
server3 | 172.25.64.3 |
- server2
1.安装apache
[root@server2 ~]# yum install httpd -y
- 编写前端文件
[root@server2 ~]# cd /var/www/html
[root@server2 html]# vim index.html
<h1>www.westos.org - server2</h1>
- server3:同上
[root@server3 ~]# cd /var/www/html
[root@server3 html]# vim index.html
<h1>www.westos.org - server3</h1>
- rhel6.5 selinux and iptables disabled
- Load Balance: 172.25.64.1(server1)
- Virtual IP:172.25.64.100
- RealRerver1:172.25.64.2 (server2)
- RealRerver2:172.25.64.3(server3)
- 物理机内网 : 172.25.64.250
一、配置 ipvsadm
- 在虚拟服务器上配置更高级yum源
[root@server1 ~]# vim /etc/yum.repos.d/rhel-source.repo
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.64.250/rhel6.5
enabled=1
gpgcheck=0
[LoadBalancer] ##负载均衡
name=LoadBalancer
baseurl=http://172.25.64.250/rhel6.5/LoadBalancer
enabled=1
gpgcheck=0
[root@server1 yum.repos.d]# yum clean all
[root@server1 yum.repos.d]# yum repolist
- 在server1(虚拟服务器)上安装ipvsadm(调度器)
[root@server1 yum.repos.d]# yum install ipvsadm -y
- 添加策略
(1)添加一台虚拟设备
-A 增加一台虚拟设备
-a 添加真实服务器的操作
-t tcp服务地址
-s 调度算法(10中调度算法rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)
-r 对应的真实ip
-g rh(路由)
rr 调度算法:轮询
(2)添加后端实际服务器
(3)保存策略
[root@server1 ~]# ipvsadm -A -t 172.25.64.100:80 -s rr
[root@server1 ~]# ipvsadm -a -t 172.25.64.100:80 -r 172.25.64.2:80 -g
[root@server1 ~]# ipvsadm -a -t 172.25.64.100:80 -r 172.25.64.3:80 -g
##保存策略
[root@server1 ~]# /etc/init.d/ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
- 显示调度次数ipvsadm -L (-n不解析)
[root@server1 ~]# 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.64.100:http rr
-> server2:http Route 1 0 0
-> server3:http Route 1 0 0
[root@server1 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.64.100:80 rr
-> 172.25.64.2:80 Route 1 0 0
-> 172.25.64.3:80 Route 1 0 0
- 添加VIP
- 给所有的服务器把 VIP 地址配置在各自的 NonARP 网络设备上
[root@server1 ~]# ip addr add 172.25.64.100/24 dev eth0
[root@server2 html]# ip addr add 172.25.64.100/32 dev eth0
[root@server3 html]# ip addr add 172.24.64.100/32 dev eth0
- 将server2,和server3的httpd服务都打开
[root@server2 html]# /etc/init.d/httpd start
[root@server3 html]# /etc/init.d/httpd start
- 测试:
-
以上情况,server1,2,3都有可能被访问到
-
如果绑定的MAC地址是server1,则在server2,3轮询
-
如果绑定的MAC地址是sever2或sever3的,那么我们会发现,在测试端根本不会形成轮叫,而是直接去了MAC绑定的后端服务器 (显然这样在企业中是不允许的)
-
绑定的MAC地址是server1的情况
arp -an | grep 100 查看绑定的MAC地址 -
发现绑定的就是server1的MAC地址
-
arp -d 172.25.64.100 删除现有绑定MAC地址
-
绑定的MAC地址是server2的情况
-
如何避免这种情况实现?
-
要避免这种情况,要求只能绑定server1(调度器)的MAC地址,所以我们要配置server2和server3的arp路由策略
- 在server2和server3中下载yum install -y arptables_jf
- 为arptables网络的用户控制过滤的守护进程
- 防止在物理机中测试时直接访问server2和server3
[root@server2 html]# yum install arptables_jf -y
# 当网内广播需要172.25.64.100这个ip时,它丢弃所有网内的请求
[root@server2 html]# arptables -A IN -d 172.25.64.100 -j DROP
# 当它自身需要在网内发包时,伪装为自己原本的ip172.25.64.2
[root@server2 html]# arptables -A OUT -s 172.25.64.100 -j mangle --mangle-ip-s 172.25.64.2
#保存添加的两条策略
[root@server2 html]# /etc/init.d/arptables_jf save
#打开arptables服务
[root@server2 html]# /etc/init.d/arptables_jf start
##server3和server2一样
[root@server3 html]# yum install arptables_jf -y
[root@server3 html]# arptables -A IN -d 172.25.64.100 -j DROP
[root@server3 html]# arptables -A OUT -s 172.25.64.100 -j mangle --mangle-ip-s 172.25.64.3
[root@server3 html]# /etc/init.d/arptables_jf save
[root@server3 html]# /etc/init.d/arptables_jf start
- 再次测试:
- 先删除现有绑定MAC地址
arp -d 172.25.64.100 - 测试端测试curl 172.25.64.100(出现轮叫,且数据经过调度器)