基于lvs中的NAT full_NAT实现均衡负载
Virtual Server via NAT
VS/NAT的优点是服务器可以运行任何支持TCP/IP的操作系统,它只需要一个IP地址配置在调度器上,服务器组可以用私有的IP地址。缺点是它的伸缩能力有限,当服务器结点数目升到20时,调度器本身有可能成为系统的新瓶颈,因为在VS/NAT中请求和响应报文都需要通过负载调度器。在Pentium 166 处理器的主机上测得重写报文的平均延时为60us,性能更高的处理器上延时会短一些。假设TCP报文的平均长度为536 Bytes,则调度器的最大吞吐量为8.93 MBytes/s. 再假设每台服务器的吞吐量为800KBytes/s,这样一个调度器可以带动10台服务器。
基于VS/NAT的集群系统可以适合许多服务器的性能要求。如果负载调度器成为系统新的瓶颈,可以有三种方法解决这个问题:混合方法、VS/TUN和 VS/DR。在DNS混合集群系统中,有若干个VS/NAT负载调度器,每个负载调度器带自己的服务器集群,同时这些负载调度器又通过RR-DNS组成简单的域名。但VS/TUN和VS/DR是提高系统吞吐量的更好方法。
对于那些将IP地址或者端口号在报文数据中传送的网络服务,需要编写相应的应用模块来转换报文数据中的IP地址或者端口号。这会带来实现的工作量,同时应用模块检查报文的开销会降低系统的吞吐率。
VS/NAT 的优点是服务器可以运行任何支持 TCP/IP 的操作系统,它只需要一个 IP 地址配置在调度器上,服务器组可以用私有的 IP 地址。缺点是它的伸缩能力有限, 当服务器结点数目升到 20 时,调度器本身有可能成为系统的新瓶颈,因为在 VS/NAT 中请求和响应报文都需要通过负载调度器。

