lvs

lvs--linux virtual  server

一、lvs:虚拟负载均衡器

1.lvs工作在ios七层模型的第四层--转发(kernel层面),主要分为两部分:ipvasdm--用户管理工具;ipvs+netfilter--内核层面。

2.工作方式:用户管理写策略文件将策略加载至内核层面,实现lvs功能。(管理空间与内核层面的通信)。

3.lvs目前有四种工作模式:DR、NAT、TUN、FullNAT;内核系统目前仅支持前三种模式。

4.netfilter(内核层面)对防火墙数据包与lvs的数据包的处理区分:若是lvs数据包,通过ip_vs模块将其"强制转发"至与其对应的链路。应注意iptables优先级高于ipvs。

 lvs                                                                

5.三种模式原理简介:

(1)DR模式:该模式工作在第二层(路由层)无转发。当客户端访问Vs(服务器)时,第二层通过MAC地址寻址Vs;Vs仅将MAC地址修改为某个后端负载的MAC地址、ip地址不变(ip协议使用在第四层),传给后端负载Rs(Realserver),第二层无转发即无路由功能,这就要求后端负载与服务器vs必须在同一网段;Rs接受信息后,继续向上层应用传递,又第四层使用Tcp协议,因此负载端应有虚拟ip才能完成三次握手协议;客户端收到响应,在第二层进行vip的Arp缓存(ip与MAC地址的映射缓存),如此一来,当下次再访问vip时,将不再经过服务器而是直接访问负载。因此需要在客户端屏蔽对vip的Arp服务,使客户端不对负载地址进行缓存,具体实现见下文。

 lvs

(2)NAT模式:该模式工作在第四层。数据流原路返回,因此服务器端需要两块网卡,且负载端的网关应设为服务器的后端接口,从而实现数据流的原路返回。实现过程:客户端访问Vs,,Vs进行DNAT转换(cip-->vip转换为cip-->rip);Rs将响应返回再返回给Vs,Vs进行SNAT(rip-->cip转换成vip-->cip)。注意与反向代理原理不同,方向代理工作在ios模型的第七层;DNS域名解析工作在第一层。

(3)TUN模式:隧道协议ipip,支持广域网。

(4)FULLNAT:采用的机制与NAT同,不同的是适用于多vLAN,而NAT仅使用于单个vLAN。

二、lvs实现---DR模式

<1>服务器----如设定为server1

1.yum install  ipvsadm      ##ipvsadm命令实现管理lvs

2.ipvsadm部分命令使用方法:

 ipvsadm  -l              ##列出策略

 ipvsadm  -C      ##清空策略

 ipvsadm  -A      ##添加策略

3.添加策略,实现管理部分对内核ip_vs的控制

 ipvsadm  -A  -t  虚拟ip:80   -s rr 

如:ipvsamd  -A -t  172.25.13.113:80  -s  rr

## -t:tcp协议;vip:80表示添加虚拟ip的80端口;-s  rr:采用轮询算法

 ipvsadm  -a  -t  虚拟:80  -r ip(realserver):80  -g

如:ipvsadm  -a -t  172.25.13.113:80  -r 172.25.13.1:80  -g

## -a:添加;-t:tcp; -r  ip:真实结点的ip的80端口;-g:DR模式---直连模式

##该策略表示:若是访问vip:80的数据包将 其ip地址改为rip(realserver的ip地址)

注意:若采用DR模式,则不能监听真实主机的8080端口。因为该模式为直连模式,不支持端口转发;NAT模式,支持端口转发

  控制原理:

5./etc/init.d/ipvsadm  save    ##保存策略,会自动刷新至内核层面,重启后策略仍存在

lvs

6.ip addr  add   vip/Netmask dev  eth0     ##将vip添加至eth0,使该主机作为服务器端

注意:保证虚拟ip(vip)一定未被占用

7./etc/init.d/ipvsadm  start   ##开启服务

lvs

<2>后端负载----如采用两台主机server2、server4,均做如下操作

1.ip addr  add  vip dev  eth0             ##后端与"服务器端"的连接

