标签:lvs
一、LVS简介
LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。
使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。
LVS自从1998年开始,发展到现在已经是一个比较成熟的技术项目了。可以利用LVS技术实现高可伸缩的、高可用的网络服务,例如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频/音频点播服务等等,有许多比较著名网站和组织都在使用LVS架设的集群系统,例如:Linux的门户网站(www.linux.com)、向RealPlayer提供音频视频服务而闻名的Real公司(www.real.com)、全球最大的开源网站(sourceforge.net)等。
二、 LVS体系结构
使用LVS架设的服务器集群系统有三个部分组成:最前端的负载均衡层,用Load Balancer表示,中间的服务器群组层,用Server Array表示,最底端的数据共享存储层,用Shared Storage表示,在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。
LVS体系结构如图1所示:
LVS的各个层次的详细介绍:
Load Balancer层:位于整个集群系统的最前端,有一台或者多台负载调度器(Director Server)组成,LVS模块就安装在Director Server上,而Director的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array层的应用服务器(Real Server)上。同时,在Director Server上还要安装对Real Server服务的监控模块Ldirectord,此模块用于监测各个Real Server服务的健康状况。在Real Server不可用时把它从LVS路由表中剔除,恢复时重新加入。
Server Array层:由一组实际运行应用服务的机器组成,Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接。在实际的应用中,Director Server也可以同时兼任Real Server的角色。
Shared Storage层:是为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数 据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如Red hat的GFS文件系统,oracle提供的OCFS2文件系统等。
从整个LVS结构可以看出,Director Server是整个LVS的核心,目前,用于Director Server的操作系统只能是Linux和FreeBSD,linux2.6内核不用任何设置就可以支持LVS功能,而FreeBSD作为 Director Server的应用还不是很多,性能也不是很好。对于Real Server,几乎可以是所有的系统平台,Linux、windows、Solaris、AIX、BSD系列都能很好的支持。
三、LVS类型
NAT:地址转换
DR: 直接路由
TUN:隧道
NAT:
集群节点跟director必须在同一个IP网络中;
RIP通常是私有地址,仅用于各集群节点间的通信;
director位于client和real server之间,并负责处理进出的所有通信;
realserver必须将网关指向DIP;
支持端口映射;
realserver可以使用任意OS;
较大规模应该场景中,director易成为系统瓶颈;
DR:
集群节点跟director必须在同一个物理网络中;
RIP可以使用公网地址,实现便捷的远程管理和监控;
director仅负责处理入站请求,响应报文则由realserver直接发往客户端;
realserver不能将网关指向DIP;
不支持端口映射;
TUN:
集群节点可以跨越Internet;
RIP必须是公网地址;
director仅负责处理入站请求,响应报文则由realserver直接发往客户端;
realserver网关不能指向director;
只有支持隧道功能的OS才能用于realserver;
不支持端口映射;
四、LVS调度方法
四种静态:
rr:
wrr:
dh:
sh:
动态调度方法:
lc: 最少连接
wlc: 加权最少连接
sed: 最短期望延迟
nq: never queue
LBLC: 基于本地的最少连接
DH:
LBLCR: 基于本地的带复制功能的最少连接
五、下面我们以LVS-DR模型进行安装配置
服务器 | IP | VIP |
Director | 192.168.0.22 | 192.168.0.8 |
Realserver1 | 192.168.0.23 | 192.168.0.8 |
Realserver2 | 192.168.0.24 | 192.168.0.8 |
2.可以通过如下命令检查kernel是否已经支持LVS的ipvs模块:
[root@localhost ~]#modprobe -l |grep ipvs /lib/modules/2.6.9-42.ELsmp/kernel/net/ipv4/ipvs/ip_vs_rr.ko /lib/modules/2.6.9-42.ELsmp/kernel/net/ipv4/ipvs/ip_vs_sh.ko
如果有类似上面的输出,表明系统内核已经默认支持了IPVS模块。接着就可以安装IPVS管理软件了
3.在Director Serve上安装IPVS管理软件
IPVS提供的软件包有源码方式的也有rpm方式的,这里介绍下源码方式安装IPVS,首先从http://www.linuxvirtualserver.org/software/ipvs.html下载对应版本的ipvs源码,由于我们这里采用的操作系统为Centos4.4版本,因此,下载对应的ipvsadm-1.24版本,接着进行安装:
[root@localhost ~]#tar zxvf ipvsadm-1.24.tar.gz [root@localhost ~]#cd ipvsadm-1.24 [root@localhost ~]#make [root@localhost ~]#make install
也可以通过yum方式进行安装:
[root@localhost ~]#yum install ipvsadm -y
然后执行:
[root@localhost ~]# ipvsadm --help
如果看到帮助提示,表明IPVS已经成功安装。
六.ipvsadm的用法
(1)Ipvsadm常用的语法和格式如下:
ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p [timeout]] [-M netmask] ipvsadm -D -t|u|f virtual-service-address ipvsadm -C ipvsadm -R ipvsadm -S [-n] ipvsadm -a|e -t|u|f virtual-service-address:port -r real-server-address:port [-g|i|m] [-w weight] ipvsadm -d -t|u|f virtual-service-address -r real-server-address ipvsadm -L|l [options] ipvsadm -Z [-t|u|f virtual-service-address] ipvsadm --set tcp tcpfin udp ipvsadm –h
其中:
virtual-service-address:是指虚拟服务器的IP地址,本文是192.168.0.22
real-service-address:是指Real Server的IP地址,本文是192.168.0.23/24
scheduler:指定调度算法
ipvsadm命令选项详细含义如表2所示:
表2
命令选项
含义
-A (--add-service) 在内核的虚拟服务器列表中添加一条新的虚拟IP记录。也就是增加一台新的虚拟服务器。虚拟IP也就是虚拟服务器的IP地址。 -E (--edit-service) 编辑内核虚拟服务器列表中的一条虚拟服务器记录 -D (--delete-service) 删除内核虚拟服务器列表中的一条虚拟服务器记录 -C (--clear) 清除内核虚拟服务器列表中的所有记录 -R (--restore) 恢复虚拟服务器规则 -S (--save) 保存虚拟服务器规则,输出为-R 选项可读的格式 -a (--add-server) 在内核虚拟服务器列表的一条记录里添加一条新的Real Server记录。也就是在一个虚拟服务器中增加一台新的Real Server -e (--edit-server) 编辑一条虚拟服务器记录中的某条Real Server记录 -d (--delete-server) 删除一条虚拟服务器记录中的某条Real Server记录 -L|-l –list 显示内核中虚拟服务器列表 -Z (--zero) 虚拟服务器列表计数器清零(清空当前的连接数量等) --set tcp tcpfin udp 设置连接超时值 -t 说明虚拟服务器提供的是tcp服务,此选项后面跟如下格式: [virtual-service-address:port] or [real-server-ip:port] -u 说明虚拟服务器提供的是udp服务,此选项后面跟如下格式: [virtual-service-address:port] or [real-server-ip:port] -f fwmark 说明是经过iptables标记过的服务类型 -s 此选项后面跟LVS使用的调度算法 有这样几个选项: rr|wrr|lc|wlc|lblc|lblcr|dh|sh 默认的调度算法是: wlc -p [timeout] 在某个Real Server上持续的服务时间。也就是说来自同一个用户的多次请求,将被同一个Real Server处理。此参数一般用于有动态请求的操作中,timeout 的默认值为300 秒。例如:-p 600,表示持续服务时间为600秒。 -r 指定Real Server的IP地址,此选项后面跟如下格式: [real-server-ip:port] -g (--gatewaying) 指定LVS 的工作模式为直接路由模式(此模式是LVS 默认工作模式) -i (-ipip) 指定LVS 的工作模式为隧道模式 -m (--masquerading) 指定LVS 的工作模式为NAT模式 -w (--weight) weight 指定Real Server的权值 -c (--connection) 显示LVS目前的连接信息 如:ipvsadm -L -c -L --timeout 显示“tcp tcpfin udp”的timeout值,如:ipvsadm -L --timeout -L --daemon 显示同步守护进程状态,例如:ipvsadm -L –daemon -L --stats 显示统计信息,例如:ipvsadm -L –stats -L --rate 显示速率信息,例如:ipvsadm -L --rate -L --sort 对虚拟服务器和真实服务器排序输出,例如:ipvsadm -L --sort
注释:
在表2中,左边括弧中的内容为ipvsadm每个选项的长格式表示形式,linux命令选项中,有长格式和短格式,短格式的选项用的比较多,实际应用中可以用括弧中的长格式替代短格式,例如,可以用“ipvsadm --clear”代替“ipvsadm -C”。
(2)举例
[root@localhost ~]# ipvsadm -A -t 192.168.0.22:80 -s rr -p 600
以上表示在内核的虚拟服务器列表中添加一条192.168.0.22的虚拟服务器记录,并且指定此虚拟服务器的服务端口为80,然后指定此虚拟服务器的调度策略为轮询调度,并且在每个real server上的持续服务时间为600秒,即10分钟。
[root@localhost ~]# ipvsadm -A -t 192.168.0.22:21 -s wlc
以上表示在内核的虚拟服务器列表中又添加了一条192.168.60.188的虚拟服务器,此虚拟服务器的服务端口为21,即FTP服务。使用的调度策略为wlc,即加权最少链接算法。
[root@localhost ~]# ipvsadm -a -t 192.168.0.22:80 -r 192.168.0.23:80 –g
[root@localhost ~]# ipvsadm -a -t 192.168.0.22:80 -r 192.168.0.24:80 –g
以上两条设置表示在虚拟服务器192.168.0.22中添加两条新的Real Server记录,两个Real Server的IP分别为192.168.0.23和192.168.0.24,参数“-g”指定了虚拟服务器的工作模式为直接路由模式,即DR模式。
这样设置完毕后,当用户访问192.168.0.22的80服务时,LVS会根据设置的调度策略和路由模式将请求分配到192.168.0.23以及192.168.0.24的80端口。
七、LVS-Director的配置
这里提供一个Director的lvs脚本,大家直接运行此脚本即可配置好LVS,非常简单。
#!/bin/bash # # LVS script for VS/DR # chkconfig: - 90 10 # description: LVS DR director . /etc/rc.d/init.d/functions # VIP=192.168.0.8 DIP=192.168.0.22 RIP1=192.168.0.23 RIP2=192.168.0.24 PORT=80 RSWEIGHT1=2 RSWEIGHT2=5 # case "$1" in start) /sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev eth0:0 # Since this is the Director we must be able to forward packets echo 1 > /proc/sys/net/ipv4/ip_forward # Clear all iptables rules. /sbin/iptables -F # Reset iptables counters. /sbin/iptables -Z # Clear all ipvsadm rules/services. /sbin/ipvsadm -C # Add an IP virtual service for VIP 192.168.0.219 port 80 # In this recipe, we will use the round-robin scheduling method. # In production, however, you should use a weighted, dynamic scheduling method. /sbin/ipvsadm -A -t $VIP:80 -s wlc # Now direct packets for this VIP to # the real server IP (RIP) inside the cluster /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w $RSWEIGHT1 /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w $RSWEIGHT2 /bin/touch /var/lock/subsys/ipvsadm &> /dev/null ;; stop) # Stop forwarding packets echo 0 > /proc/sys/net/ipv4/ip_forward # Reset ipvsadm /sbin/ipvsadm -C # Bring down the VIP interface /sbin/ifconfig eth0:0 down /sbin/route del $VIP /bin/rm -f /var/lock/subsys/ipvsadm echo "ipvs is stopped..." ;; status) if [ ! -e /var/lock/subsys/ipvsadm ]; then echo "ipvsadm is stopped ..." else echo "ipvs is running ..." ipvsadm -L -n fi ;; *) echo "Usage: $0 {start|stop|status}" ;; esac
RealServer脚本:
#!/bin/bash # # Script to start LVS DR real server. # chkconfig: - 90 10 # description: LVS DR real server # . /etc/rc.d/init.d/functions VIP=192.168.0.8 host=`/bin/hostname` case "$1" in start) # Start LVS-DR real server on this machine. /sbin/ifconfig lo down /sbin/ifconfig lo up echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev lo:0 ;; stop) # Stop LVS-DR real server loopback device(s). /sbin/ifconfig lo:0 down echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce ;; status) # Status of LVS-DR real server. islothere=`/sbin/ifconfig lo:0 | grep $VIP` isrothere=`netstat -rn | grep "lo:0" | grep $VIP` if [ ! "$islothere" -o ! "isrothere" ];then # Either the route or the lo:0 device # not found. echo "LVS-DR real server Stopped." else echo "LVS-DR real server Running." fi ;; *) # Invalid entry. echo "$0: Usage: $0 {start|status|stop}" exit 1 ;; esac
本文出自 “水滴石穿” 博客,请务必保留此出处http://wangzan18.blog.51cto.com/8021085/1631060
标签:lvs
原文地址:http://wangzan18.blog.51cto.com/8021085/1631060