DR(Direct Routing)直接路由模式
数据流向:client -> vs -> Rs ->client
DR模式下调度器和服务器组都必须在物理上有一个网卡通过不分段的局域网相连,即通过交换机或者高速的HUB相连,中间没有隔有路由器。
VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文
所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP的网络求。
实验步骤
配置vs
我们先要安装ipvsadm – lvs 的管理工具,6的版本该包放在了LoadBalancer(负载均衡)目录下,我们需要在yum源的配置文件中增加该模块.
[root@server1 yum.repos.d]# vi rhel-source.repoyum源没有问题了,在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 调度算法:轮询
[root@server1 yum.repos.d]# ipvsadm -A -t 172.25.254.100:80 -s rr
[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.254.100:http rr
(2)添加后端实际服务器
[root@server1 yum.repos.d]# ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.2:80 -g
[root@server1 yum.repos.d]# ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.3:80 -g
(3)保存策略
[root@server1 yum.repos.d]# /etc/init.d/ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
显示调度次数ipvsadm -L (-n不解析)
[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.254.100:http rr
-> 172.25.254.2:http Route 1 0 0
-> 172.25.254.3:http Route 1 0 0
添加VIP
给所有的服务器把 VIP 地址配置在各自的 NonARP 网络设备上
- vs
[root@server1 yum.repos.d]# ip addr add 172.25.254.100/24 dev eth0
[root@server1 yum.repos.d]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:f1:a9:cb brd ff:ff:ff:ff:ff:ff
inet 172.25.254.1/24 brd 172.25.254.255 scope global eth0
inet 172.25.254.100/24 scope global secondary eth0
inet6 fe80::5054:ff:fef1:a9cb/64 scope link
valid_lft forever preferred_lft forever - rs
[root@server3 html]# ip addr add 172.25.254.100/32 dev eth1
root@server2 html]# ip addr add 172.25.254.100/32 dev eth1
后端服务器配置:
安装apache,开启服务,并编辑默认发布目录.
测试:
arp -d 172.25.2545.100 清除缓存
curl 172.25.17.100
arp -an | grep 100 查看缓存
? (172.25.254.100) at ==52:54:00:f1:a9:cb== [ether] on br0
会出现漏洞,当清掉mac地址的缓存后,再次访问,客户可能会缓存到rs的mac地址,那么负载均衡将没用了。
[root@foundation68 ~]# arp -an | grep 100
? (172.25.254.100) at ==52:54:00:27:10:fb== [ether] on br0 #缓存到了真正的rs的mac地址
[root@foundation68 ~]# curl 172.25.254.100
<h1>server3.example.com</h1>
[root@foundation68 ~]# curl 172.25.254.100
<h1>server3.example.com</h1
解决方式:
要避免这种情况,要求只能绑定server1(调度器)的MAC地址,所以我们要配置server2和server3的arp路由策略
在server2和server3中下载yum install -y arptables_jf
为arptables网络的用户控制过滤的守护进程
防止在物理机中测试时直接访问server2和server3
增加策略(两个rs都要做)
[root@server2 html]# arptables -A IN -d 172.25.254.100 -j DROP
[root@server2 html]# arptables -A OUT -s 172.25.254.100 -j mangle --mangle-ip-s 172.25.254.2
[root@server2 html]# /etc/init.d/arptables_jf save
Saving current rules to /etc/sysconfig/arptables: [ OK ]
[root@server2 html]# /etc/init.d/arptables_jf start
Flushing all current rules and user defined chains: [ OK ]
Clearing all current rules and user defined chains: [ OK ]
Applying arptables firewall rules:
再次测试:
先删除现有绑定MAC地址
arp -d 172.25.254.100
测试端测试curl 172.25.64.100(出现轮询,且数据经过调度器)
[root@foundation68 ~]# arp -d 172.25.254.100
[root@foundation68 ~]# curl 172.25.254.100
<h1>server3.example.com</h1>
[root@foundation68 ~]# curl 172.25.254.100
<h1>server2.example.com</h1>
健康检查
目的:
健康检查(后端出现问题后,将其剔出server pool)
部署:
我们需要先在yum源的配置文件中更新高可用的包.
安装软件ldirectord-3.9.5-3.1.x86_64.rpm用来对后端服务器做健康检查
先下载该包,我的物理机机已经下好了,scp过去.
[root@server1 ~]# yum install ldirectord-3.9.5-3.1.x86_64.rpm -y
查看配置文件
[root@server1 ~]# 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
将配置文件的母板拷到/etc/ha.d/
mv /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
vim ldirectord.cf
#修改内容
24 # Sample for an http virtual service
25 virtual=172.25.17.100:80
26 real=172.25.17.2:80 gate
27 real=172.25.17.3:80 gate
28 fallback=127.0.0.1:80 gate
29 service=http
30 scheduler=rr
31 #persistent=600
32 #netmask=255.255.255.255
33 protocol=tcp
34 checktype=negotiate
35 checkport=80
36 request="index.html"
37 # receive="Test Page"
38 # virtualhost=www.x.y.z
/etc/init.d/ldirectord start
- 测试
现在我关掉serevr2上开启的服务.
[root@foundation68 rhel6.5]# curl 172.25.254.100