LVS中文站点 http://zh.linuxvirtualserver.org/
一、 LVS简介
LVS: Linux Virtual Server的缩写,意思是Linux虚拟服务器,是一个虚拟的服务器集群系统。
LVS是一个开源的软件,由毕业于国防科技大学的章文嵩博士于1998年5月创立,可以实现LINUX平台下的简单负载均衡
宗旨:
使用集群技术和Linux操作系统实现一个高性能、高可用的服务器.
很好的可伸缩性(Scalability)
很好的可靠性(Reliability)
很好的可管理性(Manageability)
二、技术原理:
LVS集群采用“IP负载均衡技术”和“基于内容请求分发技术”。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。
LVS集群采用三层结构,其主要组成部分为:
1)负载调度器(Load Balancer),位于整个集群系统的最前端,有一台或者多台负载调度器(Director Server)组成,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。 2)服务器池(Server Pool),是一组真正执行客户请求的服务器(Real Server),执行的服务有WEB、MAIL、FTP和DNS等。 3)共享存储(Shared Storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
三、LVS集群的特点
1、IP负载均衡技术
负载均衡技术有很多实现方案,有基于DNS域名轮流解析的方法、有基于客户端调度访问的方法、有基于应用层系统负载的调度方法,还有基于IP地址的调度方法,在这些负载调度算法中,执行效率最高的是IP负载均衡技术。
LVS的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:
安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。
当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何返回数据给用户,是IPVS实现的重点技术,IPVS实现负载均衡机制有三种,分别是NAT、TUN和DR,详述如下
CIP Client computer‘s IP address:公网IP,客户端使用的IP。 VIP Virtual IP address:Director用来向客户端提供服务的IP地址 RIP Real IP address:集群节点(后台真正提供服务的服务器)所使用的IP地址 DIP Director‘s IP address:Director用来和D/RIP 进行联系的地址
a) VS/NAT: 即(Virtual Server via Network Address Translation)
通过NAT网络地址转换技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,Real Server返回数据给用户时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。
可以看出,在NAT方式下,用户请求和响应报文都必须经过Director Server地址重写,当用户请求越来越多时,调度器的处理能力将称为瓶颈。
原理简述:
目标地址转换,所有客户端的请求都被Director根据访问请求和算法被定向到后台的Real Server 上.
数据包地址转换过程:
CIP --> VIP --> Director --> DIP --> RIP --> Real Server --> RIP --> Director --> VIP --> CIP
特点:
Director和Real Server必须在同一个网段中;
一般情况下,RIP是私有地址,只用于集群内部节点间通信;
Director 会响应所有的请求在客户端和Real Server之间,所承担的负载较大;
所有的Real IP 网关必须指向DIP以响应客户端请求;
Director可以重映射网络端口,即前端使用标准端口,后端可以使用非标准端口;
后台的Real Server可以使用任何操作系统;
Director可能会成为系统瓶颈。
b)VS/TUN :即(Virtual Server via IP Tunneling)
通过IP隧道技术实现虚拟服务器。它的连接调度和管理与VS/NAT方式一样,只是它的报文转发方法不同,VS/TUN方式中,调度器采用IP隧道技术将用户请求转发到某个Real Server,而这个Real Server将直接响应用户的请求,不再经过前端调度器,此外,对Real Server的地域位置没有要求,可以和Director Server位于同一个网段,也可以是独立的一个网络。因此,在TUN方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提高。
数据包传输过程:
CIP --> VIP --> Director --> DIP --> RIP --> Real Server --> VIP --> CIP
特点:
与DR的网络结构一样,但Director和Real Server可以在不同的网络当中,可以实现异地容灾的功能。DIP-->VIP 基于隧道来传输,在数据包外层额外封装了S:DIP D:RIP 的地址。
Director和Real Server 必须在同一个物理网络中;
RIP一定不能是私有地址;
Director只负责处理进来的数据包;
Real Server直接将数据包返回给客户端,所以Real Server默认网关不能是DIP,必须是公网上某个路由器的地址;
Director不能做端口重映射;
只有支持隧道协议的操作系统才能作为Real Server。
c)VS/DR: 即(Virtual Server via Direct Routing)
通过直接路由技术实现虚拟服务器。它的连接调度和管理与VS/NAT和VS/TUN中的一样,但它的报文转发方法又有不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。
这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上。
数据包传输过程:
CIP --> VIP --> Director --> DIP --> RIP --> Real Server --> RIP --> CIP
特点:
Real Server上必须配置VIP切需要隐藏起来,只有在响应客户端请求时才使用VIP作为源地址,除此之外并不使用此VIP.
集群节点和Director必须在同一个网络中;
RIP不要求为私有地址;
Director仅处理所有进来的请求;
Real Server 不能以DIP作为网关,而是以公网上的某台路由器作为网关;
Director 不能再使用端口重映射;
大多数操作系统可以被用来作为Real Server,windows除外;
LVS-DR模式可以处理比LVS-NAT更多的请求。
实际生产环境中最常用的一种方式,优点:
RIP 为公网地址,管理员可以远程连接Real Server来查看工作状态;
一旦Director 宕机,可以通过修改DNS记录将A记录指向RIP 继续向外提供服务;
2、负载调度算法
上面我们谈到,负载调度器是根据各个服务器的负载情况,动态地选择一台Real Server响应用户请求,那么动态选择是如何实现呢,其实也就是我们这里要说的负载调度算法,根据不同的网络服务需求和服务器配置,IPVS实现了如下八种负载调度算法,这里我们详细讲述最常用的四种调度算法,剩余的四种调度算法请参考其它资料。
a)RR 轮询调度(Round Robin)
“轮询”调度也叫1:1调度,调度器通过“轮询”调度算法将外部用户请求按顺序1:1的分配到集群中的每个Real Server上,这种算法平等地对待每一台Real Server,而不管服务器上实际的负载状况和连接状态。
b)WRR 加权轮询调度(Weighted Round Robin)
“加权轮询”调度算法是根据Real Server的不同处理能力来调度访问请求。可以对每台Real Server设置不同的调度权值,对于性能相对较好的Real Server可以设置较高的权值,而对于处理能力较弱的Real Server,可以设置较低的权值,这样保证了处理能力强的服务器处理更多的访问流量。充分合理的利用了服务器资源。同时,调度器还可以自动查询Real Server的负载情况,并动态地调整其权值。
c)LC 最少链接调度(Least Connections)
“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。
d)WLC 加权最少链接调度(Weighted Least Connections)
“加权最少链接调度”是“最少连接调度”的超集,每个服务节点可以用相应的权值表示其处理能力,而系统管理员可以动态的设置相应的权值,缺省权值为1,加权最小连接调度在分配新连接请求时尽可能使服务节点的已建立连接数和其权值成正比。
e)WRR 加权轮询 (Weighted round-robin):给每台Real Server分配一个权重/位列,权重越大,分到的请求数越多。
f)DH 目标散列 (Destination hashing):来自于同一个IP地址的请求都被重定向到同一台Real Server上(保证目标地址不变)
g)SH 源地址散列(Source hashing): Director必须确保响应的数据包必须通过请求数据包所经过的路由器或者防火墙(保证源地址不变)
h)SED 最短期望延迟 (Short饿死他 Expected Delay): 不在考虑非活动连接数
四、安装部署
1、基础环境
# yum install openssl openssl-devel openssh-clients gcc libnl* popt*
Linux内核大于2.6 版本的,都默认支持LVS功能
可以通过如下命令检查kernel是否已经支持LVS的ipvs模块
# 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管理软件了
2、在Director Serve上源码安装IPVS管理软件
下载ipvs管理软件ipvsadm http://www.linuxvirtualserver.org/software/ipvs.html
# tar zxvf ipvsadm-1.24.tar.gz # cd ipvsadm-1.24 # make && make install # ipvsadm --help 修改配置文件 /etc/rc.d/init.d/ipvsadm # 启动LVS服务 # ipvsadm
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 -A --add-service 在内核的虚拟服务器列表中添加一条新的虚拟IP记录。也就是增加一台新的虚拟服务器 -E --edit-service 编辑内核虚拟服务器列表中的一条虚拟服务器记录 -D --delete-service 删除内核虚拟服务器列表中的一条虚拟服务器记录 -C --clear 清除内核虚拟服务器列表中的所有记录 -R --restore 恢复虚拟服务器规则 -S --save 保存虚拟服务器规则,输出为-R 选项可读的格式 -a --add-server 在内核虚拟服务器列表的一条记录里添加一天新的Real Services记录。也就是在一个虚拟服务器中添加一台新的RealServer -e --edit-server 编辑一条虚拟服务器记录中的某条Real Server记录 -d --delete-server 删除一条虚拟服务器记录中的某条Real Server记录 -L --list 显示内核中虚拟服务器列表 -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 -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的工作模式为直接路由模式DR(此模式是LVS 默认工作模式) -i -ipip 指定LVS 的工作模式为隧道模式TUN -m --masquerading 指定LVS 的工作模式为NAT模式 -w --weight weight 指定Real Server的权值 -c --connection 显示LVS目前的连接信息 如:ipvsadm -Lnc
3、安装keepalived
yum install daemon tar zxvf cd keepalived-1.2.13.tar.gz ./configure make && make install cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ # 启动脚本 mkdir -pv /etc/keepalived cp /usr/local/sbin/keepalived /usr/sbin/ # 修改主配置文件 /etc/keepalived/keepalived.conf service keepalived start Keepalived启动后会有三个进程: 父进程:内存管理,子进程管理 子进程:VRRP子进程 子进程:healthchecker子进程 # 开机自启动 chkconfig --add keepalived chkconfig --level 35 keepalived on
主配置文件详细说明 keepalived.conf
# 说明 # VIP 101.251.96.136 10.10.10.229 # Real Server1 101.251.96.141 10.10.10.201 # Real Server2 101.251.96.139 10.10.10.229 # ! Configuration File for keepalived # 全局定义部分 global_defs { notification_email { [email protected] # 设置报警邮件地址,可以设置多个,每行一个。注意,如果要开启邮件报警,需要开启本机的sendmail服务。 [email protected] } notification_email_from [email protected] # 设置邮件的发送地址 smtp_server 127.0.0.1 # 设置smtp server地址 smtp_connect_timeout 30 # 设置连接smtp服务器超时时间 router_id LVS_DEVEL # 运行Keepalived服务器的一个标识。发邮件时显示在邮件标题中的信息 } vrrp_instance VI_1 { # 定义外网 state MASTER # 指定Keepalived的角色,MASTER表示此主机是主用服务器,BACKUP表示是备用服务器 interface eth1 # 指定HA监测网络的接口 virtual_router_id 1 # 虚拟路由标识,这个标识是一个数字,并且同一个vrrp实例使用唯一的标识,即同一个vrrp_instance下,MASTER和BACKUP必须是一致的。 priority 101 # 定义优先级,数字越大,优先级越高,在一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级 advert_int 1 # 设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 authentication # 设定验证类型和密码 { auth_type PASS # 设置验证类型,主要有PASS和AH两种 auth_pass xde.146_5%DJYP # 设置验证密码,在一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信 } virtual_ipaddress # 设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个 { 101.251.96.136 # 虚拟外网ip } } # 虚拟服务器定义部分 virtual_server 101.251.96.136 80 # 设置虚拟服务器,需要指定虚拟ip地址和服务端口,ip与端口之间用空格隔开 { delay_loop 2 # 设置健康检查时间,单位是秒 lb_algo wrr # 设置负载调度算法,这里设置为wrr,即最少链接调度 lb_kind DR # 设置负载均衡转发规则,可以有NAT、TUN和DR三个模式可选 persistence_timeout 0 # 会话保持时间,单位是秒,这个选项对于动态网页是非常有用的,为集群系统中session共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话保持时间。需要注意的是,这个会话保持时间,是最大无响应超时时间,也就是说用户在操作动态页面时,如果在50秒内没有执行任何操作,那么接下来的操作会被分发到另外节点,但是如果一直在操作动态页面,则不受50秒的时间限制 protocol TCP # 指定转发协议类型,有tcp和udp两种 nat_mask 255.255.255.240 gateway 101.251.96.129 real_server 101.251.96.141 80 # 配置服务节点1,需要指定real server的真实IP地址和端口,ip与端口之间用空格隔开 { weight 1 # 设置权重,权值大小用数字表示,数字越大,权值越高,设置权值的大小可以为不同性能的服务器分配不同的负载,可以对性能高的服务器设置较高的权值,而对性能较低的服务器设置相对较低的权值,这样就合理的利用和分配了系统资源 TCP_CHECK # realserve的状态检测设置部分,单位是秒 { connect_timeout 3 # 3秒无响应超时 nb_get_retry 3 # 重试次数 delay_before_retry 3 # 重试间隔 } } real_server 101.251.96.139 80 # 配置服务节点2 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } # 以下内容是定义内网的ip/vip及其real server,和上面内容相似,只是ip做了对应修改 vrrp_instance VI_2 { # 定义内网 state BACKUP interface eth0 virtual_router_id 1 priority 100 advert_int 1 authentication { auth_type PASS auth_pass xde.146_5%DJYP } virtual_ipaddress { 10.10.10.229 } } virtual_server 10.10.10.229 80 { delay_loop 2 lb_algo wrr lb_kind DR nat_mask 255.255.255.0 gateway 10.10.10.1 persistence_timeout 0 protocol TCP real_server 10.10.10.201 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 10.10.10.209 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
在配置Keepalived.conf时,需要特别注意配置文件的语法格式,因为Keepalived在启动时并不检测配置文件的正确性,即使没有配置文件,Keepalived也照样能启动起来,因而配置文件一定要正确。
在默认情况下,Keepalived在启动时会查找/etc/Keepalived/Keepalived.conf配置文件,如果你的配置文件放在了其它路径下,可以通过“Keepalived -f”参数指定你所在的配置文件路径即可。
Keepalived.conf配置完毕后,将此文件拷贝到备用Director Server对应的路径下,然后做两个简单的修改即可:
将“state MASTER”更改为“state BACKUP”
将priority 100更改为一个较小的值,这里改为“priority 80”
最后,还要配置集群的Real server节点,以达到与Director Server相互广播通信并忽略arp的目的,脚本的内容已经在前面文章中进行过介绍,这里不做解释。