admin 管理员组

文章数量: 887021


2023年12月22日发(作者:linux系统怎么安装字体)

入门。笔记。LVS集群中的IP负载均衡技术介绍NLB是Windows下网络负载平衡技术。它可以保证几台win机器之间,通过配置后,利用广播或组播方式,使得虚拟ip地址同时均匀的分布在每台或者指定的几台win机器上,从而实服务器现网络负载。相信这个大家都比较熟。但我们今天讨论的是Linux下的情况。问题就在于:Linux中有类似windows的nlb的技术吗?有又如何实现的呢?答案肯定是肯定的。不但有,而且很多。除了我们今天要讲的LVS外,还有LNLB、HAproxy、Pound等第三方Linux软件。接下来我们来看一幅LVS虚拟服务拓扑图:这张图所展示的,内容很简单的:就是终端通过网络连接到一台平衡服务器上,然后平衡服务器将终端的连接,转发给LAN网或WAN网中服务器。简单的1Chenyp1023@

入门。笔记。说,这就是LVS的基本原理。LVS简单吧!在LVS项目中,把图中的前置平衡服务器称之为DirectorServer(DR),后置的实际服务器称之为RealServer(RS)。看着这拓扑案例图,也许,大家很快就想到一个问题:DR机宕了怎么办?不就OVER了吗?是啊!这涉及到一个HA(High-Availability)高可用性问题。要保证DR服务器的冗余安全,可采用Heartbeat建主备来解决此问题。但HA的问题,我们不打算在这里讨论。另外一个问题也许你想到了,也许你还没留意到。那就是重定向问题,如何保证DirectorService能将来自同一个Client的请求发给同一个RealServer呢?LVS可通过服务Persistent参数来设置。那问题是,“来自同一个客户”是基于IP的客户端还是基于浏览器客户端的Cookie呢?LVS还有另一参数[-Mnetmask]。所以说应该是基于源地址.它指出源地址的匹配方式。-p900-M255.255.255.0就是掩码后网络地址相同的请求使用同一个模板。***********************************************************************************关于MAN命令中对-P和-M参数的说明。ipvsadm-A-tvip:port-sscheduler-ppersisten-time-p,--persistent[timeout]optionisspecified,multiplerequestsfromacally,thetimeoutofpersistentsessionsmaybespecifiedgiveninseconds,tionmaybeusedinconjunctionwithprotocolssuchasSSLorFTPwherei:IfavirtualserviceistohandleFTPconnectionsthenpersistencemustbesetforthevirtualse-queradingisusedinconjunctionwithanFTPservicethanper-sistenceisnotnecessary,buttheip_vs_ftpkernelmodulemust2Chenyp1023@

入门。笔记。dulemaybemanuallyinsertedintothekernelusinginsmod(8).-M,--netmasknetmaskSpecifythegrarceaddressoftherequestismaskedwaultis255.255.255.255,thatis,ecificnetmasksmaybeusedtoresolveproblemswithnon-persistentcacheclustersontheclientside.**************************************************************************************除了“HA”、重定向问题外,还有一个平衡算法或我们常说“动态平衡”问题,也就说RS服务器也许高低配置不同,负载能力不一样。这就需要LVS不能简单的,将轮询分载终端的连接。关于这个,LVS项目提供了IPVS调度器实现了八种负载调度算法。其中默认的是:加权轮询(WeightedRoundRobin)。加权轮询就是:调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。*****************************************************关于八种负载调度算法1.轮叫(RoundRobin)调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。2.加权轮叫(WeightedRoundRobin)调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。3.最少链接(LeastConnections)调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。4.加权最少链接(WeightedLeastConnections)在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均3Chenyp1023@

入门。笔记。衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。5.基于局部性的最少链接(Locality-BasedLeastConnections)"基于局部性的最少链接"调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务器,将请求发送到该服务器。6.带复制的基于局部性最少链接(Locality-BasedLeastConnectionswithReplication)"带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。7.目标地址散列(DestinationHashing)"目标地址散列"调度算法根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。8.源地址散列(SourceHashing)"源地址散列"调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。***********************************************************如果你想更多、更深入了解LVS项目的话,可看章文嵩博士写的关于“LVS项目介绍”/zh/***********************************************************关于章文嵩博士章文嵩博士,开放源码及Linux内核的开发者,著名的Linux集群项目--LVS(LinuxVirtualServer)的创始人和主要开发人员。他目前工作于国家并行与分布式处理重点实验室,主要从事集群技术、操作系统、对象存储与数据库的研究。他一直在自由软件的开发上花费大量时间,并以此为乐。***********************************************************好了。最后一个需要说明问题就是:实现如上图的网络负载,LVS项目中有三种IP负载平衡模式可以实现。也就是模式有三种。4Chenyp1023@

