LVS基于NAT的负载均衡

实验环境:VMware workstation 10

      centos 6.4

 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。章文嵩博士目前工作于阿里集团,主要从事集群技术、操作系统、对象存储与数据库的研究


LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。


一般来说,LVS集群采用三层结构,其主要组成部分为:

A、负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。

B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。

C、共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。


虚拟服务器的几种类型:

通过NAT虚拟服务器

虚拟服务器的优势通过NAT是真正的服务器 可以运行任何操作系统,支持TCP / IP协议,真的吗 服务器可以使用私有网络地址,只有一个IP地址 所需的负载均衡器。


缺点是通过虚拟服务器的可伸缩性 NAT是有限的。 负载平衡器可能是整体的一个瓶颈 系统服务器节点(通用PC服务器)的数量增加 大约20或更多,因为请求数据包和响应 数据包需要重写的负载均衡器。 假设的 TCP数据包的平均长度是536字节,平均延迟 重写一个包是我们约60(奔腾处理器,这可以 稍微减少了使用更高的处理器),最大的吞吐量 负载均衡器的8.93 mb / s。 假设平均 真实服务器的吞吐量是400 kb / s,负载平衡器 安排22真实的服务器。


虚拟服务器通过NAT可以满足性能要求很多 服务器。 即使在负载均衡器的瓶颈 整个系统,有两种方法来解决这个问题,一个是混合动力车 方法,,另一个是 虚拟 服务器通过IP隧道 或 虚拟 服务器通过直接路由 。 在DNS混合的方式,有 很多都有自己的服务器集群的负载平衡器,和 负载平衡器由Round-Round分组在一个域名 DNS。 你可以尝试使用VS-Tunneling或VS-DRouting 可伸缩性,您也可以尝试嵌套和负载平衡器的方法, 第一个前端是VS-Tunneling或VS-DRouting负载均衡器, 第二层是许多VS-NAT负载平衡器,都有他们的 自己的集群。


虚拟服务器通过IP隧道

通过NAT在虚拟服务器,请求和响应数据包 需要通过负载均衡器,负载平衡器可能是一个新的 瓶颈当服务器节点的数量增加到20或更多, 因为网络接口的吞吐量是有限的 最终。 我们可以看到许多互联网服务(比如web 服务),请求数据包通常短,响应包 通常有大量的数据。


通过IP隧道,在虚拟服务器负载平衡器而已 时间表对不同的真实服务器的请求,和真正的服务器 回复直接返回给用户。 因此,负载平衡器可以处理 大量的请求,它可能安排超过100真正的服务器,它 不会是系统的瓶颈。 :-)因此使用IP隧道 将大大增加负载的服务器节点的最大数量 均衡器。 虚拟服务器可以达到的最大吞吐量 1 gbps,即使负载均衡器只有100 mbps的全双工网络 适配器。


IP隧道特性可以用来建立一个非常 高性能虚拟服务器。 这是极好的建设 虚拟代理服务器,代理服务器get请求,因为当它 可以直接访问互联网获取对象并返回它们 直接用户。

然而,所有服务器必须有“IP隧道”(IP 启用封装)协议,我只是测试了它在Linux上的IP 隧道。 如果你让虚拟服务器服务器上运行的其他工作 操作系统与IP隧道,请告诉 我 知道,我将很高兴听到 那


虚拟服务器通过直接路由

通过隧道的方法,像在虚拟服务器LinuxDirector 过程只有客户机到服务器的一个连接的一半 虚拟服务器通过直接路由和响应数据包可以遵循 独立的网络线路的客户。 这可以大大增加 虚拟服务器的可伸缩性。

通过IP隧道的方法相比,虚拟服务器,这一点 方法没有隧道开销(事实上,这开销 最小的在大多数情况下),但要求一个负载 平衡器的接口和真正的服务器的接口必须的 同一物理段。




LVS在服务器的负载均衡的实现,比较类似于netfilter框架,它在内核中靠的是LVS代码,在用户空间有工具ipvsadm,实现类似于四层的功能控制,


有以下几种大致的虚拟服务器负载均衡

