首页 > 代码库 > LVS详解(实施级)

LVS详解(实施级)

LVS使用详解

一、LVS概述

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。LVS是开源负载均衡的代表性软件,它工作在内核级别,具备极好的性能和生产环境可用性。普通双CPU,8G服务器,在DR模式下即可承载高达数万甚至数十万的并发连接数。

LVS是四层负载均衡软件,与nginx和haproxy等七层负载均衡不同的是,它只能实现数据包的转发和四层一下内容的修改,无法实现反向代理或者修改七层访问请求。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。

二、LVS的结构及特点

简单来说,LVS的结构主要分为两层,前端用于接收并调度用户请求,我们称之为Load Balance。用户请求在经过LB调度后,会被转发到不同的工作服务器上,这些真正提供服务的服务器被称为Real Server。在大部分场景下,Real Server间可能还需要共享存储,这个可以被称为第三层,总体来说结构如下:

                             技术分享

下面针对LVS的各层次进行说明:

1、  LB层。(Load Blance)

位于整个集群系统的最前端,有一台或者多台负载调度器(LB)组成,LVS模块就安装在LB上,而LB的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由转发表,通过这些转发表把用户的请求分发到后端不同的Real Server上。

2、  RS层。(Real Server)

由一组实际运行应用服务的机器组成,Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接。

3、  共享存储层。(Shared Storage)

为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如Red hat的GFS文件系统,oracle提供的OCFS2文件系统等。

三、LVS中涉及的概念

         VIP:虚拟IP,用户所能看到的唯一IP

         RIP:真实IP,也就是Real Server的IP,真正提供数据服务的IP。

         1、负载均衡机制

                   (1)VS/NAT模式

                            类似于网络中常用到的DNAT功能,它修改请求报文的目的IP地址并转发至指定Real Server。它的数据流程如下                            技术分享

 

                   (2)VS/DR模式

                            在DR模式中,与NAT模式不同的是,它并不修改请求报文的目的IP,而是修改报文的目的MAC,然后将报文直接转送至Real Server。响应数据包不再被送回LB,而是由RS直接发送回客户端。

技术分享

                   (3)VS/TUN模式

                            TUN模式与DR模式有很多相同之处,唯一不同点在于,请求报文在LB处并不是修改MAC,而是再包裹一层IP头,转发到RealServer。响应数据包不再被送回LB,而是由RS直接发送回客户端。


 技术分享

         2、负载调度算法

                   LVS总共有10种调度算法,分为两大类,分别为静态算法和动态算法。

                   静态算法:

(1)       轮询(rr,Round Robin)

这种算法LB并不考虑其它因素,而是按照列表中RS的顺序,依次派发用户请求(如RS1-->RS2-->RS3-->RS1这种顺序)。它是纯粹的1:1调度,用户的请求会被平均分配到每台RealServer。

(2)       加权轮询(wrr,Weighted Round Robin)

为每台RealServer设置一个权重值,用以区分不同性能服务器对请求的处理能力。LB会根据权重的比值进行请求的转发,比如RS1、RS2、RS3的权重分别为2、1、1,那么LB会以2:1:1的比例平均分配用户请求。可以认为当请求到达时,将以RS1àRS1àRS2àRS3àRS1àRS1这种顺序进行分配。

(3)       目标地址哈希(Destination Hashing)

destination hash,目的地址哈希。只要对同一个目的IP的请求,就会被转向同一个Real Server。它主要应用在Cache服务器环境中,但是具体是怎么应用的还是不清楚。比如,如何定义LVS的VIP

(4)       源地址哈希(Source Hashing)

source hash,源地址哈希。只要来自同一个客户端的请求,就会被转向同一个Real Server。这是Client级的负载。他会在director中保存一个哈希表,当有新请求进来时,首先对源IP进行哈希,然后跟哈希表进行对比,如果存在条目,则直接转发。

动态算法:

  1. 1.       最少链接(lc,Least Connections)

通过计算当前后端每个real server的活动连接数和非活动连接数的总数,然后进行对比。

计算公式为“active*256+inactive

将选用值最小的服务器。

  1. 2.       加权最少链接(wlc,Weighted Least Connections)

相比于lc,计算公式发生变化:

(active*256+inactive)/weight

  1. 3.       sed最小期望延迟

相比于wlc,计算公式又发生变化:

(active+1)/weight

它的效果是,最先到来的请求将被分配到权值最大的服务器上。

  1. 4.       nq不排队算法

相比于sed,如果有台realserver的连接数=0就直接分配过去,不需要在进行sed运算,在没有连接数为0的Rs时,将继续使用sed算法。

 

  1. 5.       局部性最少链接(Locality-Based Least Connections)

LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于其一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。

  1. 6.       带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)

