当前位置: 首页 > 科技观察

用LVS+Keepalived实现负载均衡

时间:2023-03-17 23:17:08 科技观察

一、负载均衡:必不可少的基本手段1.1多找牛拉车目前互联网系统大多采用服务器集群技术,集群就是将相同的服务部署在多台服务器上形成一个集群作为一个整体对外提供服务。这些集群可以是Web应用服务器集群、数据库服务器集群、分布式缓存服务器集群等。古人云:一牛不能拉车,不求壮牛,二牛拉车。在实际应用中,web服务器集群之前总会有一个负载均衡服务器。负载均衡器的任务是作为Web服务器流量的入口,选择最合适的Web服务器,将客户端的请求转发给它处理。从客户端到真实服务器的透明转发。近几年非常流行的“云计算”和分布式架构,本质上是使用后端服务器作为计算资源和存储资源,由管理服务器打包成一个服务对外提供服务。客户端不需要关心实际的服务提供者。是哪台机器?从它的角度来看,它面对的似乎是一台拥有近乎无限能力的服务器。本质上,真正提供服务的是后端集群。1.2负载均衡的类型负载均衡可以使用硬件设备(比如经常听到的F5)或者软件负载。商用硬件负载设备成本通常较高(一套几十万上百万很正常),所以我们会在条件允许的情况下使用软件负载;软件加载解决的两个核心问题是:选择谁和转发,其中最流行的是LVS(LinuxVirtualServer)。传送门->关于负载均衡实现方法的介绍,请浏览我的另一篇博文:《大型网站技术架构》读书笔记六:永无止境的网站的可扩展性架构二。认识LVS:LinuxVirtualServer2.1LVS是LinuxVirtualServer的缩写,即LinuxVirtualServer。它是由张文松博士发起的一个免费软件项目。其官方网站是www.linuxvirtualserver.org。现在LVS已经是Linux标准内核的一部分。在Linux2.4内核之前,使用LVS时必须重新编译内核以支持LVS功能模块。不过从Linux2.4内核开始,LVS的各个功能模块已经全部内置。给内核打上任何补丁,就可以直接使用LVS提供的各种功能。2.2LVS的妙用LVS主要用于服务器集群的负载均衡。工作在网络层,可以实现高性能、高可用的服务器集群技术。它价格便宜,可以将许多低性能的服务器组合成一个超级服务器。它使用方便,配置非常简单,并且有多种负载均衡方式。稳定可靠,即使集群中某台服务器出现故障,也不会影响整体效果。另外,扩展性也很好。LVS自1998年起步以来,已经成为一个比较成熟的技术项目。LVS技术可用于实现高扩展性和高可用的网络服务,如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频/音频点播服务等,被众多知名网站所采用以及组织LVS搭建的集群系统,如:Linux门户网站(www.linux.com)、以提供RealPlayer音视频服务而闻名的Real公司(www.real.com)、全球最大的开源网站(sourceforge.net)等等。2.3LVS体系结构LVS构建的服务器集群系统由三部分组成:(1)前端负载均衡层,以LoadBalancer为代表;(2)中间的服务器集群层,以ServerArray为代表;(3)*最上层的数据共享存储层以SharedStorage为代表;从用户的角度来看,所有内部应用都是透明的,用户只是在使用虚拟服务器提供的高性能服务。传送门->架构的详细介绍请访问南飞蚂蚁的博客:http://ixdba.blog.51cto.com/2895551/5529472.4LVS负载均衡机制(1)LVS是四层负载均衡,即据说它建立在OSI模型的第四层——传输层之上。在传输层有我们熟悉的TCP/UDP。LVS支持TCP/UDP负载均衡。因为LVS是一个四层的负载均衡方案,相对于其他高层的负载均衡方案,比如DNS轮流解析域名,应用层负载调度,客户端调度等,效率是非常高的。(2)LVS转发主要是通过修改IP地址(NAT模式,分为源地址修改SNAT和目标地址修改DNAT),修改目标MAC(DR模式)来实现的。①NAT方式:网络地址转换NAT(NetworkAddressTranslation)是一种外部网络和内部网络地址映射的技术。在NAT模式下,传入和传出的网络数据报必须经过LVS处理。LVS需要充当RS(RealServer)的网关。当数据包到达LVS时,LVS进行目的地址转换(DNAT),将目的IP变为RS的IP。RS收到包后,好像是client直接发送的。当RS完成处理并返回响应时,源IP为RSIP,目的IP为客户端IP。此时RS的包通过网关(LVS)中转,LVS会进行源地址转换(SNAT),将包的源地址改为VIP,这样包在客户端看起来就好像是LVS直接返回。客户端无法感知后端RS的存在。②DR模式:在直接路由DR模式下,LVS和RS集群需要绑定同一个VIP(RS是通过绑定VIP到loopback实现的),但与NAT不同的是请求由LVS接受,而实际提供服务的服务器(RealServer,RS)则直接返回给用户,无需经过LVS。具体来说,当有请求到来时,LVS只需要将网络帧的MAC地址修改为某个RS的MAC,数据包就会转发给相应的RS进行处理。变化,LVS只是做了一点点缀。当RS收到LVS转发的包时,链路层发现MAC是自己的,网络上层发现IP也是自己的,所以合法接受包,RS无法感知LVS的存在它的前面。RS返回响应时,只需要直接返回源IP(即用户的IP)即可,无需经过LVS。(3)DR负载均衡模式下,数据分发过程中不修改IP地址,只修改mac地址。由于实际处理请求的真实物理IP地址与数据请求的目的IP地址是一致的,所以不需要通过负载均衡服务器进行地址转换。将响应数据包直接返回给用户浏览器,避免负载均衡服务器的网卡带宽成为瓶颈。因此,DR模式具有更好的性能,是目前大型网站使用最广泛的负载均衡方式。#p#3。搭建实战:LVS+Keepalived实现负载均衡3.1实验结构概述(一)本次基于VMwareWorkstation搭建了一个由四台Linux(CentOS6.4)系统组成的服务器集群,两台负载均衡服务器(一台为host)机,一台是备机),另外两台是真正的web服务器(对外提供http服务,这里只使用CentOS默认自带的http服务,没有安装Tomcat、Jexus等其他服务).(2)本实验基于DR负载均衡模式,设置一个VIP(VirtualIP)为192.168.80.200。用户只需访问该IP地址即可获得网页服务。其中,负载均衡主机为192.168.80.100,备机为192.168.80.101。Web服务器A为192.168.80.102,Web服务器B为192.168.80.103。3.2基本准备下面的任务是针对所有服务器的,也就是说四台服务器都要配置:(1)在绑定静态IP地址的命令模式下,可以执行setup命令进入设置界面进行配置静态IP地址;x-window界面中,可以右击网络图标进行配置;配置完成后,执行servicenetworkrestart重启网络服务;验证:执行命令ifconfig(2)设置主机名①修改当前会话中的主机名,执行命令hostnamexxxx(其中xxxx是你要更改的名字)②修改配置文件中的主机名,执行命令vi/etc/sysconfig/network(√一般需要做这一步才能完全改变主机名)验证:重启系统reboot(3)IP地址与主机名的绑定执行命令vi/etc/hosts,并添加一行内容,如下(以下从节点以自己为准,本实验搭建两个从节点):192.168.80.100lvs-master192。168.80.101lvs-slave#以下是本次测试的两个真实服务器节点192.168.80.102lvs-webserver1192.168.80.103lvs-webserver2保存后退出验证:pinglvs-master(4)关闭防火墙①执行命令关闭防火墙:serviceiptablesstop验证:serviceiptablesstauts②执行关闭防火墙自动运行命令:chkconfigiptablesoff验证:chkconfig--list|grepiptables3.3配置两台web服务器以下操作需要在两台角色为web服务器的web服务器上进行,不需要在负载均衡服务器中进行操作:(1)打开http服务命令:servicehttpdstart补充:chkconfighttpdon-->sethttpdasaself-startingservice(2)访问宿主机上的网页并上传定义网页:这里上传一个静态网页,通过更改html来区分两个web服务器,如图以下图为例,其中一个显示来自192.168.80.102,另一个显示来自192.168.80.103;(3)编辑realserver脚本文件①进入指定文件夹:cd/etc/init.d/②编辑脚本文件:vimrealserverSNS_VIP=192.168.80.200/etc/rc.d/init.d/functionscase"$1"instart)ifconfiglo:0$SNS_VIPnetmask255.255.255.255broadcast$SNS_VIP/sbin/routeadd-host$SNS_VIPdevlo:0echo"1">/proc/sys/net/ipv4/conf/lo/arp_ignoreecho"2">/proc/sys/net/ipv4/conf/lo/arp_announceecho"1">/proc/sys/net/ipv4/conf/all/arp_ignoreecho"2">/proc/sys/net/ipv4/conf/all/arp_announcesysctl-p>/dev/null2>&1echo"RealServerStartOK";;stop)ifconfiglo:0下行路线del$SNS_VIP>/dev/null2>&1echo"0">/proc/sys/net/ipv4/conf/lo/arp_ignoreecho"0">/proc/sys/net/ipv4/conf/lo/arp_announceecho"0">/proc/sys/net/ipv4/conf/all/arp_ignoreecho"0">/proc/sys/net/ipv4/conf/all/arp_announceecho"RealServerStoped";;*)echo"Usage:$0{start|stop}"exit1esacexit0这里我们设置虚拟IP为:192.168.80.200③保存脚本文件,修改文件权限:chmod755realserver④启动realserver服务:servicerealserverstart3.4配置主负载服务器(1)安装keepalived相关包yuminstall-ykeepalived在CentOS下,可以通过yuminstall命令轻松安装软件包,但前提是你的虚拟机必须连接到上网;(2)编辑keepalived.conf配置文件①进入keepalived.conf所在目录:cd/etc/keepalived②首先清除keepalived原来的配置:>keepalived.conf③重新编辑keepalived配置文件:vikeepalived.confglobal_defs{notification_email{edisonchou@hotmail.com}notification_email_fromsns-lvs@gmail.comsmtp_server192.168.80.1smtp_connection_timeout30router_idLVS_DEVEL#设置lvs的id,在一个网络中应该是唯一的}vrrp_instanceVI_1{stateMASTER#指定Keepalived的角色,MASTER是master,BACKUP是backup接口eth1#指定Keepalived的角色是master,BACKUP是backupvirtual_router_id51#虚拟路由号,master和backup必须一致priority100#定义优先级,数字越大优先级越高,primaryDR必须大于standbyDRadvert_int1#checkinterval,defaultfor1sauthentication{auth_typePASSauth_pass1111}virtual_ipaddress{192.168.80.200#定义虚拟IP(VIP)为192.168.2.33,可以设置多个,每行一个}}#定义对外提供服务的LVSVIP和portvirtual_server192.168.80.20080{delay_loop6#设置健康检查时间,单位为秒lb_algowrr#设置负载调度算法为wlclb_kindDR#设置LVS实现负载的机制,有NAT、TUN、DR三种模式nat_mask255.255.255.0persistence_timeout0protocolTCPreal_server192.168.80.10280{#指定realserver1的IP地址weight3#配置节点权重,数字越大权重越高TCP_CHECK{connect_timeout10nb_get_retry3delay_before_retry3connect_port80}}real_server192.168.80.10380{#指定realserver2的IP地址weight3#配置节点权重,数字越大权重越高TCP_CHECK{connect_timeout10nb_get_retry3delay_before_retry3connect_port80}}}(3)开启keepalived服务servicekeepalivedstart#p#3.5配置从负载服务器从负载服务器与主负载服务器大致相同,但在keepalived配置文件中需要更改以下两点:(1)ChangethestatefromMASTERtoChangepriorityfrom100to99forBACKUP(2)vrrp_instanceVI_1{stateBACKUP#此处更改为BACKUPinterfaceeth1virtual_router_id51priority99#此处更改为99,master优先级为100advert_int1authentication{auth_typePASSauth_pass1111}virtual_ip92address{81.80.200}}3.6验证测试(1)均衡转发指定请求:由于两台web服务器的权重相同,因此会依次转发给两台web服务器;(2)当web服务器出现故障时:①A出现故障后,只从B获取服务;这里模拟192.168.80.102故障,暂停其http服务:servicehttpdstop我们看一下此时从外部访问VIP时,只会从192.168.80.103获取网页:②A故障修复后,获得A的服务;到这里模拟192.168.80.102修复完成,重启它的http服务:servicehttpdstart看看此时从外部访问vip,可以从192.168.80.102获取网页:(3)当主负载均衡服务器出现故障,备机立即充当主机角色提供请求转发服务:这里模拟192.168。为了采用软件负载均衡方案,这次在一些大型企业级系统和互联网系统中应用,简单了解一下LVS,在Linux下搭建一个小测试环境,使用Keepalived实现一个最小负载均衡测试环境。LVS是一个可以工作在网络第四层的负载均衡软件,所以相对于工作在第七层的Nginx等负载均衡软件有着无可比拟的性能优势,也是我国的张文松博士(现在阿里副总裁,淘宝技术专家)作为创始人发起,现已成为Linux内核不可或缺的一部分。当然,在目前流行的LVS方案中,Web服务器端也采用了Nginx+Tomcat的搭配方式,静态文件和动态文件分开处理,也是一种有效的尝试。在接下来的日子里,我会尝试用Jexus在Linux下运行ASP.NETMVC项目,试试Linux下.NET项目的运行效果。我希望到那时我可以分享一些东西。好了,今天不写了。参考文献(1)王晨春,《Web基础架构:负载均衡和LVS》:http://www.importnew.com/11229.html(2)win_xp,《LVS简介及使用》:http://www.cnblogs.com/codebean/archive/2011/07/25/2116043.html(3)jiwang1980,《LVS+Keepalived》:http://7567567.blog.51cto.com/706378/578289(4)南飞蚂蚁的博客,《Linux负载均衡软件LVS之概念篇》:http://ixdba.blog.51cto.com/2895551/552947(***王者王国,《四层和七层负载均衡的区别》:http://kb.cnblogs.com/page/188170/