介绍
本文系统Centos6.5
关于网卡的MAC地址
主备模式下:Linux Bonding实现会将Bond的两个slave网口的MAC地址改为Bond的MAC地址,而Bond的MAC地址是Bond创建启动后,主用slave网口的MAC地址。当主网口故障后,Bond会切换到备用网口,
负载均衡模式下:Linux Bonding实现可以保持两个slave网口的MAC地址不变,Bond的MAC地址是其中一个网卡的,
当然,这里要重点说明的是,Bond负载均衡模式下,要求交换机做配置,是的两个slave网口能够互通,否则的话,丢包会很厉害,基本没法使用。这个是因为Bond的负载均衡模式算法,会将包在两个网口之间传输以达到负载均衡。(mode6不需要交换机支持)
1、NAT模式;
NAT模型:地址转换类型,主要是做地址转换,类似于iptables的DNAT类型,它通过多目标地址转换,来实现负载均衡;
特点和要求:
1、LVS(Director)上面需要双网卡:DIP(内网)和VIP(外网) 2、内网的Real Server主机的IP必须和DIP在同一个网络中,并且要求其网关都需要指向DIP的地址 3、RIP都是私有IP地址,仅用于各个节点之间的通信 4、Director位于client和Real Server之间,负载处理所有的进站、出站的通信 5、支持端口映射 6、通常应用在较大规模的应用场景中,但Director易成为整个架构的瓶颈!
相关机器信息:
(Director Server) LB1 eth0:192.168.244.132 (Vip) (公网) eth1:192.168.27.128 (Dip) (内网) rs1 rs1 eth0:192.168.27.130 (Rip) (内网)getway:192.168.27.128 rs2 rs2 eth0:192.168.27.131 (Rip) (内网)getway:192.168.27.128 [root@rs1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0" BOOTPROTO=static IPADDR=192.168.27.130 NETMASK=255.255.255.0 GATEWAY=192.168.27.128 NM_CONTROLLED="yes" ONBOOT="yes
拓扑如下:
首先在rs1、rs2部署httpd,并且进行测试是否OK!
[root@rs1 ~]# yum install httpd -y [root@rs1 ~]# echo web1 > /var/www/html/index.html [root@rs1 ~]# service httpd start [root@rs2 ~]# yum install httpd -y [root@rs2 ~]# echo web2 > /var/www/html/index.html [root@rs2 ~]# service httpd start [root@rs1 ~]# curl http://127.0.0.1 web1 [root@rs1 ~]# curl http://192.168.27.131 web2
现在在LB上操作;
确定本机ip_vs模块是否加载,也就是是否支持lvs,2.4.2后都支持了;然后安装ipvsadm 用户操作命令
[root@LB1 ~]# grep -i 'ip_vs' /boot/config-2.6.32-71.el6.i686
ipvsadm安装:
[root@LB1 ~]# yum install ipvsadm -y echo 1 > /proc/sys/net/ipv4/ip_forward ipvsadm -A -t 192.168.244.132:80 -s rr ipvsadm -a -t 192.168.244.132:80 -r 192.168.27.131 -m ipvsadm -a -t 192.168.244.132:80 -r 192.168.27.130 -m
测试页面
页面轮询交替出现;说明机器轮询提供服务;
如果使用加权轮询的话;比如rs1提供2次,rs2提供1次,这样来提供服务;
[root@LB1 html]# ipvsadm -E -t 192.168.244.132:80 -s wrr [root@LB1 html]# ipvsadm -e -t 192.168.244.132:80 -r 192.168.27.130 -m -w 2 [root@LB1 html]# ipvsadm -e -t 192.168.244.132:80 -r 192.168.27.131 -m -w 1
现在来测试:
2、DR模式:
特点和要求
1、各个集群节点必须和Director在同一个物理网络中 2、RIP地址不能为私有地址,可以实现便捷的远程管理和监控 3、Director仅仅负责处理入站请求,响应报文则由Real Server直接发往客户端 4、集群节点Real Server 的网关一定不能指向DIP,而是指向外部路由 5、Director不支持端口映射 6、Director能够支持比NAT多很多的Real Server
原理:
DR模型:直接路由模型,每个Real Server上都有两个IP:VIP和RIP,但是VIP是隐藏的,就是不能提高解析等功能,只是用来做请求回复的源IP的,Director上只需要一个网卡,然后利用别名来配置两个IP:VIP和DIP Director在接受到外部主机的请求的时候转发给Real Server的时候并不更改目标地址,只是通过arp解析的MAC地址进行封装然后转给Real Server,Real Server在接受到信息以后拆除MAC帧封装,然后直接回复给CIP。
(3台服务都配置了外网IP)
LB1: bond0: 192.168.6.1(外网IP) 192.168.7.1(虚拟IP) RS1: bond0:192.168.6.2(外网IP) bond0:0 192.168.7.2(虚拟IP) lo:0(vip) LB1(外网IP) RS2: bond0:192.168.6.3(外网IP) bond0:0 192.168.7.3(虚拟IP) lo:0(vip) LB1(外网IP)
通信原理:
每个Real Server上都有两个IP:VIP和RIP,但是VIP是隐藏的,就是不能提高解析等功能,只是用来做请求回复的源IP的,Director上只需要一个网卡,然后利用别名来配置两个IP:VIP和DIP Director在接受到外部主机的请求的时候转发给Real Server的时候并不更改目标地址,只是通过arp解析的MAC地址进行封装然后转给Real Server,Real Server在接受到信息以后拆除MAC帧封装,然后直接回复给CIP。 而此时需要关闭RS上的基于VIP的arp解析,在linux内核2.4以后,内核中都内置了这种功能,通过一些设置可以关闭其arp的功能: arp_ignore:定义接收到ARP请求时的响应级别 0:默认,只用本地配置的有响应地址都给予响应 1:仅仅在目标IP是本地地址,并且是配置在请求进来的接口上的时候才给予响应(仅在请求的目标地址配置请求到达的接口上的时候,才给予响应) arp_announce:定义将自己的地址向外通告时的级别 0:默认,表示使用配置在任何接口的任何地址向外通告 1:试图仅向目标网络通告与其网络匹配的地址 2:仅向与本地接口上地址匹配的网络进行通告 Ps:要想让其功能生效,必须先设置相关设置,然后在配置IP地址等信息
- 开始在RS1操作:
#!/bin/bash vip=192.168.6.1 echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/bond0/arp_announce echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/bond0/arp_ignore #上面的就是定义了arp响应的级别;还有就是vip的请求数据,从rs1的本地ip进行了回复 ifconfig lo:1 $vip netmask 255.255.255.255 ifconfig bond0:1 192.168.7.2 netmask 255.255.255.0 route add -host $vip dev lo [root@rs1 ~]# yum install httpd –y [root@rs1 ~]# echo web1 > /var/www/html/index.html
3、在LB上操作:2、在RS2上执行上面同样的操作(注意IP变化)
配置eth0网卡ip;
[root@LB1 ~]# yum install ipvsadm –y #!/bin/bash IPVSADM="/sbin/ipvsadm" #lvsIP vip="192.168.6.1" /sbin/ifconfig bond0:0 192.168.7.1/24 ipvsadm -C ipvsadm --set 30 5 60 $IPVSADM -A -t $vip:8090 -s wrr $IPVSADM -a -t $vip:8090 -r 192.168.7.2:8090 -g -w 3 $IPVSADM -a -t $vip:8090 -r 192.168.7.3:8090 -g -w 3 #$IPVSADM -A -t $vip:8090 -s wrr
测试效果;验证RS的web服务
3、TUN模式;
TUN的工作机制跟DR一样,只不过在转发的时候,它需要重新包装IP报文。这里的real server(图中为RIP)离得都比较远。用户请求以后,到director上的VIP上,它跟DR模型一样,每个realserver上既有RIP又有VIP,Director就挑选一个real server进行响应,但是director和real server并不在同一个网络上,这时候就用到隧道了,director进行转发的时候,一定要记得CIP和VIP不能动。我们转发是这样的,让它的CIP和VIP不动,在它上面再加一个IP首部,再加的IP首部源地址是DIP,目标地址的RIP的IP地址。收到报文的RIP,拆掉报文以后发现了里面还有一个封装,它就知道了,这就是隧道。
其实数据转发原理和DR是一样的,不过这个我个人认为主要是位于不同位置(不同机房);LB是通过隧道进行了信息传输,虽然增加了负载,可是因为地理位置不同的优势,还是可以参考的一种方案;
优点:负载均衡器只负责将请求包分发给物理服务器,而物理服务器将应答包直接发给用户。所以,负载均衡器能处理很巨大的请求量,这种方式,一台负载均衡能为超过100台的物理服务器服务,负载均衡器不再是系统的瓶颈。使用VS-TUN方式,如果你的负载均衡器拥有100M的全双工网卡的话,就能使得整个Virtual Server能达到1G的吞吐量。
不足:但是,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议;
IP信息:
LB1: eth0: 192.168.182.132 vip(tunl0): 192.168.182.200 RS1: eth0:192.168.27.130 tunl0(vip) :192.168.182.200 RS2: eth0:192.168.138.131 tunl0(vip) :192.168.182.200
LB1操作:
[root@LB1 ~]# yum install ipvsadm -y [root@LB1 ~]# ifconfig tunl0192.168.182.200 broadcast 192.168.182.200 netmask 255.255.255.0 up [root@LB1 ~]# route add -host $VIP dev tunl0 [root@LB1 ~]# ipvsadm -A -t 192.168.182.200:80 -s rr [root@LB1 ~]# ipvsadm -a -t 192.168.182.200:80 -r 192.168.27.130 -i [root@LB1 ~]# ipvsadm -a -t 192.168.182.200:80 -r 192.168.138.131 -i
RS1操作:
[root@LB1 ~]# ifconfig tunl0 192.168.182.200 netmask 255.255.255.0 broadcast 192.168.182.200 up [root@LB1 ~]# route add -host 192.168.182.200 dev tunl0 [root@LB1 ~]# echo "1" >/proc/sys/net/ipv4/conf/tunl0/arp_ignore [root@LB1 ~]# echo "2" >/proc/sys/net/ipv4/conf/tunl0/arp_announce [root@LB1 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore [root@LB1 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
RS2同上:
访问vip进行测试即可;