入门。笔记。第一种NAT模式VirtualServerviaNetworkAddressTranslation(VS/NAT)。效力最低。第二种IP隧道模式VirtualServerviaIPTunneling(VS/TUN)。真实服务器(RS)需要在同一网段。第三种直接路由模式VirtualServerviaDirectRouting(VS/DR)。更多关于三种模式的原理,我们可参考一下一位名叫“duran”网友的解释。关于IPVS的三种模式原理模式NAT用法本来是因为网络IP地址不足而把内部保留IP地址通过映射转换成公网地址的一种上网方式(原地址NAT)。如果把NAT的过程稍微变化,就可以成为负载均衡的一种方式。原理其实就是把从客户端发来的IP包的IP头目的地址在DR上换成其中一台REALSERVER的IP地址并发至此REALSERVER,而REALSERVER则在处理完成后把数据经过DR主机发回给客户端,DR在这个时候再把数据包的原IP地址改为DR接口上的IP地址即可。期间,无论是进来的流量,还是出去的流量,都必须经过DR。隧道模式隧道模式则类似于VPN的方式,使用网络分层的原理,在从客户端发来的数据包的基础上,封装一个新的IP头标记(不完整的IP头,只有目的IP部)发给REALSERVER,REALSERVER收到后,先把DR发过来的数据包的头给解开,还原其数据包原样,处理后,直接返回给客户端,而不需要再经过DR。需要注意的是,由于REALSERVER需要对DR发过来的数据包进行还原,也就是说必须支持IPTUNNEL协议。所以,在REALSERVER的内核中,必须编译支持IPTUNNEL这个选项。IPTUNNEL也在Networkingoptions里面,如下图所示。1.2.3.直接路由模式直接路由模式比较特别,很难说和什么方面相似,前2种模式基本上都是工作在网络层上(三层),而直接路由模式则应该是工作在数据链路层上(二层)。其原理为,DR和REALSERVER都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有REALSERVER对本身这个IP的ARP请求保持静默。5Chenyp1023@

入门。笔记。也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的REALSERVER,把目的MAC地址改为REALSERVER的MAC并发给这台REALSERVER。这时REALSERVER收到这个数据包,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。由于DR要对二层包头进行改换,所以DR和REALSERVER之间必须在一个广播域,也可以简单的理解为在同一台交换机上。介绍的差不多了。最后我选择一种服务来配置一下。Windows中我们常用NLB来分载终端RDP连接。Linux中常采用Telnet和SSH来登录办公或管理。以下我就选取Telnet来配置吧。比较简单。对于配置LVS来说,不同服务只在于端口的不同。在配置LVS之前,先说明一下LVS的安装问题:linuxkernel2.6的都不需要打补丁。只需安装ipvsadm就好了。如:UbuntuLinux#apt-getinstallipvsdmIPVS(ipvsadm)只对DR需要,而RS则不需要。DR只限于linux系统,RS除了支持各种版本的Linux系统外,还可支持Windows系统。关于Linux支持IPVS问题2.6及以上内核中已经支持了IPVS功能。至于2.4的内核则看版本,2.4.23及以上的内核已经有了ipvs,所以不必且不能打包,如果打了就会编译出错。对于2.4.23以下内核则必须打IPVS补丁。2.4.23/24的内核有问题,所以不建议使用这两种内核。以LVS-DR模式为例:(服务以telnet为例),用例采用单网卡。实际应用中通常使用双网卡。单双网卡都行。配置案例节选网上案例,但已验证过。6Chenyp1023@

入门。笔记。ClientClientIP:10.70.101.100||||VirtualIP:eth0:0IP10.71.101.230/32DirectorDirecotorIP:eth0IP10.71.101.220/24|-------------||RealServer1VirtualIP:eth0:0IP10.71.101.230/32(hiddenarp)|RealIP:eth0IP10.71.101.221/24|------------||RealServer2VirtualIP:eth0:0IP10.71.101.230/32(hiddenarp)|RealIP:eth0IP10.71.101.222/24|------------|RealServer3VirtualIP:eth0:0IP10.71.101.230/32(hiddenarp)RealIP:eth0IP10.71.101.223/24***irectorServer:配置DR需在/etc/中编辑配置文件:_forward=1#打开IP转发#ipvsadm–C#清除ipvsadm记录表#ifconfigeth010.71.101.220netmask255.255.255.0broadcast10.71.101.255#ifconfigeth0:010.71.101.230netmask255.255.255.255broadcast10.71.101.230#routeadd-ho–t10.71.101.230gw10.71.101.230#ipvsadm-A–t–0.71.101.230:23-s–lc-p–000#ipvsadm-a–t–0.71.101.230:23-r–0.71.101.221-g–w–#ipvsadm-a–t–0.71.101.230:23-r–0.71.101.222-g–w–#ipvsadm-a–t–0.71.101.230:23-r–0.71.101.223-g–w–保存配置命令为:#ipvsadm–SDR模式需建立网卡,放在etho或lo都行。Tunl模式需启动tunl虚拟网卡,如ifconfigtunlipaddressnetmaskup命令详解:7Chenyp1023@