它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而 LBLC算法维护从一个目标IP地址到一台服务器的映射。对于一个“热门”站点的服务请求,一台Cache 服务器可能会忙不过来处理这些请求。这时,LBLC调度算法会从所有的Cache服务器中按“最小连接”原则选出一台Cache服务器,映射该“热门”站点到这台Cache服务器,很快这台Cache服务器也会超载,就会重复上述过程选出新的Cache服务器。这样,可能会导致该“热门”站点的映像会出现在所有的Cache服务器上,降低了Cache服务器的使用效率。

LBLCR调度算法将“热门”站点映射到一组Cache服务器(服务器集合),当该“热门”站点的请求负载增加时,会增加集合里的Cache服务器,来处理不断增长的负载;当该“热门”站点的请求负载降低时,会减少集合里的Cache服务器数目。这样,该“热门”站点的映像不太可能出现在所有的Cache服务器上,从而提供Cache集群系统的使用效率。LBLCR算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组;按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载;则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

在规划架构时,根据不同的需要选取不同的调度算法。如果不做设置,默认为wlc。

四、LVS的配置详解

4.1、NAT模式配置

NAT模式是最简单的配置模式,适合于较小规模集群中使用,RS的数量在10台以下。它无需对RS做任何修改,RS的操作系统可以为任何类型,只需要将RS的网关指向LB即可。NAT模式可以支持不同端口间的映射,比如vip的80到RIP的8080端口映射,具有较强的灵活性。

技术分享

LB的环境

eth0=42.202.144.14

eth1=192.168.1.1

eth0:0(VIP)=42.202.144.15(如果没有多余的IP,42.202.144.14也可以)

 

RS的环境

eth0:192.168.1.x

gateway:192.168.1.1

 

LB基础环境配置

1、   关闭LB的icmp_redirect数据包的发送

echo"0" >/proc/sys/net/ipv4/conf/all/send_redirects
cat       /proc/sys/net/ipv4/conf/all/send_redirects
echo"0" >/proc/sys/net/ipv4/conf/default/send_redirects
cat      /proc/sys/net/ipv4/conf/default/send_redirects
echo"0" >/proc/sys/net/ipv4/conf/eth1/send_redirects
cat       /proc/sys/net/ipv4/conf/eth1/send_redirects


2、   开启内核路由转发

echo"1" >/proc/sys/net/ipv4/ip_forward


3、   配置VIP

ifconfig eth1:142.202.144.15 netmask 255.255.255.255 up


 

lvs配置(以http服务为例)

首先清空lvs的规则条目

ipvsadm -C


(1)    为lvs指定监听的VIP

ipvsadm -A -t42.202.144.15:80 -s wlc


(2)    为lvs指定提供服务器的RS

ipvsadm -a -t 192.168.1.2:80 -m -w 1
ipvsadm -a -t 192.168.1.3:80 -m -w 1
ipvsadm -a -t 192.168.1.4:80 -m -w 1


至此,nat模式配置完成。

 

4.2、DR模式配置

         DR模式在大规模集群中使用,RS的数量在100台以内。DR模式需要RS的操作系统支持,需要修改RS的系统参数。由于RS的数据包回应方式的原因,DR模式不支持端口映射功能,VIP所指定的服务端口,必须和RIP的服务端口相同。DR模式的原理是修改请求数据包的目的MAC地址,所以RS和LB必须在同一个广播域才可以生效。

技术分享

LB的环境

eth0=42.202.144.14

eth0:0(VIP)=42.202.144.15(如果没有多余的地址,VIP使用42.202.144.14也可以,RS上lo:0的地址将相应修改。)

 

RS的环境

eth0=42.202.144.1x

lo:0=42.202.144.15

gateway=42.202.144.1

 

LB基础环境配置

1、   关闭路由转发

cat 0 > /proc/sys/net/ipv4/ip_forward


2、   配置VIP地址

ifconfig eth0:0 42.202.144.15 netmask 255.255.255.255 up


RS基础环境配置

1、   修改arp宣告等级,防止lo:0上的vip地址在网络启动时被宣告出去。

cat 2 > /proc/sys/net/ipv4/conf/all/arp_announce
cat 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce


2、   修改arp响应等级,方式lo:0的vip在从eth0口收到arp时产生回应。

cat 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
cat 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore


3、关闭数据包合法性校验(如果VIP在lo上,可以不关闭。在TUN模式下必须关闭)

cat 0 > /proc/sys/net/ipv4/conf/all/rp_filter
cat 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter


3、   配置VIP

ifconfig lo:0 42.202.144.15 netmask 255.255.255.255 up

(注意必须是32位掩码,具体原因请参照arp)

ipvsadm规则配置

ipvsadm-A -t 42.202.144.15:80 -s wlc
ipvsadm-a -t 42.202.144.11 -g -w 1
ipvsadm-a -t 42.202.144.12 -g -w 1
ipvsadm-a -t 42.202.144.13 -g -w 1


