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
分别增加两台web服务器,并把它们的地址分配为192.168.2.18和192.168.2.17 并将他们与lvs的内网网卡(本例中的192.168.2.1网卡)放置到同一区域,如vmnet2
并保证他们与前段directe的通信
[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服务
web2站点我们选择监听在它的800端口
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
并修改服务器的主机名称
web1站点我们选择监听在它的80端口
修改服务器的主机名称
在web1上建立测试页面,加入开机启动,为保证实验的测试效果,我们将页面内容分别用server1和server2代替
为保证正常访问关闭有关的selinux和防火墙设置
在web2要做和web1同样的设置上,而且因为绑定了非标准端口,在开启服务是会因安全选项阻止而失败,所以我们要先关闭有关的安全选项,再开启服务
服务器端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
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
负载均衡效果页面server1
查看轮询结果
[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