注意:负载的ip地址应与vip属于同一vLAN,见DR的工作原理。

    服务器将来自客户端的请求转发给后端负载,但服务器不可能记录下所有负载的ip来转发,因此在负载端也需要添加虚拟ip(vip);当对vip 的访问请求到来时,后端负载不再经过服务器而是直接响应客户,此时应注意客户端的arp缓存会记录该响应信息:负载端的真实ip(rip),那么当客户端再次访问vip时,通过send_arp便可以直接访问后端负载,此时lvs也就失去了其负载均衡的意义。那么实现负载均衡需要解决的问题:(1)后端负载不响应关于vip的请求;(2)负载响应由服务器转发过来的请求,不再经过服务器,而是直接与客户端完成Tcp协议,那么客户端对后端负载的arp缓存也很重要,arp服务处于ios七层模型的第二层,所以当关于vip的数据包传输至第二层时,我们可以将vip转换成rip、cip信息不变,进行arp缓存。

2.安装arptables:工作在ios模型的第二层

yum install  arptables_jf  -y

lvs

3.arptables部分命令:

       arptables  -L         ##列出策略

       arptables  -F         ##清空策略

       arptables  -A        ##添加策略

       arptables  -nL              ##仅列出ip策略

4.arptables -A  IN  -d  vip  -j DROP

  ##当外界访问vip时,负载端不做响应

 arptables  -A  OUT -s  vip  -j mangle  --mangle-ip-s  rip

##当发送的数据包的源地址是vip时,则将vip转换为rip(真机ip),实现客户端不对本机作arp缓存。

5./etc/init.d/arptables_jf  save      ##保存策略

   若要修改策略可直接更改策略文件:/etc/sysconfig/arptables

6. /etc/init.d/arptables_jf  start           ##开启服务

lvs

lvs

<3>测试:访问vip      

(1)curl 172.25.13.113 

(2)浏览器访问172.25.13.113      ##刷新检查后端负载是否轮询

lvs

(3)客户端:arp  -an  172.25.13.113         ##查看对vip的arp缓存

lvs

(4)关闭某负载的httpd服务,即80端口,如下结果显示可以看出lvs对后端负载本身无健康检查。

lvs

FULLNAT模式

工作原理:原路径返回;DDOS抗攻击

  lvs    

在IN中,session通过五元组存储:sip+sport、dip+dport、TCP/UDP;利用session存储进行双向哈希,实现双向DNAT,因此其性能比NAT差些。

一、内核编译

1.rpm -ivhkernel-2.6.32-220.23.1.el6.src.rpm

2.软件依赖性:

  yum install redhat-rpm-config patchutils xmlto asciidocelfutils-libelf-devel zlib-devel binutils-devel newt-devel python-develperl-ExtUtils-Embed hmaccalc -y

2.yum install rpm-build -y    ##安装工具

 cd  /root/rpmbuild/SPECS/

 rpmbuild -bp kernel.spec

##要求所在主机有gcc

3.软件依赖性:

  yuminstall asciidoc-8.4.5-4.1.el6.noarch.rpm newt-     devel-0.52.11-3.el6.x86_64.rpm -y

4.rpmbuild -bp kernel.spec          

  ##安装过程中,出现“暂停现象”,根据显示内容可知是在urandom中取随机数,当随机数取完后就回出现暂停,根据提示,在另外一个终端执行rngd-r  /dev/urandom

提示:yum  provides */rngd    ##查看提供rngd的软件

6.打补丁:

cd lvs-fullnat-synproxy/

cp 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/

cd /root/rpmbuild/BUILD/kernel-2.6.32-220.23.1.el6/linux-2.6.32-220.23.1.el6.x86_64/

patch -p1  <  linux-2.6.32-220.23.1.el6.x86_64    ##进行补丁

7.vim Makefile

编辑内容:

       EXTEND

5.make

 make  modules_install

 make  install

6.cd /boot/grub    ##安装路径

 vim  gurb.conf

修改内容:

       10  default=0

       :wq

7.reboot 

  重启之后可用uname  -r  命令查看系统当前版本是否为设定的版本