一:DR工作模式的工作流程:
(a)当用户请求到达DirectorServer,此时请求的数据报文会先到内核空间的PREROUTING链。此时报文的源IP为CIP,目标IP为VIP
(b)PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c)IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
(d)由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至RealServer。
(e)RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。此时的源IP地址为VIP,目标IP为CIP
(f)响应报文最终送达至客户端
二:DR特点;
1、保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS
2、RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
3、RS跟Director Server必须在同一个物理网络中
4、所有的请求报文经由Director Server,但响应报文必须不能进过DirectorServer
5、不支持地址转换,也不支持端口映射
6、RS可以是大多数常见的操作系统
7、RS的网关绝不允许指向DIP(因为我们不允许他经过director)
8、RS上的lo接口配置VIP的IP地址
三:具体实现;
1、环境准备:一台虚拟机做director,两台real server
2、director负载均衡器配置;
[root@Centos6 ~]# ifconfig eth0:0 172.17.252.225 broadcast 172.17.252.225 up #将VIP配置到本地网卡别名,并只广播自己
[root@Centos6 ~]# route add -host 172.17.252.225 dev eth0:0 #配置VIP路由
[root@Centos6 ~]# ipvsadm -A -t 172.17.252.225:80 -s wrr #开启基于80端口的调度服务,调度方式为wrr
[root@Centos6 ~]# ipvsadm -a -t 172.17.252.225:80 -r 172.17.200.106:80 -g -w 1 #配置两台后端web服务real server,-g:DR工作模式,-w:权重(此处配为1)
[root@Centos6 ~]# ipvsadm -a -t 172.17.252.225:80 -r 172.17.250.111:80 -g -w 1
[root@Centos6 ~]# ipvsadm -Ln #可查看到港配置的规则
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.17.252.225:80 wrr
-> 172.17.200.106:80 Route 1 0 0
-> 172.17.250.111:80 Route 1 0 0
[root@Centos6 ~]# vim /etc/sysctl.conf #然后修改配置文件,使其支持转发
net.ipv4.ip_forward = 1 #centos 7里需要手动添加此行,Centos 6中直接修改
[root@Centos6 ~]# sysctl -p #该命令使修改的配置文件生效,并显示结果
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
3、后端web服务real server的配置;
[root@Centos6 ~]# ifconfig lo:0 172.17.252.225 broadcast 172.17.252.225 netmask 255.255.255.255 up #将VIP配置到本地回环网卡lo上,并只广播自己
[root@Centos6 ~]# route add -host 172.17.252.225 lo:0 #配置本地回环网卡路由
[root@Centos6 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore #只回答来访问本地地址的ARP查询请求
[root@Centos6 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce #不看IP数据包的源地址,只要目的MAC地址是本地地址就行
[root@Centos6 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore #只有在接收请求报文的接口上配有请求的目标IP时,才响应
[root@Centos6 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce #必须避免将接口信息向非本网络进行通告
我这里用的Apache测试的,所以,在三台机器上分别启动httpd服务,若是有php页面的话,可以将php服务、数据库服务都启动,
四:测试;
在两个real server的/var/www/html下建两个index.html的页面,不同内容,用于区分director调度出不同的页面,测试是否配置成功;
方法:
1、直接在网页输入vip进行访问;
2、或者用另外一台虚拟机(除本实验用到的三台外的其他虚拟机)进行curl
五:实验总结;
相较于NAT模式,DR模式减轻了director负载均衡器的负担,不用进出都经过它,出的时候直接通过real server中的VIP去返回客户端响应;
关于实验中用到的ipvsadm命令;
其程序包来自ipvsadm,用法:
-A --add-service 在服务器列表中新添加一条新的虚拟服务器记录
-s --scheduler 使用的调度算法,rr| wrr| lc| wlc| lblb| lblcr| dh | sh | sed| nq 默认调度算法是 wlc
-a --add-server 在服务器表中添加一条新的真实主机记录
-t --tcp-service 说明虚拟服务器提供tcp服务
-u --udp-service 说明虚拟服务器提供udp服务
-r --real-server 真实服务器地址
-w --weight 真实服务器的权值
-m --masquerading 指定LVS工作模式为NAT模式
-g --gatewaying 指定LVS工作模式为直接路由器DR模式(也是LVS默认的模式)
-i --ip 指定LVS的工作模式为隧道模式
-p 会话保持时间,定义流量呗转到同一个realserver的会话存留时间
eg:ipvsadm -A -t 192.168.1.2:80 -s wlc -----》加director server
eg:ipvsadm -a -t192.168.1.2:80 -r192.168.2.10:80-m -w 1 ----》加real server