基于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 中请求和响应报文都需要通过负载调度器。

lvs的优化_IP


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

lvs的优化_lvs的优化_02


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模式原理图:

lvs的优化_服务器_03


full_NAT数据包走向如下图:

lvs的优化_lvs的优化_04


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

首先我们需要配置full_NAT的环境将虚拟机运行内存设置为2048MB

lvs的优化_lvs的优化_05


在实验中需要把虚拟机内存设置为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的优化_NAT_06


添加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

lvs的优化_服务器_07


重新启动之后如果虚拟机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

lvs的优化_IP_08

cd lvs-fullnat-synproxy/ tools/ipvsadm
make #静态激活ipvsadm
make install
Ipvsadm -l #查看lvs是否变大2^22

lvs的优化_IP_09