LVS是LinuxVirtualServer的简写(也叫做IPVS),意即Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能。
从上图我们看出,LVS负载均衡调度技术是在Linux内核中实现的,因此,被称之为Linux虚拟服务器(LinuxVirtualServer)。我们使用该软件配置LVS时候,不能直接配置内核中的ipbs,而需要使用ipvs管理工具ipvsadm进行管理,或者通过Keepalived软件直接管理ipvs。
LVS基本工作过程如下图所示:
为了方便大家探讨LVS技术,LVS社区提供了一个命名的约定,内容如下表:
LVS集群内部的节点称为真实服务器(RealServer),也叫做集群节点。请求集群服务的计算机称为客户端计算机。与计算机通常在网上交换数据包的方式相同,客户端计算机,Director和真实服务器使用IP地址彼此进行通信。不同架构角色命名情况如下图:
IP虚拟服务器软件IPVS
LVS的四种工作模式
VirtualServerviaNetworkAddressTranslation(VS/NAT)
调度时:目的IP改成RIP(DNAT)返回时:源IP改成VIP(SNAT)
NAT模式特点小结:
增加一个IP头部。通过IP隧道进行通信(可以跨网段找到RS节点)
TUN模式特点小结:
VirtualServerviaDirectRouting(VS/DR)
VS/DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器将响应后的处理结果直接返回给客户端用户。同VS/TUN技术一样,VS/DR技术可极大地提高集群系统的伸缩性。而且,这种DR模式没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器LB与正式服务器RS节点都有一块网卡连在同一物理网段上,即必须在同一个局域网环境。
只修改目标MAC地址,通过MAC找到RS节点(无法跨网段找到RS节点)
DR模式特点小结:
淘宝的LVS应用模式
FULLANT特点:1,源IP改成不同的VIP和目的IP改成RIP2,RS处理完毕返回时,返回给不同的LVS调度器3,所有LVS调度器之间通过session表进行ClientAddress的共享
10种调度算法见如下表格(rr,wrr,wlc重点):
实际使用中,这些算法的适用范围不限于这些。我们最好参考内核中的连接调度算法的实现原理,根据具体业务需求合理的选型。
LVS集群的特点可以归结如下:
(1)功能:
(2)适用性
1)后端真实服务器可运行任何支持TCP/IP的操作系统,包括Linux,各种Unix(如FreeBSD,SunSolaris,HPUnix等),Mac/OS和windowsNT/2000等。
2)负载均衡调度器LB能够支持绝大多数的TCP和UDP协议:
无需对客户机和服务作任何修改,可适用大多数Internet服务。
3)调度器本身当前不支持windows系统。支持大多数的Linux和UINIX系统。
(3)性能
LVS服务器集群系统具有良好的伸缩性,可支持几百万个并发连接。配置100M网卡,采用VS/TUN或VS/DR调度技术,集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s
(4)可靠性
LVS服务器集群软件已经在很多大型的,关键性的站点得到很好的应用,所以它的可靠性在真实应用得到很好的证实。
(5)软件许可证
LVS集群软件是按GPL(GNUPublicLicense)许可证发行的自由软件,这意味着你可以得到软件的源代码,有权对其进行修改,但必须保证你的修改也是以GPL方式发行。
1)数据库及memcache等对内业务的负载均衡环境
特别提示:上面的环境为内部环境的负载均衡模式,即LVS服务是对内部业务的,如数据库及memcache等的负载均衡
2)web服务或webcache等负载均衡环境
提示:这个表格一般是提供Web或Webcache负载均衡的情况,此种情况特点为双网卡环境。这里把192.168.0.0/24假设为内网卡,192.168.200.0/24假设为外网卡。
以下的安装都是在LVSLB192.168.0.210上
[root@lvs01~]#lsmod|grepip_vs#查看linux内核是否有ipvs服务[root@lvs01~]#uname-r#查看内核版本2.6.32-431.el6.x86_64[root@lvs01~]#cat/etc/redhat-release#查看系统版本CentOSrelease6.5(Final)[root@lvs01~]#yum-yinstallkernel-devel#光盘安装[root@lvs01~]#ls-ld/usr/src/kernels/2.6.32-431.el6.x86_64/drwxr-xr-x.2rootroot4096Aug919:28/usr/src/kernels/2.6.32-431.el6.x86_64/#安装完就会出现此目录[root@lvs01~]#ln-s/usr/src/kernels/2.6.32-431.el6.x86_64//usr/src/linux#做一个软连接[root@lvs01~]#ll-d/usr/src/linux/drwxr-xr-x.2rootroot4096Aug919:28/usr/src/linux/[root@lvs01~]#ll/usr/src/total8drwxr-xr-x.2rootroot4096Sep232011debugdrwxr-xr-x.3rootroot4096Aug919:28kernelslrwxrwxrwx.1rootroot39Aug919:28linux->/usr/src/kernels/2.6.32-431.el6.x86_64/[root@lvs01~]#特别注意:此ln命令的链接路径要和uname-r输出结果内核版本对应,工作中如果做安装虚拟化可能有多个内核路径如果没有/usr/src/kernels/2.6.32-431.el6.x86_64/路径,很可能是因为缺少kernel-devel软件包。可通过yum进行安装centos5.x版本不能用ipvs1.26
3)安装lvs命令:
[root@lvs01~]#yum-yinstalllibnl*popt*#需要通过公网源安装[root@lvs01~]#cd/usr/src/ipvsadm-1.26/[root@lvs01ipvsadm-1.26]#make#直接编译不需要./configure[root@lvs01ipvsadm-1.26]#makeinstall[root@lvs01~]#whichipvsadm/sbin/ipvsadm[root@lvs01~]#ipvsadmIPVirtualServerversion1.2.1(size=4096)ProtLocalAddress:PortSchedulerFlags->RemoteAddress:PortForwardWeightActiveConnInActConn[root@lvs01~]#lsmod|grepip_vs#执行完/sbin/ipvsadm就会有信息ip_vs1252200libcrc32c12461ip_vsipv6317340270ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6#==>出现这个内容就表示LVS已经安装好,并加载到了内核LVS安装小结:1,CentOS5.X安装lvs,使用1.24版本。2,CentOS6.X安装lvs,使用1.26版本。3,安装lvs后,要执行ipvsadm把ip_vs模块加载到内核。
(1)配置LVS虚拟IP(VIP)
[root@lvs01~]#ifconfigeth0:0192.168.0.240broadcast192.168.0.240netmask255.255.255.0up[root@lvs01~]#ifconfigeth0:0eth0:0Linkencap:EthernetHWaddr00:0C:29:D5:7F:9Dinetaddr:192.168.0.240Bcast:192.168.0.240Mask:255.255.255.255UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1(2)手工执行配置添加LVS服务并增加两台RS
[root@lvs01~]#ipvsadm-L-nIPVirtualServerversion1.2.1(size=4096)ProtLocalAddress:PortSchedulerFlags->RemoteAddress:PortForwardWeightActiveConnInActConnTCP192.168.0.240:80rrpersistent20->192.168.0.223:80Route100->192.168.0.224:80Route100(4)ipvs配置删除方法
[root@web01~]#echo"1">/proc/sys/net/ipv4/conf/lo/arp_ignore[root@web01~]#echo"2">/proc/sys/net/ipv4/conf/lo/arp_announce[root@web01~]#echo"1">/proc/sys/net/ipv4/conf/all/arp_ignore[root@web01~]#echo"2">/proc/sys/net/ipv4/conf/all/arp_announce2.2.5配置网关型防火墙防火墙的双网卡都不要设置网关,因为自己的就网关
内网客户端用于模拟lvs应用于内网的负载均衡情况比如lvs数据库读负载均衡,比如lvsmemcached缓存组负载均衡由于这类型的负载均衡请求都是由内网服务器发起,因此用内网客户端来模拟
#内网客户端访问测试root@LanClient~]#hostname-I192.168.0.220#内网客户端IP[root@LanClient~]#route-n#默认路由为网关防火墙KernelIProutingtableDestinationGatewayGenmaskFlagsMetricRefUseIface192.168.0.00.0.0.0255.255.255.0U000eth0169.254.0.00.0.0.0255.255.0.0U100200eth00.0.0.0192.168.0.1000.0.0.0UG000eth0[root@LanClient~]#curl192.168.0.240192.168.0.224bbs[root@LanClient~]#curl192.168.0.240192.168.0.223bbs[root@LanClient~]#curl192.168.0.240192.168.0.224bbs[root@LanClient~]#curl192.168.0.240192.168.0.223bbs#从上面可以看出,内网客户端模拟访问lvs负载均衡器,成功!2.2.7配置外网客户端外网客户端模拟的是lvs转发外网用户访问需求给RS节点处理的情况模拟外网客户端,要求客户端不能配置任何网关
由于外网客户端要访问内网的LVS需要经过网关防火墙的跳转,因此需要在防火墙服务器上做iptables的DNAT和SNAT,配置如下:
过程略
[root@lvs01~]#yum-yinstallkeepalived#光盘安装即可3.5仅实现LVS负载均衡器主和备的keepalived高可用功能LVS负载均衡器主的keepalived配置文件内容如下
[root@lvs01~]#sed-n'1,30p'/etc/keepalived/keepalived.conf!ConfigurationFileforkeepalivedglobal_defs{notification_email{215379068@qq.com}notification_email_fromyunjisuansmtp_server127.0.0.1smtp_connect_timeout30router_idLVS01}vrrp_instanceVI_1{stateMASTERinterfaceeth0virtual_router_id55priority150advert_int1authentication{auth_typePASSauth_pass1111}virtual_ipaddress{192.168.0.240/24deveth0labeleth0:240}}LVS负载均衡器主的keepalived配置文件内容如下
[root@localhost~]#sed-n'1,30p'/etc/keepalived/keepalived.conf!ConfigurationFileforkeepalivedglobal_defs{notification_email{215379068@qq.com}notification_email_fromyunjisuansmtp_server127.0.0.1smtp_connect_timeout30router_idLVS02}vrrp_instanceVI_1{stateBACKUPinterfaceeth0virtual_router_id55priority100advert_int1authentication{auth_typePASSauth_pass1111}virtual_ipaddress{192.168.0.240/24deveth0labeleth0:240}}3.6添加LVS的负载均衡规则以下操作过程,在LVS主和备上完全一样
[root@lvs01~]#/etc/init.d/keepalivedstop#关闭主LVS的keepalived服务Stoppingkeepalived:[OK][root@lvs01~]#ipvsadm-Ln#没有ipvs规则IPVirtualServerversion1.2.1(size=4096)ProtLocalAddress:PortSchedulerFlags->RemoteAddress:PortForwardWeightActiveConnInActConn[root@lvs01~]#ipa|grep240#没有VIP[root@lvs01~]#/etc/init.d/keepalivedstart#启动keepalived服务Startingkeepalived:[OK][root@lvs01~]#ipvsadm-Ln#出现ipvs规则IPVirtualServerversion1.2.1(size=4096)ProtLocalAddress:PortSchedulerFlags->RemoteAddress:PortForwardWeightActiveConnInActConnTCP192.168.0.240:80rr->192.168.0.223:80Route100->192.168.0.224:80Route100[root@lvs01~]#ipa|grep240#出现VIPinet192.168.0.240/24scopeglobalsecondaryeth0:240附录:LVS集群分发请求RS不均衡生产环境实战解决生产环境中ipvsadm-L-n发现两台RS的负载不均衡,一台有很多请求,一台没有。并且没有请求的那台RS经测试服务正常,lo:VIP也有。但是就是没有请求。
IPVirtualServerversion1.2.1(size=4096)ProtLocalAddress:PortSchedulerFlags->RemoteAddress:PortForwardWeightActiveConnInActConnTCP192.168.0.240:80rrpersistent10->192.168.0.223:80Route100->192.168.0.224:80Route1812758问题原因:
persistent10的原因,persistent会话保持,当clientA访问网站的时候,LVS把请求分发给了52,那么以后clientA再点击的其他操作其他请求,也会发送给52这台机器。
解决办法:
到keepalived中注释掉persistent10然后/etc/init.d/keepalivedreload,然后可以看到以后负载均衡两边都均衡了。