天天看点

集群之LVSLVS

所需要的软件:

从Linux内核版本2.6起,ip_vs code已经被整合进了内核中,因此,只要在编译内核的时候选择了ipvs的功能,您的Linux即能支持LVS。Linux 2.4.23以后的内核版本也整合了ip_vs code,但如果是更旧的内核版本,您得自己手动将ip_vs code整合进内核原码中,并重新编译内核方可使用lvs。

一、关于ipvsadm:

ipvsadm是运行于用户空间、用来与Ipvs交互的命令行工具,它的作用表现在:

1、定义在Director上进行dispatching的服务(service),以及用此服务器(server)用来提供此服务;

2、为每台同时提供某一种服务的服务器定义其权重(即概据服务器性能确定的其承担负载的能力);

注:权重用整数来表示,有时候也可以将其设置为atomic_t;其有效表示值范围为24bit整数空间,即(2^24-1);

因此,ipvsadm命令的主要作用表现在以下方面:

1、添加服务(通过设定其权重>0);

2、关闭服务(通过设定其权重>0);此应用场景中,已经连接的用户将可以继续使用此服务,直到其退出或超时;新的连接请求将被拒绝;

3、保存ipvs设置,通过使用“ipvsadm-sav > ipvsadm.sav”命令实现;

4、恢复ipvs设置,通过使用“ipvsadm-sav < ipvsadm.sav”命令实现;

5、显示ip_vs的版本号,下面的命令显示ipvs的hash表的大小为4k;

# ipvsadm

    IP Virtual Server version 1.2.1 (size=4096)

6、显示ipvsadm的版本号

# ipvsadm --version

   ipvsadm v1.24 2003/06/07 (compiled with popt and IPVS v1.2.0)

二、ipvsadm使用中应该注意的问题

默认情况下,ipvsadm在输出主机信息时使用其主机名而非IP地址,因此,Director需要使用名称解析服务。如果没有设置名称解析服务、服务不可用或设置错误,ipvsadm将会一直等到名称解析超时后才返回。当然,ipvsadm需要解析的名称仅限于RealServer,考虑到DNS提供名称解析服务效率不高的情况,建议将所有RealServer的名称解析通过/etc/hosts文件来实现;

三、调度算法

Director在接收到来自于Client的请求时,会基于"schedule"从RealServer中选择一个响应给Client。ipvs支持以下调度算法:

1、轮询(round robin, rr),加权轮询(Weighted round robin, wrr)——新的连接请求被轮流分配至各RealServer;算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。轮叫调度算法假设所有服务器处理性能均相同,不管服务器的当前连接数和响应速度。该算法相对简单,不适用于服务器组中处理性能不一的情况,而且当请求服务时间变化比较大时,轮叫调度算法容易导致服务器间的负载不平衡。

2、最少连接(least connected, lc), 加权最少连接(weighted least connection, wlc)——新的连接请求将被分配至当前连接数最少的RealServer;最小连接调度是一种动态调度算法,它通过服务器当前所活跃的连接数来估计服务器的负载情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中止或超时,其连接数减一。

3、基于局部性的最少链接调度(Locality-Based Least Connections Scheduling,lblc)——针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群中客户请求报文的目标IP地址是变化的。这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和主存Cache命中率,从而整个集群系统的处理能力。LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于其一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。

4、带复制的基于局部性最少链接调度(Locality-Based Least Connections with Replication Scheduling,lblcr)——也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而 LBLC算法维护从一个目标IP地址到一台服务器的映射。对于一个“热门”站点的服务请求,一台Cache 服务器可能会忙不过来处理这些请求。这时,LBLC调度算法会从所有的Cache服务器中按“最小连接”原则选出一台Cache服务器,映射该“热门”站点到这台Cache服务器,很快这台Cache服务器也会超载,就会重复上述过程选出新的Cache服务器。这样,可能会导致该“热门”站点的映像会出现在所有的Cache服务器上,降低了Cache服务器的使用效率。LBLCR调度算法将“热门”站点映射到一组Cache服务器(服务器集合),当该“热门”站点的请求负载增加时,会增加集合里的Cache服务器,来处理不断增长的负载;当该“热门”站点的请求负载降低时,会减少集合里的Cache服务器数目。这样,该“热门”站点的映像不太可能出现在所有的Cache服务器上,从而提供Cache集群系统的使用效率。LBLCR算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组;按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载;则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

5、目标地址散列调度(Destination Hashing,dh)算法也是针对目标IP地址的负载均衡,但它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

6、源地址散列调度(Source Hashing,sh)算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同。除了将请求的目标IP地址换成请求的源IP地址外,它的算法流程与目标地址散列调度算法的基本相似。在实际应用中,源地址散列调度和目标地址散列调度可以结合使用在防火墙集群中,它们可以保证整个系统的唯一出入口。

四、关于LVS追踪标记fwmark:

如果LVS放置于多防火墙的网络中,并且每个防火墙都用到了状态追踪的机制,那么在回应一个针对于LVS的连接请求时必须经过此请求连接进来时的防火墙,否则,这个响应的数据包将会被丢弃。