至此,DR模式配置结束

3、  TUN模式配置

TUN模式中,RS和LB可以不在同一个广播域,甚至不在同一个物理位置,RS可以跨国界。TUN模式与DR模式的原理虽然不同,但是它们的配置方式有很多相同之处,比如RS上的配置,TUN仍然不支持端口映射。不过在生产环境,这种模式并不常用,因为不同运营商之间对网络的配置不尽相同,有些运营商会检查RS回应包的源IP是否合法。从RS上发出的以VIP为源IP的回应包有可能被阻拦,比如,VIP在联通网内,RS在电信网内。这里还是使用DR模式的拓扑图,其实RS可以和LB不在同一个网内。

技术分享

LB的环境:

eth0=42.202.144.14

eth0:0(VIP)=42.202.144.15(如果没有多余的地址,VIP使用42.202.144.14也可以,RS上lo:0的地址将相应修改。)

 

RS的环境:

eth0=42.202.144.1x

tunl0=42.202.144.15

gateway=42.202.144.1

 

LB基础环境配置

4、   关闭路由转发

cat 0 >/proc/sys/net/ipv4/ip_forward


5、   配置VIP地址

ifconfig eth0:0 42.202.144.15netmask 255.255.255.255 up


RS基础环境配置

4、   修改arp宣告等级,防止lo:0上的vip地址在网络启动时被宣告出去。

cat 2 > /proc/sys/net/ipv4/conf/all/arp_announce
cat 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce


5、   修改arp响应等级,方式lo:0的vip在从eth0口收到arp时产生回应。

cat 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
cat 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore


4、   关闭数据包合法性校验

cat 0 > /proc/sys/net/ipv4/conf/all/rp_filter
cat 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter


6、   配置VIP

ifconfig tunl0 42.202.144.15 netmask 255.255.255.255 up

(注意必须是32位掩码,具体原因请参照arp)

ipvsadm规则配置

ipvsadm -A -t 42.202.144.15:80 -s wlc
ipvsadm -a -t 42.202.144.11 -i -w 1
ipvsadm -a -t 42.202.144.12 -i -w 1
ipvsadm -a -t 42.202.144.13 -i -w 1


至此,TUN模式配置结束

五、生产环境中lvs实施

1、确认内核是否支持lvs

[root@com1~]# modprobe -l|grep ipvs
kernel/net/netfilter/ipvs/ip_vs.ko
kernel/net/netfilter/ipvs/ip_vs_rr.ko
kernel/net/netfilter/ipvs/ip_vs_wrr.ko
kernel/net/netfilter/ipvs/ip_vs_lc.ko
kernel/net/netfilter/ipvs/ip_vs_wlc.ko
kernel/net/netfilter/ipvs/ip_vs_lblc.ko
kernel/net/netfilter/ipvs/ip_vs_lblcr.ko
kernel/net/netfilter/ipvs/ip_vs_dh.ko
kernel/net/netfilter/ipvs/ip_vs_sh.ko
kernel/net/netfilter/ipvs/ip_vs_sed.ko
kernel/net/netfilter/ipvs/ip_vs_nq.ko
kernel/net/netfilter/ipvs/ip_vs_ftp.ko


2、安装软件

如果可以使用在线安装方式,请在线安装。ipvsadm仅仅是一个规则制定工具,真正工作的是内核中的ip_vs模块,所以ipvsadm工具的版本不重要。

yum install ipvsadm


 

如果没有在线安装方式,那么只能下载源码包编译安装。编译时需要具备内核的源码包,这个比较恶。如果这个解决不了也不要编译了。

 

把这个搞定之后,直接在ipvsadm源码目录里make即可。(没测试)

3、集群配置

         在实施环境中,肯定要用脚本来跑,快准狠。

(1)NAT配置脚本

LB配置:

#!/bin/sh
#------mini-HOWTO-setup-LVS-NAT-director----------
 
#set ip_forwardON for vs-nat director (1 on, 0 off).
cat /proc/sys/net/ipv4/ip_forward
echo "1" >/proc/sys/net/ipv4/ip_forward
echo "0" >/proc/sys/net/ipv4/conf/all/send_redirects
cat /proc/sys/net/ipv4/conf/all/send_redirects
echo "0" >/proc/sys/net/ipv4/conf/default/send_redirects
cat /proc/sys/net/ipv4/conf/default/send_redirects
echo "0" >/proc/sys/net/ipv4/conf/eth0/send_redirects
cat /proc/sys/net/ipv4/conf/eth0/send_redirects
/sbin/sysctl -p &> /dev/null
 
#setup VIP
/sbin/ifconfig eth0:0 42.202.144.15 netmask 255.255.255.255 up
 
#clear ipvsadmtables
/sbin/ipvsadm -C
 