1.基于DNS的解析类负载均衡,通过内部的地址调度算法,进行均衡,但由于这种均衡不涉及到后方服务器的真实性能,所以很可能造成负载“失衡”


2.前方架构dispatcher这种方案,Internet用户也不需要知道前端设备的存在

其工作方式可以分为以下几种

使用nat的方式 后方服务器可以是任意类型的支持tcp/ip的操作系统,但地址类型是私有的, 服务器数量较少,10到20个,网关指向前端设备


3.使用ip tunneling  后方服务器必须是隧道类型连接,可以在同一局域网,也可以是分部在广域网中,可以实现异地容灾概念, 支持的服务器数量多,服务器网关指向各自的网关


具体实现步骤:


[root@localhost ~]# vim /etc/sysctl.conf


LVS基于NAT的负载均衡_虚拟服务器


分别增加两台web服务器,并把它们的地址分配为192.168.2.18和192.168.2.17 并将他们与lvs的内网网卡(本例中的192.168.2.1网卡)放置到同一区域,如vmnet2


LVS基于NAT的负载均衡_虚拟服务器_02

LVS基于NAT的负载均衡_虚拟服务器_03

并保证他们与前段directe的通信


LVS基于NAT的负载均衡_虚拟服务器_04

LVS基于NAT的负载均衡_虚拟服务器_05


[root@localhost ~]# route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

192.168.3.0     0.0.0.0         255.255.255.0   U     1      0        0 eth2

192.168.2.0     0.0.0.0         255.255.255.0   U     1      0        0 eth1

分别在两台web服务器上安装HTTP服务

LVS基于NAT的负载均衡_虚拟服务器_06

web2站点我们选择监听在它的800端口

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf

LVS基于NAT的负载均衡_虚拟服务器_07

并修改服务器的主机名称


LVS基于NAT的负载均衡_虚拟服务器_08

web1站点我们选择监听在它的80端口

LVS基于NAT的负载均衡_虚拟服务器_09

修改服务器的主机名称

LVS基于NAT的负载均衡_虚拟服务器_10


在web1上建立测试页面,加入开机启动,为保证实验的测试效果,我们将页面内容分别用server1和server2代替


LVS基于NAT的负载均衡_虚拟服务器_11

为保证正常访问关闭有关的selinux和防火墙设置


LVS基于NAT的负载均衡_虚拟服务器_12

在web2要做和web1同样的设置上,而且因为绑定了非标准端口,在开启服务是会因安全选项阻止而失败,所以我们要先关闭有关的安全选项,再开启服务


LVS基于NAT的负载均衡_虚拟服务器_13


服务器端directe配置步骤:

关于ipvsadm的信息


[root@localhost Packages]# rpm -qip ipvsadm-1.25-10.el6.i686.rpm

warning: ipvsadm-1.25-10.el6.i686.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY

Name        : ipvsadm                      Relocations: (not relocatable)

Version     : 1.25                              Vendor: CentOS

Release     : 10.el6                        Build Date: Fri 22 Jun 2012 12:08:15 AM PDT

Install Date: (not installed)               Build Host: c6b8.bsys.dev.centos.org

Group       : Applications/System          Source RPM: ipvsadm-1.25-10.el6.src.rpm

Size        : 65763                            License: GPLv2+

Signature   : RSA/SHA1, Sun 24 Jun 2012 03:08:27 PM PDT, Key ID 0946fca2c105b9de

Packager    : CentOS BuildSystem <http://bugs.centos.org>

URL         : http://www.linuxvirtualserver.org/software/ipvs.html

Summary     : Utility to administer the Linux Virtual Server

Description :

ipvsadm is a utility to administer the IP Virtual Server services

offered by the Linux kernel.

安装ipvsadm:

[root@localhost Packages]# rpm -ivh ipvsadm-1.25-10.el6.i686.rpm

warning: ipvsadm-1.25-10.el6.i686.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY

Preparing...                ########################################### [100%]

  1:ipvsadm                ########################################### [100%]



ipvsadmn -A来增加一个服务 -E修改一个服务 -t指明协议 (第一大步)