入门。笔记。-A增加一个虚拟服务,该服务由协议、IP地址和端口号组成,如:ipvsadm-A–t–ip:port-s–cheduler-p–ersisten-time其中“-t”表示tcp协议“-P”参数表示为:指定多次时间内,来着同一个客户的多次请求,被同一台真实的服务器处理。默认为:300秒。-s指定服务采用的算法。默认为:wlc(加权轮询算法)。-a表示往一个服务内增加一个realserver-r指定realserver的IP地址-w表示权重-g表示使用DR方式,-m表示NAT方式,-i表示tunneling方式在虚拟机环境中NAT方式,不一定能做成功。配置RealServer:在RealServer1上作的设置(其他的RealServer的配置类似),除了配置telnet服务之外:#ifconfigeth010.71.101.221netmask255.255.255.0broadcast10.71.101.255#echo0>/proc/sys/net/ipv4/conf/all/hidden#echo0>/proc/sys/net/ipv4/conf/eth0/hidden#ifconfigeth0:010.71.101.230netmask255.255.255.255broadcast10.71.101.230#routeadd-ho–t10.71.101.230gw10.71.101.230命令详解:#echo0>/proc/sys/net/ipv4/conf/all/hidden#echo0>/proc/sys/net/ipv4/conf/eth0/hidden8Chenyp1023@

入门。笔记。关于hidden命令,需打hidden补丁并编译才能执行。至于为什么需要执行这命令,有兴趣可以看一下以下描述。解决noarp问题,我查了一下,大概有三种解决方法:第一种采用hidden方式,但需要编辑内核。以上案例就采用此方法。这一种方式,具体怎么编译noarp,我也不太懂,但这种方式是最好的。第二种采用arp_ignor、arp_annouce方式,我在验证配置中就采用此方法。第三种采用arptables绑定的方式,比较简单。听说不是很稳定。***S的NOARP问题解决直接路由模式肯定要处理NOARP的问题,官方文档《LVS-mini-HOWTO》3.7节指出在如下情况下必须处理:IF((youareusingLVS-DRorLVS-Tunonthedirector)AND(youarerunningaLinux2.2.x,2.4.x,lonarealserver)AND(theVIPontherealserverisonaneththernetviceeglo:0,tunl0:stotheVIParenotbeingacceptedbytransparentproxy)AND(therealserverscananswerarprequestsfromtheclient/router(therealserversareonthesamepieceofwire|network|segmentasthedirector)))THEN{YOUMUSTHANDLETHEARPPROBLEM}FI对于这断话的,我不太理解。下面引用其它的文档说明。在使用LVS中的DR与IPTunnel的时候,会需要有一块网络卡要设定两个IP的情形,但是Linux在2.2.14之后,就将eth0:1的-NOARP这个FLAG关闭。也就是说在kernel2.2.14以后,eth0:1就视为eth0的别名,任何对eth0:1的设定也同样作用在eth0,换句话说,我对eth0:1下-NOARP,同样也会对eth0有作用,这样会使得整张网络卡收不到封包。在直接路由、IP隧道模式下,因为我所有的机器都放在同一个网段,当该网段的Router接收到客户端(Client)对虚拟IP(VirtualIP)的TCPconnection要求时,会先在网段中利用Arprequest询问谁有VIP的地址,而包含Director与RealServers上所有的interface(不管Primary还是Subinterface),只要他有那个ip,都会发送arpreply回去,造成网段内所有拥有VirtualIP的interface都会reply给Router,最后结果就是看谁的速度快,Router就将该封包送给谁,如此会造成LVS的Server并无法发挥其效果,因此需要利用hidden这个pattch,将Subinterface上的VirtualIP给隐藏起来,如此他就不会对ArpRequest进行Reply,如此就可以解决ARP的问题,而这个NOARP的问题,kernel发展小组认为不重要,所以以后都不会修改,要用请自行编译。9Chenyp1023@

入门。笔记。所以从/~ja/#hidden下载对应的补丁,对于2.6.8.1的内核我选择。/usr/src/linuxcd/usr/src/linuxpatch–p1/proc/sys/net/ipv4/conf/all/arp_announce不过我在2.6.8.1的内核中试了一下好像不行。Lvs把包固定发给了rs1这台机器,估计rs1arpreply响应最快。****************************************************************************************测试LVS查看LVS的连接情况:ipvsadm–L–n查看LVS的吞吐量情况:ipvsadm–L–n–rate查看LVS的统计信息:ipvsadm–L–n–stat来自同一终端,交有同一RD机处理:10Chenyp1023@

入门。笔记。Chenyp1023@注:测试中的截图,非按以上案例配置的。2009-9-1911


本文标签: 服务器 调度 请求 问题 IP地址