概述
LVS是工作在4层的负载均衡调度器,可根据请求报文的目标IP和目标协议及端口,根据指定的调度算法,将请求调度转发至某RealServer,本篇就针对LVS的原理,配置和使用进行简单介绍,具体包含:
1、LVS的四种类型的介绍
2、LVS调度算法的介绍
3、ipvsadm命令的用法介绍
4、LVS-NAT方式的配置示例
5、LVS-DR方式的配置示例
6、基于FWM(防火墙标记)的LVS的配置
7、LVS的持久连接机制的使用
第一章 LVS的四种类型的介绍
1、LVS的组成
ipvs:内核空间的框架,工作于内核上的netfilter的INPUT钩子之上的程序,可根据用户定义的集群实现请求转发
ipvsadm:用户空间的命令行程序,主要用于管理集群服务及集群服务器上的RS(后端真实服务主机)
2、LVS集群类型:
lvs-nat:修改请求报文的目标IP,相当于多目标的DNAT
lvs-dr:操纵封装新的MAC地址
lvs-tun:在原请求IP报文之外,新加一个IP首部
lvs-fullnat:修改请求报文的源和目标IP
3、LVS-NAT的介绍
LVS-NAT相当于iptables的多目标的DNAT,通过将请求报文中的目标地址和目标端口为挑选出来的后端RS的IP地址和PORT,基于连接追踪机制,因此,其并发能力受到连接追踪表的限制(相关连接追踪表的内容,参考iptables相关内容),所以其并发量不大。一般后端调度的服务器数量不超过10台
工作模型:
客户端请求发往前端调度器,调度器在INPUT链上发现请求的是定义好的集群服务,然后将其报文的目标地址转为后端某个提供真实服务的RIP的地址,发送给该real server,而后端real server处理完后,将响应结果响应给调度器,调度器收到后,根据内部的连接追踪表,将响应报文的源地址改为自己VIP的地址,然后响应给客户端
工作特性:
<1>多目标的DNAT,通过将请求报文中的目标地址和目端口修改为挑选出的而某real server的RIP和PORT实现转发
<2>RIP和DIP必须在同一IP网络,且应该使用私有地址,而且后端real server的网关要指向DIP(保证real server的响应报文必须经由调度器)
<3>请求报文和响应报文都经过Director转发,较高负载下,Director容易成为系统瓶颈和单点故障所在
<4>支持端口映射
<5>director调度器必须是linux、后端real server可以是任意操作系统
工作拓扑结构
4、LVS-DR的介绍
通过修改请求报文的mac地址进行转发(源MAC是DIP所在网卡的mac,目标mac是挑选出的某real server的RIP所在接口的MAC地址);IP首部不会发生变化(源地址是CIP,目标地址是VIP),因此为了让Real Server能够正常接收报文,要在Real Server上也配置VIP的地址
在各个real server的本地回环接口的子接口上配置一个IP地址,该IP地址与VIP相同,从而能够实现由real server直接响应用户请求,而不用转交给director响应
各个real server和director连接在一个网络中,相当于旁路部署的方式
工作模型:
director和real server上都只需要一个网卡,director的网卡IP是VIP,同时也会通过网卡别名的方式设置一个DIP,real server集群上的每个主机,也只有一个网卡,设置一个RIP,但会通过网卡别名设置一个跟director一样的VIP,只是这个别名设置的VIP是隐藏的,不会用来接收任何的报文,只是响应外部请求的是后,用来伪装以VIP的身份响应。
当请求进来后,源IP为CIP,目标IP为VIP,但此时只有director的VIP会响应,拿到报文后,director将报文进行帧首部拆封,通过查看IP和端口,发现是定义了集群的应用,然后将源MAC转为自己的的MAC,目标MAC转为某个RIP的MAC,然后将报文抓发给那个real server,当real server拿到报文后,解封装,发现MAC是自己,然后目标IP是VIP,因为自己这里也有一个虚拟出来的VIP,故接受报文,然后响应,响应的时候,以VIP为源地址,CIP为目标地址进行相应。
此中工作模型下,由于director只负责接受进站的请求,由real server直接相应出站请求,一般进站的请求报文都比较小,故此种方式下,负载均衡性能是非常好的。
工作特性:
<1>确保前端路由器将目标IP为VIP的请求报文发往Director
有三种实现方法:
1) 在路由器上静态绑定VIP和Director的MAC地址(但是不实用,因为如果对Director做了高可用,当当前绑定的MAC地址的Director故障后,那么在路由器上静态绑定就要随着修改)
2) 禁止各个real server上配置的VIP响应报文目标IP为VIP的请求(也就是在real server上,禁止本机的VIP响应ARP请求,禁止本机VIP向外通告)
可通过:
(a) arptables工具实现
(b) 修改real server的内核参数,并把VIP绑定在lo本地环回接口的别名上
内核参数为arp_ignore、arp_announce
<2>real server可以使用私有地址,也可以使用公网地址,RIP与DIP在同一网络
<3>real server和director必须在同一物理网络,因为二者之间使用MAC地址进行通信,real server的网关必须不能指向DIP
<4>请求报文必须由Director调度,但响应报文必须不能经过director,响应报文由RS直接发往Client
<5>不支持端口映射
<6>real server可使用大多数的操作系统
工作拓扑结构:
5、LVS-TUN介绍
director和real server不在同一个网络中,当请求报文到达director时,此时源IP为CIP,目标IP为VIP。director进行转发时,不会动原来的报文,而是在原来报文的基础上,再加上一层IP报文,将外壳报文的源IP设置为DIP,目标IP设置为选定要转发到的那台real server的RIP,当real server收到报文后,解封装,发现里面还有一个IP首部,源IP为CIP,目标IP为VIP,此种模型下real server上跟DR模型时类似,也有一个隐藏的VIP,故继续解封装后由real server直接响应客户端,响应时源IP为VIP,目标IP为CIP。
工作特点:
<1>转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP首部之外再封装一个IP首部(源IP为DIP,目标IP为挑选出来的real server的RIP)
<2>RIP、DIP、VIP全是公网地址
<3>real server的网关不能,也不可能指向DIP
<4>请求报文经由Director转发,但响应报文将由real server直接发往客户端CIP
<5>不支持端口映射
<6>real server的操作系统必须支持IP隧道功能
工作拓扑:
6、LVS-FULLNAT介绍
主要是为了解决lvs-nat模型中,各个real server不能跨网络的问题,通过同时修改请求报文的源IP(CIP转为DIP)和目标IP(VIP转为RIP)全部进行NAT转换来实现,此类型默认不支持,如果要使用,需要向内核打补丁
工作特点:
<1>VIP是公网地址,RIP是DIP是私有网络地址,且通常不在同一网络中,但需要经由路由器互通
<2>real server收到的请求报文源IP为DIP,因此响应报文将直接响应给DIP,Director再将报文处理后再发往Client
<3>请求和响应报文都经由Director
<4>支持端口映射
第二章 LVS调度算法的介绍
1、调度算法分类:
根据其调度是否考虑后端主机的当前负载的情况,可分为静态方法和动态方法两类:静态方法和动态方法
静态方法包括:RR、WRR、SH、DH
动态方法包括:LC、WLC、SED、NQ、LBLC、LBLCR
2、静态调度方法:仅根据算法本身进行调度,不考虑后端RS当前负载情况
<1>RR:round robin,轮询/轮调/轮叫,将请求轮流的调度到后端每一个RS上
<2>WRR:weighted round robin,加权轮询,基于后端RS的权重,将请求按照权重,轮流调度到各个RS上
<3>SH:source hash,
源地址hash,主要用于会话保持,将来自于同一个源地址的请求,始终发往后端的同一台real server上,指的是在一段时间内,只要是来自同一个客户端的请求,一定会发往同一个后端real server服务器。主要目的是为了session affinity(会话绑定),实际是在WRR算法的基础上,维持了一张会话表,表中记录了源IP和其调度到的RS的对应关系
<4>DH:destination hash,
目标地址hash,将发往同一个目标地址的请求始终转发至第一次挑中的RS,多数用于缓存代理中,用于正向的web代理中(缓存),负载均衡内网用户对外部服务器的请求,hash的是目标地址,将访问目标IP一致的请求,都调度到同一个代理服务器上,用于提升在代理服务器上的缓存的命中率
3、动态调度方法:根据算法及各个real server当前的负载状态进行调度
<1>LC:least connection
最少连接。通过计算每个real server的活动连接和非活动连接的总数,计算公式为 active*256+inactive,判断哪台服务器的连接数最小,就挑选谁作为调度对象
<2>WLC:weight lc加权最小连接
在lc的基础上,考虑服务器自身性能作为权重依据,性能越好,权重值越大,公式为(active*256+inactive)/weight,判断哪个的值最小,就将其作为调度对象,如果值一样,就按排列在上面的作为调度对象
<3>SED:shortest expections delay,最短期望延迟
改进了的wlc,计算方式为(active+1)*256/weight,谁小,选谁
<4>NQ:never queue,永不排队
改进了的sed,先根据权重,保证每个服务器上分配一个请求,然后再根据sed的算法,进行分配
<5>LBLC:locality-based LC,基于本地的最少连接。
有一个特点,类似动态的dh算法,将请求同一资源的客户端发往同一个后端的服务器,但是是在考虑服务器空闲状态的,利用wlc的计算方式。
<6>LBLCR:基于本地的带复制功能的最少连接。利用缓存复制功能
第三章 ipvsadm命令的用法介绍
1、管理集群服务:增、改、删、查
<1>增加、修改
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p timeout]
-A:增加
-E:修改
-t:tcp协议的某个服务添加为集群服务
-u:udp协议的某个服务添加为集群服务
-f:firewall mark 防火墙标记
service-address:
-t,TCP协议时,此地址对应为:VIP:PORT
-u,UDP协议时,此地址对应为:VIP:PORT
-f,防火墙标记时,此地址对应为:MARK(防火墙的标记)
-s scheduler:指明调度算法,省略此项时,默认为wlc
-p timeout:当定义LVS的持久连接时,指明持久连接时长
如:
ipvsadm -A -t 10.1.32.68:80 -s rr
表示添加一个tcp类型的集群服务,服务监听的地址是10.1.32.68的80端口,采取的调度算法为rr算法
ipvsadm -A -t 10.1.32.68:3306 -s wlc
添加一个tcp类型的集群服务,服务监听的地址是10.1.32.68的3306端口,采用的调度算法是wlc
ipvsadm -E -t 10.1.32.68:80 -s wlc修改集群服务
<2>删除指定的集群服务
ipvsadm -D -t|u|f service-address
-D 删除
如:
ipvsadm -D -t 10.1.32.68:80
2、集群上Real Server的管理
<1>增加、修改
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-a 增加
-e 修改,修改时不能修改real server的地址
-t|u|f service-address :与之前添加的那种协议的集群服务,及其对应的地址(要实现存在)
-r server-address:指明后端real server的地址,RIP[:PORT],可以不指定PORT,不加时,表示根定义集群服务时的端口一样
[-g|i|m] 指明集群类型,不指名,则默认为lvs-dr模型
-g 表示gateway,也就是lvs-dr模型
-i 表示ipip,也就是lvs-tun模型
-m 表示masquerade,也就是lvs-nat模型
-w weight 指明权重,对于在定义集群服务时,指明的算法如果支持权重,则-w指明该real server的权重
如:
ipvsadm -a -t 10.1.32.68:80 -r 10.1.32.72 -m -w 2
表示向10.1.32.68:80这个tcp类型的集群服务添加一个real server,其地址为10.1.32.72,采用的集群工作模型为lvs-nat模型,该real server的权重为2
<2>删除
ipvsadm -d -t|u|f service-address -r server-address
-d 删除
-t|u|f service-address 指明从哪个集群服务中
-r server-address 表示删除哪个real server
3、查看集群的相关信息:
ipvsadm -L|l [options]
options:
-n 表示数字格式显示为IP和PORT,而不进行反解到主机名和服务
-exact 表示显示大小单位时,不以M,G,而是以精确值来显示大小
-c 表示显示当前ipvs的连接的情况
–stats 表示显示ipvs的统计数据,如发送报文速量,接受报文数量…
–rate 速率,显示集群服务及real server上的平均每秒接受的报文速率、每秒发送的报文数量…
ipvsadm -Ln显示出来的内容 Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.1.32.68:80 rr 集群服务及其采用的调度算法 -> 10.1.32.72:80 Masq 2 0 0 后端的real server的地址和对应的端口,以及采用的lvs的工作模型(nat、dr、tun),权重,活动连接数,非活动连接数 -> 10.1.32.73:80 Masq 3 0 0 ipvsadm -Ln --stats显示出来的内容 Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 10.1.32.68:80 0 0 0 0 0 集群服务及当前整个集群的连接数,总共的入站的报文数,出站的报文数,入站的字节数,出站的字节数 -> 10.1.32.72:80 0 0 0 0 0 当前real server的地址和端口,当前real server的总共的连接数,入站报文数,出站报文数,入站字节数,出站字节数 -> 10.1.32.73:80 0 0 0 0 0 ipvsadm -Ln --rate 显示出来的内容 Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS -> RemoteAddress:Port TCP 10.1.32.68:80 0 0 0 0 0 当前集群的平均每秒的连接数,每秒的入站报文数,每秒出站报文数,每秒入站字节数,每秒出站字节数 -> 10.1.32.72:80 0 0 0 0 0 当前real server上平均每秒的连接数,每秒的入站报文数,每秒出站报文数,每秒入站字节数,每秒出站字节数 -> 10.1.32.73:80 0 0 0 0 0
4、清空所有ipvs规则:ipvsadm -C 表示清空当前ipvs上的所有的集群定义的规则
5、清空ipvs的计数器(接受报文数、发送报文数…)
ipvsadm -Z [-t|u|f service-address]
6、ipvs规则的保存和重载:
保存:
ipvsadm-save > /PATH/TO/FILE
ipvsadm -S > /PATH/TO/FILE
重载:
ipvsadm-restore < /PATH/FROM/FILE
ipvsadm -R < /PATH/FROM/FILE
第四章 LVS-NAT方式的配置示例
1、配置环境说明
2、在Director上安装ipvsadm工具,在RS1和RS2上安装LAMP软件组合,验证LAMP组合服务是否可用
修改LAMP组合的相关程序的配置文件,启动服务,在RS1和RS2上提供测试页面,启动服务,查看LAMP组合是否正常
3、按照实验拓扑,配置各个节点的网络
4、在Director上定义集群服务,测试访问
第五章 LVS-DR方式的配置示例
LVS-DR模型的实验说明: 1、在各主机(Director、RS)上均需要配置VIP,因此,要解决地址冲突的问题,目标是让RS上的VIP不可见,仅用于接受 目标地址为VIP的报文,同时可作为响应报文的源地址,可实现的方法: <1> 在前端的网关上进行静态绑定,明确指明VIP的mac就是director的VIP对应的接口的mac地址 <2> 在各个RS上使用arptables。arptables的功能类似iptables,只是iptables是在IP层做过滤, 而arptables在可以基于mac地址做过滤,这样就可以在real server上设置不允许响应arp的请求包 <3> 在各个RS上修改内核参数,内核上提供了两个内核参数:arp_ignore 和arp_announce arp_ignore:定义接收到ARP请求时的响应级别。默认是0,接受的值有0-8,其中,0表示请求的IP地址配置 在本地的任何接口上,都进行相应;1表示请求的IP地址在配置在请求进来的接口上时,才进行相应。 arp_announce:定义将自己地址和MAC地址对应关系,向外通告时的通告级别。值为0,1,2。默认是0, 其中0表示将本机任何接口上的任何地址向每个接口进行通告;1表示试图仅向目标网络通告与其网络匹配的地址; 2表示仅向与本地接口上地址匹配的网络进行通告 故可以通过在real server上将虚拟的VIP配置到lo接口的别名上,如:lo:0上, 然后设置arp_ignore 为1,arp_announce为2,这样就符合要求了 2、在使用了上述的第<3>方法阻止real server接受VIP的报文后,当director接收到请求报文,然后调度后, 转发到某个real server上,当real server接收到请求,进行响应时,由于虚拟的VIP是配置在lo接口上,lo是 不对外进行响应的,而linux系统上,对外响应报文的源地址,一定是报文出去的接口的IP地址,但是请求报文 的目标地址是VIP,响应的源地址一定要是VIP,否则客户端在接收到响应报文后会认为是非法报文,为了解决这 个问题,可以在real server上配置一条路由条目,将响应报文的源地址设置为lo上配置的假的VIP地址
1、实验环境
2、在Director上按照拓扑结构,搭建实验环境
3、在RS1上配置实验所需的环境
3、在RS2上配置实验所需环境
4、设定客户端环境
5、在Director上定义集群,在客户端进行验证
6、补充说明: 通过以上几个配置,就可以进行负载均衡了,但是这样实现负载均衡的前提是,VIP、DIP、RIP在同一个网段内, 如果是向外提供服务的应用,那么这些主机上都要是公网地址。但是在实际生产环境中,基本上只要VIP是公网 地址,其他都是私有地址,为了实现这种情况的负载均衡,结构应该是这样的,进口路由设备通过交换机接到 director上,这时路由接到交换机的口的地址,以及director的地址都是公有IP,然后各个real server连接到 交换机上,交换机还有另外一条线路通过别的路由器出去,或者是还有另外一条线路,接到之前那个路由器的另 外一个接口上,而路由器的这个接口上的IP为私有IP地址
第六章 基于FWM(防火墙标记)的LVS的配置
1、防火墙标记的相关概念
防火墙标记:在netfilter上给报文打标签,应该在iptables的mangle表上实现,mangle表可在iptables的5个链(PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING)上都可以实现,标记的值为正整数
对ipvs而言,所有报文都是在INPUT链上进行处理的,所以如果要基于防火墙标记进行集群配置,则可以在PREROUTING链上对报文打上防火墙标记,然后再到INPUT链上用ipvs定义集群
2、利用防火墙标记定义LVS集群的意义
基于防火墙标记定义集群,可以将多个服务定义一个集群服务(前提是后端的real server也同时提供对应的多个服务)
还可以基于防火墙标记,进行LVS的持久连接
3、基于防火墙标记定义集群的示例:
在LVS-DR实验的基础上,利用防火墙标记,将httpd与mysql的服务定义为同一个调度对象,进行统一调度
第七章 LVS的持久连接机制
1、ipvs的持久连接的作用
基于一个持久连接模板,能实现,无论使用任何算法调度,都能进行在一段时间内,将来自于同一源IP的请求,始终发往后端同一real server,利用持久连接模板(实际是一段内存缓冲区域),模板内保存了每个客户端及分配给他的real server 的映射关系
2、持久连接的类型
每端口持久(PPC):只持久一个服务
来自于同一个源IP对ipvs上定义的多个集群服务,当访问某一个服务,如80端口的服务时,在定义的持久连接的时长内,都调度到某个real server上,但是当该客户端请求该ipvs上定义的其他集群服务时,如22端口,则是重新调度到另外的真正提供22端口服务的real server上
每客户端持久(PCC): 持久所有服务
只要是来自于同一客户端的请求,无论访问的是哪个集群服务,都调度到后端同一个real server上,前提是后端的real server要能同时提供多种集群定义的服务
每FWM持久:每防火墙标记持久,持久自定义的服务
将来自同一个防火墙标记的都发往同一个real server上,如此就可以灵活的将各种服务组织成同一个防火墙标记,然后对同一个防火墙标记进行持久连接的定义
3、配置每端口持久示例
4、配置每客户端持久示例
5、定义每防火墙标记持久示例
原创文章,作者:M20-1倪文超,如若转载,请注明出处:http://www.178linux.com/54875