LVS (linux virtual server)是实现集群服务器的一种开放源代码软件,LVS集群采用IP负载均衡技术和基于内容请求分发技术.负载均衡器(Load Ba-lancer,LB)具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且负载均衡器能自动屏蔽服务器的故障,从而将一组服务器构建成为一个高性能的、高可用的虚拟服务器.整个服务器集群的结构对用户是透明的,而且无需修改客户端和服务器端的程序。具有透明性、可伸缩性、高可用性和易管理性等优点。
LVS 集群中实现的三种IP 负载均衡技术,
1、Virtual Server via Network Address Translation (VS/NAT): 也有说端口映射的,其目标是将一组服务器构成一个高性能的、高可用的虚拟服务器。因为这种技术容易形成单点故障,从而造成网路无法访问,并且存在带宽瓶颈,最多可以有10个服务器节点。
2、Virtual Server via Direct Routing (VS/DR) :直接路由实现虚拟服务器的方法(负载能力最强),通过改写请求报文的 M AC 地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户,VS/DR技术可极大地提高集群系统的伸缩性,这种方法没有 IP隧道的开销,但是要求调度器与真实服务器都有一块网卡连在同一物理网段上,并且也解决了NAT模式产生的瓶颈问题,可以有大量的节点,最多可以有100个服务器节点。
3、Virtual Server via IP Tunneling (VS/TUN ): 通过IP 隧道实现虚拟服务。调度器把请求报文通过 IP 隧道转发至真实服务器,而真实服务器将响应直接返回给客户,调度器只处理请求报文,由于一般网络服务应答比请求报文大许多,采用VS/TUN技术后,系统的最大吞吐量可以提高 10倍。
负载均衡集群的架构
负载均衡的解决方案中,若干台服务器做同样的工作,这样一来以前由一台服务器来做的工作已经分配给多个服务器来做, 整个系统的处理能力得以提高。 在整个负载均衡集群中由负载均衡器、真实服务器组和共享存储三部分构成。
1) Load Balancer(负载均衡器)
Load Balancer 是整个集群系统的前端 , 负责把客户请求通过特定的调度算法转发到 Real Server 上。 Backup 是备份 Load Balancer,当Load Balancer 不可用时接替它 , 成为实际的 Load Balancer。 Load Bal-ancer 通过 Ldirectord 监测各 Real Server 的健康状况。 在 Real Server 不可用时把它从群中剔除,恢复时重新加入。
2) Server Array(真实服务器组)
Server Array 是一组运行实际应用服务的机器,比如 WEB,Mail,FTP,DNS,Media 等等 。 在实际应用中 ,Load Balancer 和 Backup 也可以兼任Real Server 的角色。
3) Shared Storage(共享存储)
Shared Storage 为所有 Real Server 提供共享存储空间和一致的数据内容。
目前,Linux 平台下的集群软件有很多,其中 Linux Virtual Server(LVS)最为流行。 LVS 安装在负载均衡器上,使用虚拟 IP 地址对外服务,当接受到客户请求后它根据特定的调度算法将客户机请求转发到选择的真实服务器,LVS 支持的调度算法如下。
固定算法:
1) rr循环(Round Robin)
调度器通过“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
2) wrr 加权循环(Weighted Round Robin)
调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。 这样可以保证处理能力强的服务器处理更多的访问流量。 调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
3) dh 目标地址散列(Destination Hashing)
目标地址散列调度算法根据请求的目标 IP 地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
4) sh 源地址散列(Source Hashing)
源地址散列调度算法根据请求的源 IP 地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
动态算法:
1) lc 最少链接(Least Connections)
调度器通过“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。 如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。
2) wlc 加权最少链接(Weighted Least Connections)
在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。 调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
3) lblc 基于局部性的最少链接(Locality-Based Least Connections)基于局部性的“最少链接”调度算法是针对目标 IP 地址的负载均衡,目前主要用于 Cache 集群系统。 该算法根据请求的目标 IP地址找出该目标 IP 地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
4) lblcr 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
带复制的基于局部性“最少链接”调度算法也是针对目标 IP 地址的负载均衡,目前主要用于 Cache 集群系统。 它与 LBLC 算法的不同之处是它要维护从一个目标 IP 地址到一组服务器的映射,而 LBLC 算法维护从一个目标 IP 地址到一台服务器的映射。 该算法根据请求的目标 IP 地址找出该目标 IP 地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。 同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
5)SED:最少的期望权值 只考虑active激活的连接,不考虑inactive连接。计算方法:(active+1)*256
6)NQ:永不排队 若果某个节点未处于活动连接,就将下一个请求发送给该节点进行处理
案例1
案例要求:如下图所示,外网用户直接访问Director上的VIP地址192.168.2.2,使用网络地址转换(即VS/NAT 技术)director将请求分派给下面两台realserver ,分配使用RR轮循调度算法和WRR加权轮循调度算法
1、检查是否内核中已经加载了ip_vs相关的模块
[root@localhost ~]# grep -i ip_vs /boot/config-2.6.18-164.el5
CONFIG_IP_VS=m
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
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
CONFIG_IP_VS_FTP=m
2、安装ipvsadm管理工具
[root@localhost ~]# mount -a
mount: block device /dev/cdrom is write-protected, mounting read-only
[root@localhost ~]# cd /media/cdrom/Cluster
[root@localhost Cluster]# ll ipvs*
-r--r--r-- 78 root root 32142 2009-07-29 ipvsadm-1.24-10.i386.rpm
[root@localhost Cluster]# rpm -ivh ipvsadm-1.24-10.i386.rpm
Preparing... ########################################### [100%]
1:ipvsadm ########################################### [100%]
3、查看ipvsadm的相关文件
4、启动ipvsadm管理服务,
发现无法启动,因为还没有在/etc/sysconfig/产生规则文件ipvsadm。
5、查看ipvsadm配置的帮忙文档,定义服务,添加服务器
[root@localhost ~]# ipvsadm -A -t 192.168.2.2:80 -srr //添加一个服务器,并指定调度算法
注:-r --real-server ;-m:Use masquerading or nat
[root@localhost ~]# ipvsadm -a -t 192.168.2.2:80 -r 192.168.3.100 -m
[root@localhost ~]# ipvsadm -a -t 192.168.2.2:80 -r 192.168.3.200 -m
6、保存配置的规则
7、因使用了nat,打开数据包转发功能,
# vim /etc/sysctl.conf
7 net.ipv4.ip_forward = 1
# sysctl -p
8、在两台realserver上分别配置web服务,将网关指向Director的DIP地址192.168.2.2,外网pc访问VIP,如下图:
刷新一下,两网站间循环:
9、更改调度算法为wrr
# ipvsadm -E -t 192.168.2.2:80 -s wrr
# ipvsadm -e -t 192.168.2.2:80 -r 192.168.3.100 -m -w 10
# ipvsadm -e -t 192.168.2.2:80 -r 192.168.3.200 -m -w 5
10、保存规则,
service ipvsadm save
11、测试时,
再次访问,将会出现两次web1,一次web2站点,这是由于realserver1的权重是realserver2的2倍。
案例2
如图所示,director上的网卡eth0:0上配置VIP地址,eth0上配置DIP地址,外网用户通过交换机访问到director的VIP,然后director通过DIP将请求发送至两台realserver,然后两台realserver 通过右侧交换机到存储服务器上查找网页,在将结果直接通过左侧的交换机返回给客户机,绕开了director。
案例配置
1、director负载均衡器配置:
[root@director ~]# ipvsadm -At 192.168.2.254:80 -s rr
[root@director ~]# ipvsadm -at 192.168.2.254:80 -r 192.168.2.10 -g
[root@director ~]# ipvsadm -at 192.168.2.254:80 -r 192.168.2.20 -g
[root@director ~]# service ipvsadm save //保存配置
[root@director ~]# service ipvsadm start //启动服务
2、server1、server2配置相同(下例为server1配置):
#解决arp不响应的问题(对arp相关项的修改也是临时性的,重启系统后消失)
net.ipv4.conf.eth0.arp_ignore = 0
net.ipv4.conf.eth0.arp_announce = 0
将arp_announce的值改为2,将arp_ignore的值改为为1
临时修改:
[root@server1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore //只回答目标IP地址是来访网络接口本地地址的ARP查询请求
[root@server1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce //对查询目标使用最适当的本地地址
[root@server1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@server1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
永久修改上面arp的不响应的问题,
#echo "net.ipv4.conf.eth0.arp_announce = 2" >> /etc/sysctl.conf
#echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf
#echo "net.ipv4.conf.eth0.arp_ignore = 1" >> /etc/sysctl.conf
#echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf
#sysctl -p 重新加载文件,使配置生效
注:server2可以直接执行scp命令来拷贝syerver的配置文件,
#scp /etc/sysctl.conf 192.168.2.20:/etc/
[root@server1 ~]# ifconfig lo:0 192.168.2.254 netmask 255.255.255.255 //lo:0的地址
#添加一条路由
[root@server1 ~]# route add -host 192.168.2.254 dev lo:0
注:
通过ifconfig、route修改的并没有写入配置文件,重启网络后就失效了。
可以通过下列方式添加固定ip,
测试
# ipvsadm -Ln或通过 watch -n 1 "ipvsadm -Ln"动态查看负载情况
刷新一次,以rr调度算法实现轮循,显示sever2的网页内容。
对于web服务器而言已经实现了负载均衡,但其网页内容来自不同的服务器,当然如果是静态网页可以直接通过拷贝的方式就可以了,而对于动态网页呢,就不是一件容易的事了,下面我们就借助NFS来实现群集服务器中共享存储的概念,使每个服务器访问的资源均来自共享存储服务器。
NFS服务器设置:
通过nfs来实现自动挂载
#mkdir /abc //创建网站主目录
#echo “this is web1 && web2” > index.html
vim /etc/exports
/abc *(ro)
#service nfs start //启动nfs服务
1、设置开机自动挂载
server1与server2相同配置,
#vim /etc/fstab //编辑开机自动挂载
192.168.3.1:/abc /var/www/html nfs defaults,soft,intr 0 0
#mount -a
并用mount查看是否正常挂载
通过访问director的VIP,直接访问到了放置在(NFS)存储器上的网页文件,
动态查看负载均衡的匹配情况(可以实现轮循):
2、实现了开机自动挂载,为了避免占用网络资源,可以通过auofs服务来控制,实现自动挂载,当无用时,自动断开连接。
server1与server2配置相同
1)编译/etc/auto.master文件,做如下添加:
2)编辑/etc/html.misc文件
[root@server1 var]# vim /etc/html.misc
html -fstype=nfs,soft,intr 192.168.3.1:/abc
3)启动autofs服务。
4)同样访问director的VIP,直接访问到了放置在(NFS)存储器上的网页文件,并且60秒,若无连接,则服务器会自动卸载掉/abc目录。