参考:
http://www.cnblogs.com/liwei0526vip/p/6370103.htmlhtml
http://www.javashuo.com/article/p-sxgzfcbd-bc.htmlweb
TCP四层转发协议,其中内核是经过 PREROUTING INPUT FORWARD OUTPUT POSTROUTING 这个几个数据转发控制来完成的。bash
模式1、
NAT(DNAT)网络
注意:
一、目的地址修改,内核的prerouting和postrouting链
二、RS的网关地址必定要指向DIP(LVS的内网IP,由于第一点,IP报文的转发过程都是只更改DIP)
三、由于第二点的缘由,RS的出外网是受限制的,因此不多使用。
四、回包必定要通过DR去修改IP头部的SIP(源ip地址)地址(由于TCP回话必定要保证出去的包和收回的包 IP地址不变)负载均衡
须要内核支持
modprobe ip_vscurl
网上看到的常常说的DNAT的一个缺点:
上面说了NAT模型的实现方式,那么NAT模型有个缺陷,由于进出的每一个数据包都要通过Director Server,当集群系统负载过大的时候Director Server将会成为整个集群系统的瓶颈(但我以为这个不是瓶颈,不用NAT是由于网络结构不适合多数公司)ide
那么DR模型就避免了这样的状况发生,DR模型在只有请求的时候才会通过Director Server, 回应的数据包由Real Server 直接响应用户不须要通过Director Server,其实三种模型中最经常使用的也就是DR模型了。oop
模式2、DR模式post
注意:
一、源末地址都未修改,lvs更改的是源和目标mac地址。CIP VIP -> DIP RIP的mac地址。
二、RS上添加lo:0地址为 VIP的地址,由于从客户端发起的请求到结束,源末地址都未修改,RS要接收包,必须目标地址是本机地址。
三、RS上要修改mac的接收和响应方式(详解参考:http://www.javashuo.com/article/p-sxgzfcbd-bc.html)
四、RS和VIP的端口必定要同样都是80(不支持地址转换,也不支持端口映射)
由于上原理,因此要配置DR模式 VIP DIP RIP 都必须在同一个网段(由于须要是经过二层来传输)(多数是公网若是是提供web服务)测试
实验采用私有IP地址的脚本配置如:
LVS机器上配置
cat lvs_dr.sh
#! /bin/bash echo 1 > /proc/sys/net/ipv4/ip_forward ipv=/sbin/ipvsadm vip="21.32.19.200" rs1="21.32.19.21:80" rs2="21.32.19.22:80" ifconfig eth0:0 down ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255. route add -host $vip dev eth0:0 $ipv -C $ipv -A -t $vip:80 -s wrr $ipv -a -t $vip:80 -r ${rs1} -g -w 3 $ipv -a -t $vip:80 -r ${rs2} -g -w 1
RS上的配置
cat lvs_dr_rs.s
#! /bin/bash vip=21.32.19.200 ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip lo:0 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
测试:
curl http://21.32.19.200
注意测试的时候,不要在DR(lvs机器上)和RS机器上,由于这几个机器都有这个VIP地址。
企业经常使用
DR + keepalived
keepalived的出现就是为了LVS(keepalived中不少参数是直接影响lvs的,和你用命令 ipvsadm 管理lvs是同样的效果)
其中keepavlied难理解的参数:
一、lvs_sync_daemon_inteface eth0 #负载均衡器之间的监控接口(DR模式中同interface)
二、vrrp_sync_group (多个入口的时候,CTC CNC CMCC的时候这个三个VS组能够作同步切换)
三、delay_loop 探测的时间