VS/DR模式拓扑:
++++++++++++++++
+-----------> + Client +
| ++++++++++++ down eth1 1.1.1.250/24
| |
router
| |
| ++++++++++++ VIP eth0:1 1.1.1.1/24
| + Director +
| ++++++++++++ DIP eth0 1.1.1.100/24
| |
+___________________ | __________________
| |
| |
++++++++++++++++ ++++++++++++++++
+ Real Server A + + Real Server B +
++++++++++++++++ ++++++++++++++++
eth0 1.1.1.10/24 eth0 1.1.1.20/24
lo 1.1.1.1/32 lo 1.1.1.1/32
- 客户端要找vip访问80端口,因为是在同一个网段,所以发arp广播找vip的mac地址通信
- 因为有rs上也有vip,我们不能直接让rs上的vip回应客户端的广播,所以设置文件arp_ignore的内容为1
1的意思是如果发来的广播包里面目标地址不是我的“进口地址”–>也就是“eth0”(对应的是非进口地址本地回环接口lo),那我就不回应这个arp广播)。 - 当dr的vip收到这个广播之后,回应mac地址,然后得到客户端发来的80端口请求,再通过lvs分发到一个rs
- 那么dr如何分发到一个rs?
dip发出arp广播询问rs的ip地址所对应的mac地址,然后发出一个目标ip为rs_vip,目标mac为rs_eth0_mac的包到rs - 这个rs必须要使用他lo设置的vip把回应包发出去(这样client收到之后一看源地址是vip,他就会相信这是正确的地址发来的包)
- 那么怎样让rs使用lo的vip而不使用eth0?
设置arp_announce文件的内容为2, 2的意思是使用本机最好的本地IP地址把回应包发出去 - 最后怎么算是最好的本地IP地址?
同一个网段下,使用可变长度子网掩码最长的IP地址被认为是好IP,因为他更精确
VS/DR模式数据包走向:
1.Client-------------------------->Director
sip: CIP dip: VIP
smac: Client_mac dmac: VIP_mac
2.Director---------------------->Real Server
- Director在给Real Server发包前要广播找Real Server mac *
- sip: DIP dip: RIP *
- smac: DIP_mac dmac: broadcast *
-
*
- sip: RIP dip: DIP *
- smac: RealServer_mac dmac: DIP_mac *
sip: CIP dip: VIP
smac: DIP_mac dmac: RealServer_mac
3.Real Server------------------>Client
sip: VIP dip: CIP //这里的VIP是realserver的lo额外添加的那个VIP地址
smac: RealServer_mac dmac: Client_mac
=VS/DR模式配置========
Client:
[root@localhost ~]# route add default gw 1.1.1.1 dev eth0
Real Server A & Real Server B:
[root@localhost ~]# yum install httpd
[root@localhost ~]# ifconfig lo:0 1.1.1.1/32
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore eth0可以换成all
[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
Director: route -n 上面的一条路由做dip 下面一条做vip
[root@localhost ~]# yum install ipvsadm
[root@localhost ~]# ipvsadm -A -t 1.1.1.1:80 -s rr
[root@localhost ~]# ipvsadm -a -t 1.1.1.1:80 -r 1.1.1.10:80 -g
[root@localhost ~]# ipvsadm -a -t 1.1.1.1:80 -r 1.1.1.20:80 -g
保存:
# service ipvsadm save
Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
清空:
# ipvsadm -C
查看
# ipvsadm -Ln
# ipvsadm -Ln --stats
# ipvsadm -Ln --rate
实时查看:
# watch -n.5 ‘ipvsadm -Ln -c’
-n.5 是0.5秒刷新一次
-n 5 5秒刷新一次
要解决三个问题:
1 .两个http服务器除了有自己的rip以外还要拥有vip
因为:数据包需从realServer返回 ,realServer返回的数据需要源IP为VIP
解决:添加 lo接口(本地环路接口) ,lo:1 vip/32.
2 .当GW向下广播vip的时候 要分发器的vip响应 而两个http的vip不要响应
因为:realServer的vip有了,接着就是同一个网段中拥有两个vip, 客户端在网关发送arp广播需找vip时需要让realServer不接受响应.
解决:
echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
arp_ignore 设置为1,意味着当别人的arp请求过来的时候,如果接收的设备没有这个ip,就不做出响应(这个ip在lo上,lo不是接收设备的进口)
echo 2 >/proc/sys/net/ipv4/conf/eth0/arp_announce
使用最好的ip来回应,什么是最好的ip?同一个网段内子网掩码最长的
3 .当分发器向下找两个http服务器时,必须从dip发包
因为:Director 发送数据包给realServer , 要走dip的网卡,否则ip流向就是vip–>vip 发送不成功.
解决:调整vip和dip网卡在路由表中的顺序,dip在上,vip在下即可解决。
假如:192.168.1.1 是vip ,网卡eth0
192.168.1.2 是dip,网卡eth1
在添加这两个ip的时候,路由表会出现如下条目:
192.168.1.0 0.0.0.0 255.255.255.0 u 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 u 0 0 0 eth1
这样的路由顺序会由eth0也就是vip发包,是不行的
解决:直接删除eth0所在的网络
#ip route del 192.168.1.0/24 dev eth0
==========================================
注:LO接口本身的作用:
假如包是由一个本地进程为另一个本地进程产生的, 它们将通过外出链的’lo’接口,然后返回进入链的’lo’接口.
另一个人版本实验:
VS/DR
实验说明:
- 网络使用桥椄模式
- 调度器、Real Server都使用虚拟机或使用真实服务器
- DR模式要求所有节点必须在同一个网段及广播域
- 所有节点网关均指定真实网关
网络拓朴:
Director: DIP:30.30.30.2
VIP:30.30.30.100
Real Server: 30.30.30.10 30.30.30.20 30.30.30.30
DNS Server: www.tianyun.com ===> 30.30.30.100
一、VS/DR实施
-
准备工作(集群中所有主机)
IP, hostname, hosts, iptables, SELinux, ssh trust, ntp
#cat /etc/hosts
127.0.0.1 localhost
30.30.30.2 director1.tianyun.com director1
30.30.30.10 node1.tianyun.com node1
30.30.30.20 node2.tianyun.com node2
30.30.30.30 node3.tianyun.com node3 -
RS配置
配置好网站服务器,测试所有RS //为了测试效果,提供不同的页面
#ip addr add dev lo 30.30.30.100/32 //在lo接口上绑定VIP
#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore //non-arp
#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce -
Director分发器配置
配置VIP
[root@tianyun ~]# ip addr add dev eth0 30.30.30.100/32 //配置VIP
[root@tianyun ~]# yum -y install ipvsadm //确保LoadBalancer仓库可用
定义LVS的分发策略
#ipvsadm -C
#ipvsadm -A -t 30.30.30.100:80 -s rr
#ipvsadm -a -t 30.30.30.100:80 -r 30.30.30.10 -g //gatewaying (direct routing)
#ipvsadm -a -t 30.30.30.100:80 -r 30.30.30.20 -g
#ipvsadm -a -t 30.30.30.100:80 -r 30.30.30.30 -g
#service ipvsadm save
Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 30.30.30.100:80 rr
-> 30.30.30.10:80 Route 1 0 0
-> 30.30.30.20:80 Route 1 0 0
-> 30.30.30.30:80 Route 1 0 0
#ipvsadm -L -n
#ipvsadm -L -n --stats
#ipvsadm -L -n --rate
#ipvsadm -Ln -c
#watch -n.5 ‘ipvsadm -Ln -c’
-
测试
[root@client ~]# elinks -dump http://192.168.2.220/
[root@client ~]# ab -c 1000 -n 1000 http://192.168.2.220/ -
小结
VS/DR模式的原理是: 当一个client发送一个请求到VIP,Director根据VIP选择对应的real-server的Pool,
根据算法,在Pool中选择一台Real-server,然后将client的请求包发给选择的Real-server,最后选择的Real-server
把应答包直接传给client
=================================================================================