#install LVS services with ipvsadm
#add telnet to VIP with rr sheduling
/sbin/ipvsadm -A -t 192.168.2.110:telnet -s rr
 
#first realserver
#forward telnet to realserver 42.202.144.11 using LVS-NAT (-m), with weight=1
/sbin/ipvsadm-a -t 42.202.144.15:telnet -r 42.202.144.11:telnet -m -w 1
#check that realserver is reachable from director
ping -c 1 192.168.1.11
 
#second realserver
#forward telnet to realserver 192.168.1.12 using LVS-NAT (-m), with weight=1
/sbin/ipvsadm -a -t 42.202.144.15:telnet -r 42.202.144.12:telnet -m -w 1
#checking if realserver is reachable from director
ping -c 1 192.168.1.12
 
 
/sbin/ipvsadm


 

(2)DR模式配置脚本

         LB配置

#!/bin/bash
#---------------mini-rc.lvs_dr-director------------------------
#set ip_forward OFF forlvs-dr director (1 on, 0 off)
 
#add ethernet device androuting for VIP 192.168.1.110
/sbin/ifconfig eth0:0 42.202.144.15netmask 255.255.255.255 up
/sbin/route add -host 42.202.144.15dev eth0:0
 
 
#setup_ipvsadm_table
#clear ipvsadm table
/sbin/ipvsadm -C
#installing LVS serviceswith ipvsadm
#add telnet to VIP withround robin scheduling
/sbin/ipvsadm -A -t 42.202.144.15:telnet-s rr
 
#forward telnet torealserver using direct routing with weight 1
/sbin/ipvsadm -a -t 42.202.144.15:telnet-r 42.202.144.11 -g -w 1
#check realserverreachable from director
ping -c 1 42.202.144.11
 
#forward telnet torealserver using direct routing with weight 1
/sbin/ipvsadm -a -t 42.202.144.15:telnet-r 42.202.144.12 -g -w 1
#check realserverreachable from director
ping -c 1 42.202.144.12
 
#displaying ipvsadmsettings
/sbin/ipvsadm


 

 

RS配置

#!/bin/bash
#----------mini-rc.lvs_dr-realserver------------------
 
 
#install_realserver_vip
/sbin/ifconfig lo:0 42.202.144.15netmask 255.255.255.255 up
 
#installing route for VIP42.202.144.15 on device lo:0
/sbin/route add -host 42.202.144.15dev lo:0
 
#hiding interface lo:0,will not arp
 
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
echo 2 >/proc/sys/net/ipv4/conf/eth0(RIP所在的接口)/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 >/proc/sys/net/ipv4/conf/eth0/rp_filter
#----------mini-rc.lvs_dr-realserver------------------


 

(3)TUN模式配置脚本

LB配置

#!/bin/bash
#---------------mini-rc.lvs_dr-director------------------------
#set ip_forward OFF forlvs-dr director (1 on, 0 off)
 
#add ethernet device androuting for VIP 192.168.1.110
/sbin/ifconfig eth0:0 42.202.144.15netmask 255.255.255.255 up
/sbin/route add -host 42.202.144.15dev eth0:0
 
 
#setup_ipvsadm_table
#clear ipvsadm table
/sbin/ipvsadm -C
#installing LVS serviceswith ipvsadm
#add telnet to VIP withround robin scheduling
/sbin/ipvsadm -A -t 42.202.144.15:telnet-s rr
 
#forward telnet torealserver using direct routing with weight 1
/sbin/ipvsadm -a -t 42.202.144.15:telnet-r 42.202.144.11 -g -w 1
#check realserverreachable from director
ping -c 1 42.202.144.11
 
#forward telnet torealserver using direct routing with weight 1
/sbin/ipvsadm -a -t 42.202.144.15:telnet-r 42.202.144.12 -g -w 1
#check realserverreachable from director
ping -c 1 42.202.144.12
 
#displaying ipvsadmsettings
/sbin/ipvsadm


 

 

RS配置

#!/bin/bash
#----------mini-rc.lvs_dr-realserver------------------
#install_realserver_vip
/sbin/ifconfig tunl0 42.202.144.15netmask 255.255.255.255 up
 
#installing route for VIP42.202.144.15 on device lo:0
/sbin/route add -host 42.202.144.15dev tunl0
 
#hiding interface tunl0,will not arp
 
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 >/proc/sys/net/ipv4/conf/eth0(RIP所在的接口)/arp_announce
echo 0 >/proc/sys/net/ipv4/conf/all/rp_filter
echo 0 >/proc/sys/net/ipv4/conf/eth0/rp_filter
#----------mini-rc.lvs_dr-realserver------------------


 

六、其他案例


本文出自 “征途小站” 博客,请务必保留此出处http://doctorz.blog.51cto.com/9674137/1883151

LVS详解(实施级)