ipvsadm -a 指明real server -e 编辑 -g表示DR(直接路由)模型 -i表示tunneling隧道模型  -m 表示masquerading 既nat模型  默认为-g gatway模型


-A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。

-E --edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。

-D --delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。

-C --clear 清除内核虚拟服务器表中的所有记录。

-R --restore 恢复虚拟服务器规则

-S --save 保存虚拟服务器规则,输出为-R 选项可读的格式

-a --add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器

-e --edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录

-d --delete-server 删除一条虚拟服务器记录中的某条真实服务器记录

-L|-l --list 显示内核虚拟服务器表

-Z --zero 虚拟服务表计数器清零(清空当前的连接数量等)

-r --real-server server-address 真实的服务器[Real-Server:port]

-w --weight weight 真实服务器的权值

-m --masquerading 指定LVS 的工作模式为NAT 模式

-h --help 显示帮助信息



[root@localhost ~]# ipvsadm -A -t 192.168.3.2:80 -s rr   #增加一个tcp协议的虚拟服务,虚拟地址192.168.3.2 -s指明所用算法为round-robin


[root@localhost ~]# ipvsadm -a -t 192.168.3.2:80 -r 192.168.2.18:80 -m      #增加一个真实服务器对应到192.168.3.2,真实服务器地址为192.168.2.18的80端口 -m指定转换类型问NAT


[root@localhost ~]# ipvsadm -a -t 192.168.3.2:80 -r 192.168.2.17:800 -m     #增加一个真实服务器对应到192.168.3.2,真实服务器地址为192.168.2.17的800端口 -m指定转换类型问NAT



启用浏览器测试,注意测试要多刷新几次请求,使后端的directed测试结果明显

页面效果server2

LVS基于NAT的负载均衡_虚拟服务器_14


负载均衡效果页面server1


LVS基于NAT的负载均衡_虚拟服务器_15


查看轮询结果

[root@localhost ~]# ipvsadm -l -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

 -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.3.2:80 rr

 -> 192.168.2.18:80              Masq    1      0          7        

 -> 192.168.2.18:800             Masq    1      0          7  


加权轮询调度算法



使用加权的轮询算法(wrr)

[root@localhost ~]# ipvsadm -E -t 192.168.2.10:80 -s wrr     //加权轮询算法      

[root@localhost ~]# ipvsadm -e -t 192.168.2.10:80 -r 192.168.4.200:800 -m -w 2  //权重设2