查看LVS上当前的所有连接

<code># ipvsadm -Lcn</code>

或者

<code>#cat /proc/net/ip_vs_conn</code>

查看虚拟服务和RealServer上当前的连接数、数据包数和字节数的统计值,则可以使用下面的命令实现:

<code># ipvsadm -l --stats</code>

查看包传递速率的近似精确值,可以使用下面的命令:

<code># ipvsadm -l --rate</code>

安装:

解决依赖关系后,安装ipvsadm

<code>yum </code><code>install</code> <code>ipvsadm</code>

VS/NAT

LVS-NAT基于cisco的LocalDirector。VS/NAT不需要在RealServer上做任何设置,其只要能提供一个tcp/ip的协议栈即可,甚至其无论基于什么OS。基于VS/NAT,所有的入站数据包均由Director进行目标地址转换后转发至内部的RealServer,RealServer响应的数据包再由Director转换源地址后发回客户端。 

VS/NAT模式不能与netfilter兼容,因此,不能将VS/NAT模式的Director运行在netfilter的保护范围之中。现在已经有补丁可以解决此问题,但尚未被整合进ip_vs code。

<a href="http://s4.51cto.com/wyfs02/M02/89/DE/wKioL1ggM0nxw3ApAAAUxB6PGgA021.png" target="_blank"></a>

设置VS/NAT模式的LVS(这里以web服务为例)

Director:

建立服务

<code># ipvsadm -A -t VIP:PORT -s rr</code>

如:

<code># ipvsadm -A -t 192.168.0.220:80 -s rr</code>

设置转发:

<code># ipvsadm -a -t VIP:PORT -r RIP_N:PORT -m -w N</code>

如:

<code># ipvsadm -a -t 192.168.0.220:80 -r 192.168.10.2 -m -w 1</code>

<code># ipvsadm -a -t 192.168.0.220:80 -r 192.168.10.3 -m -w 1</code>

打开路由转发功能

<code># echo "1" &gt; /proc/sys/net/ipv4/ip_forward</code>

服务控制脚本:

<code>#!/bin/bash</code>

<code>#</code>

<code># chkconfig: - 88 12</code>

<code># description: LVS script for VS/NAT</code>

<code>. </code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/functions</code>

<code>VIP=192.168.0.219</code>

<code>DIP=192.168.10.10</code>

<code>RIP1=192.168.10.11</code>

<code>RIP2=192.168.10.12</code>

<code>case</code> <code>"$1"</code> <code>in</code>

<code>start)           </code>

<code>  </code><code>/sbin/ifconfig</code> <code>eth0:1 $VIP netmask 255.255.255.0 up</code>

<code># Since this is the Director we must be able to forward packets</code>

<code>  </code><code>echo</code> <code>1 &gt; </code><code>/proc/sys/net/ipv4/ip_forward</code>

<code># Clear all iptables rules.</code>

<code>  </code><code>/sbin/iptables</code> <code>-F</code>

<code># Reset iptables counters.</code>

<code>  </code><code>/sbin/iptables</code> <code>-Z</code>

<code># Clear all ipvsadm rules/services.</code>

<code>  </code><code>/sbin/ipvsadm</code> <code>-C</code>

<code># Add an IP virtual service for VIP 192.168.0.219 port 80</code>

<code># In this recipe, we will use the round-robin scheduling method. </code>

<code># In production, however, you should use a weighted, dynamic scheduling method. </code>

<code>  </code><code>/sbin/ipvsadm</code> <code>-A -t $VIP:80 -s rr</code>

<code># Now direct packets for this VIP to</code>

<code># the real server IP (RIP) inside the cluster</code>

<code>  </code><code>/sbin/ipvsadm</code> <code>-a -t $VIP:80 -r $RIP1 -m</code>

<code>  </code><code>/sbin/ipvsadm</code> <code>-a -t $VIP:80 -r $RIP2 -m</code>

<code>  </code> 

<code>  </code><code>/bin/touch</code> <code>/var/lock/subsys/ipvsadm</code><code>.lock</code>

<code>;;</code>

<code>stop)</code>

<code># Stop forwarding packets</code>

<code>  </code><code>echo</code> <code>0 &gt; </code><code>/proc/sys/net/ipv4/ip_forward</code>

<code># Reset ipvsadm</code>

<code># Bring down the VIP interface</code>

<code>  </code><code>ifconfig</code> <code>eth0:1 down</code>

<code>  </code><code>rm</code> <code>-rf </code><code>/var/lock/subsys/ipvsadm</code><code>.lock</code>

<code>status)</code>

<code>  </code><code>[ -e </code><code>/var/lock/subsys/ipvsadm</code><code>.lock ] &amp;&amp; </code><code>echo</code> <code>"ipvs is running..."</code> <code>|| </code><code>echo</code> <code>"ipvsadm is stopped..."</code>

<code>*)</code>

<code>  </code><code>echo</code> <code>"Usage: $0 {start|stop}"</code>

<code>esac</code>

本文转自 SoulMio 51CTO博客,原文链接:http://blog.51cto.com/bovin/1870230,如需转载请自行联系原作者