Load Balance 双网卡 eth0: 172.25.64.1 (对内) eth1: 172.25.64.100 (对外)
如果只有一块网卡可用以下方式:
Load Balance:172.15.64.1
Virtual IP: 172.25.64.100
Gateway: 172.25.64.1
Realserver1: 172.25.64.2
Realserver1: 172.25.64.2开启路由机制
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
加载 nat 模块
modprobe iptable_nat
注:如果不加载此模块,也可以在第一次访问时成功,但是会在再次访问时出现延迟过长,或访问超时现象
Load Balance加载 rule
1 ifconfig eth1 up
2 ip addr add 172.25.64.100/24 dev eth1
3 ip addr
4 ipvsadm -A -t 172.25.64.100:80 -s rr
5 ipvsadm -a -t 172.25.64.100:80 -r 172.25.64.2:80 -m
6 ipvsadm -a -t 172.25.64.100:80 -r 172.25.64.3:80 -m
7 /etc/init.d/ipvsadm save 保存 rule
8 vim /etc/sysctl.conf
9 sysctl -p #路由转换
10 /etc/init.d/ipvsadm start
11 modprobe iptable_nat
12 vim /etc/keepalived/keepalived.conf
virtual_server 172.25.64.100 80 {
delay_loop 3
lb_algo rr
lb_kind NAT
#persistence_timeout 50
protocol TCP
13 /etc/init.d/keepalived restart
14 绑定 vip
ifconfig eth0:0 172.25.64.100 netmask 255.255.255.0 up
RealServer 设置
Default Gateway 指向 Director 的 LAN IP 即 172.25.64.1
echo hostname > /var/www/html/index.html
service httpd start
测试
选择一台172.25.64.1网段主机访问 http:// 172.25.64.1 反复刷新网页,每次出现的网页不同则表示成功。lvs中 无论是DR 还是 NAT 模式,不可避免的都有一个问题:LVS 和 RS 必须在同一个 VLAN 下,否则 LVS 无法作为 RS 的网关。
这引发的两个问题是:
同一个 VLAN 的限制导致运维不方便,跨 VLAN 的 RS 无法接入。
LVS 的水平扩展受到制约。当 RS 水平扩容时,总有一天其上的单点 LVS 会成为瓶颈。
Full-NAT 由此而生,解决的是 LVS 和 RS 跨 VLAN 的问题,而跨 VLAN 问题解决后,LVS 和 RS 不再存在 VLAN 上的从属关系,可以做到多个 LVS 对应多个 RS,解决水平扩容的问题。
Full-NAT 相比 NAT 的主要改进是,在 SNAT/DNAT 的基础上,加上另一种转换,转换过程如下:full_NAT工作原理和nat模式相似:
nat模式原理图:

full_NAT数据包走向如下图:

我们发现FULLNAT有一个问题是:RealServer无法获得用户IP;淘宝通过叫TOA的方式解决的,主要原理是:将client address放到了TCP Option里面带给后端RealServer,RealServer收到后保存在socket的结构体里并通过toa内核模块hook了getname函数,这样当用户调用getname获取远端地址时,返回的是保存在socket的TCPOption的IP. 百度的BVS是通过叫ttm模块实现的,其实现方式跟toa基本一样。
首先我们需要配置full_NAT的环境将虚拟机运行内存设置为2048MB

在实验中需要把虚拟机内存设置为2048否则会会因内存过小导致lvs出现丢包情况
Lvs_fullnat官网链接:http://kb.linuxvirtualserver.org/wiki/IPVS_FULLNAT_and_SYNPROXY#Introduction
安装:
yum install rpm-build -y #编译源码文件
rpm -ivh kernel-2.6.32-220.23.1.el6.src.rpm #src基于linux内核开发的源程序
ls
cd rpmbuild/SOURCES/
yum install redhat-rpm-config patchutils xmlto asciidoc elfutils-libelf-devel binutils-devel newt-devel python-devel perl-ExtUtils-Embed -y
# 解决rpmbuild重构过程中的依赖性
yum install newt-devel-0.52.11-3.el6.x86_64.rpm asciidoc-8.4.5-4.1.el6.noarch.rpm slang-devel-2.2.1-1.el6.x86_64.rpm hmaccalc rng-tools -y
rngd -r /dev/urandom #生成随机数中途需要在移动键盘的过程中生成
添加lvs补丁:
tar zxf Lvs-fullnat-synproxy.tar.gz
cd rpmbuild/SPECS/
rpmbuild -bp kernel.spec # -bp 从<specfile>文件的%prep段开始建立(解开源码包并打补丁)
cd rpmbuild/BUILD/kernel-2.6.32-220.23.1.el6/linux-2.6.32-220.23.1.el6.x86_64/
cp /root/lvs-fullnat-synproxy/lvs-2.6.32-220.23.1.el6.patch .
#/root/rpmbuild/BUILD/kernel-2.6.32-220.23.1.el6/linux-2.6.32-220.23.1.el6.x86_64
patch -p1 < lvs-2.6.32-220.23.1.el6.patch
cat .config|grep IP_VS
vim makefile #添加版本后缀名
compile and install: #编译安装
make #-j4表用4核cpu来运行,但在虚拟机中环境限制只可以用默认1来编译,在此过程中可能会用是比较长
make modules_install
make install
yum remove ipvsadm
# 修改内核引导程序不使用默认引导
vim /boot/grub/grub.conf
Default=0
Reboot
重新启动之后如果虚拟机up了说明设置没有问题
uname -r #查看内核版本
cd lvs-fullnat-synproxy/
tar zxf lvs-tools.tar.gz
cd tools/keepalived/
yum install popt-devel -y
./configure --with-kernel-dir="/lib/modules/`uname -r`/build" #静态安装激活keepalived
make
make install
cd lvs-fullnat-synproxy/ tools/ipvsadm
make #静态激活ipvsadm
make install
Ipvsadm -l #查看lvs是否变大2^22
