[root@localhost ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

 -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.2.10:80 wrr

 -> 192.168.4.100:80             Masq    1      0          0    

 -> 192.168.4.200:800            Masq    2      0          0


测试结果,比例基本在1:2

[root@localhost ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

 -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.2.10:80 wrr

 -> 192.168.4.100:80             Masq    1      0          7    

 -> 192.168.4.200:800            Masq    2      0          14


配置保存

[root@localhost ~]# service ipvsadm save           //保存

ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm:      [  OK  ]

[root@localhost ~]# vim /etc/sysconfig/ipvsadm     //查看

 1 -A -t 192.168.2.10:80 -s wrr

 2 -a -t 192.168.2.10:80 -r 192.168.4.100:80 -m -w 1

 3 -a -t 192.168.2.10:80 -r 192.168.4.200:800 -m -w 2

[root@localhost ~]# ipvsadm -C                     //临时清除

[root@localhost ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

 -> RemoteAddress:Port           Forward Weight ActiveConn InActConn                                                        

[root@localhost ~]# service ipvsadm restart        //重新应用

ipvsadm: Clearing the current IPVS table:                  [  OK  ]

ipvsadm: Unloading modules:                                [  OK  ]

ipvsadm: Clearing the current IPVS table:                  [  OK  ]

ipvsadm: Applying IPVS configuration:                      [  OK  ]

[root@localhost ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

 -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.2.10:80 wrr

 -> 192.168.4.100:80             Masq    1      0          0    

 -> 192.168.4.200:800            Masq    2      0          0


在所用的direct中有round-robin算法和基于权重的round-robin算法,最少连接数概念(动态计算)    源哈希指的是记录第一次来时访问的某个服务器,以后的同样的数据流都会定向到同一台后台real server上。目标哈希则会影响访问数据的返回路径,假如从防火墙a来,则从防火墙b返回


查看内核参数中的ipvsadm信息

[root@localhost ~]# sysctl -p

net.ipv4.ip_forward = 1

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.default.accept_source_route = 0

kernel.sysrq = 0

kernel.core_uses_pid = 1

net.ipv4.tcp_syncookies = 1

error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key

error: "net.bridge.bridge-nf-call-iptables" is an unknown key

error: "net.bridge.bridge-nf-call-arptables" is an unknown key

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.shmmax = 4294967295

kernel.shmall = 268435456

[root@localhost ~]# grep -i vs /boot/config-2.6.32-358.el6.i686

# CONFIG_GENERIC_TIME_VSYSCALL is not set

CONFIG_HIBERNATION_NVS=y

CONFIG_IP_VS=m

CONFIG_IP_VS_IPV6=y

# CONFIG_IP_VS_DEBUG is not set

CONFIG_IP_VS_TAB_BITS=12

# IPVS transport protocol load balancing support

CONFIG_IP_VS_PROTO_TCP=y

CONFIG_IP_VS_PROTO_UDP=y

CONFIG_IP_VS_PROTO_AH_ESP=y

CONFIG_IP_VS_PROTO_ESP=y

CONFIG_IP_VS_PROTO_AH=y

CONFIG_IP_VS_PROTO_SCTP=y

# IPVS scheduler

CONFIG_IP_VS_RR=m

CONFIG_IP_VS_WRR=m

CONFIG_IP_VS_LC=m

CONFIG_IP_VS_WLC=m

CONFIG_IP_VS_LBLC=m

CONFIG_IP_VS_LBLCR=m

CONFIG_IP_VS_DH=m

CONFIG_IP_VS_SH=m

CONFIG_IP_VS_SED=m

CONFIG_IP_VS_NQ=m

# IPVS application helper

CONFIG_IP_VS_FTP=m

CONFIG_OPENVSWITCH=m

CONFIG_MTD_BLKDEVS=m

CONFIG_SCSI_MVSAS=m

# CONFIG_SCSI_MVSAS_DEBUG is not set

CONFIG_VMWARE_PVSCSI=m

CONFIG_MOUSE_VSXXXAA=m

CONFIG_MAX_RAW_DEVS=8192

CONFIG_USB_SEVSEG=m

CONFIG_USB_VST=m



其他调度算法简介


Least-Connection调度

least-connection调度算法指导网络 连接到服务器的数量最少的 连接。 这是一个动态调度算法; 因为它需要计数为每个服务器连接生活 动态。 为虚拟服务器管理的集合 服务器性能相似,least-connection调度 好光滑分布在不同请求的负载 很多。虚拟服务器将直接请求到真正的服务器 用最少的活动连接。


乍一看似乎least-connection调度也可以 表现良好,即使有各种处理的服务器 能力,因为更快的服务器将获得更多的网络 连接。 事实上,因为它不能执行很好 TCP的TIME_WAIT状态。 TCP的TIME_WAIT通常是2分钟, 在这2分钟一个繁忙的网站经常收到成千上万的 连接,例如,服务器是强大的两倍 服务器,服务器处理成千上万的请求 让他们在TCP的TIME_WAIT状态,但服务器B 爬行到成千上万的连接完成。 所以, least-connection调度无法负荷之间的平衡 服务器与不同的处理能力。


加权Least-Connection调度

加权least-connection调度的超集 least-connection调度中,您可以指定一个 性能重量每个真正的服务器。 服务器具有更高 重量值将获得更大比例的生活连接 在任何一个时间。 管理员可以分配一个虚拟服务器 重量每个真正的服务器和网络连接计划 每个服务器的当前数量的百分比 现场连接每个服务器是一个比它的重量。 的 默认的重量就是其中之一。


关于他们更详细的介绍可以参阅www.linuxvirtualserver.org/VS-NAT.html