LVS原理详解以及部署

Posted kn-zheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LVS原理详解以及部署相关的知识,希望对你有一定的参考价值。

linux virtual server简称LVS,Internet的快速增长使多媒体网络服务器面对的访问数量快速增加,服务器需要具备提供大量并发访问服务的能力,因此对于大负载的服务器来讲, CPU、I/O处理能力很快会成为瓶颈。由于单台服务器的性能总是有限的,简单的提高硬件性能并不能真正解决这个问题。为此,必须采用多服务器和负载均衡技术才能满足大量并发访问的需要。Linux 虚拟服务器(Linux Virtual Servers,LVS) 使用负载均衡技术将多台服务器组成一个虚拟服务器。它为适应快速增长的网络访问需求提供了一个负载能力易于扩展,而价格低廉的解决方案。lvs的负载能力特别强,优化空间特别大,lvs的变种DPVS据说是lvs性能的几倍,由爱奇艺开发,并广泛用于爱奇艺IDC。其他负载均衡服务器还有nginx,haproxy,F5,Netscale。

二、LVS基本原理


 

  1. 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间。
  2. PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链。
  3. IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链。
  4. POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器。

三、LVS组成


 

LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。

  1. IPVS(ip virtual server):一段代码工作在内核空间,叫IPVS,是真正生效实现调度的代码。IPVS的总体结构主要由IP包处理、负载均衡算法、系统配置与管理三个模块及虚拟服务器与真实服务器链表组成。
  2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,即IPVS管理器,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)。

四、LVS技术术语


 

  • DS:Director Server。指的是前端负载均衡器节点。
  • RS:Real Server。后端真实的工作服务器。
  • VIP:Virtual IP,向外部直接面向用户请求,作为用户请求的目标的IP地址。
  • DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
  • RIP:Real Server IP,后端服务器的IP地址。
  • CIP:Client IP,访问客户端的IP地址。

五、LVS工作模式和原理


 

5.1、NAT模式

5.1.1、NAT模式工作原理

  1. 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP。
  2. PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
  3. IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP。
  4. POSTROUTING链通过选路,将数据包发送给Real Server
  5. Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP。
  6. Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。

5.1.2、NAT特性

  • RIP最好是内网IP
  • RS的网关必须指向DIP。
  • DIP和RIP必须在同一个网段内。
  • 请求和回应的报文都必须经过director,director容易成为瓶颈。
  • nat支持端口转发。

5.2、DR模式

5.2.1、DR模式工作原理

  1. 首先用户用CIP请求VIP。
  2. 根据上图可以看到,不管是Director Server还是Real Server上都需要配置相同的VIP,那么当用户请求到达我们的集群网络的前端路由器的时候,请求数据包的源地址为CIP目标地址为VIP,此时路由器会发广播问谁是VIP,那么我们集群中所有的节点都配置有VIP,此时谁先响应路由器那么路由器就会将用户请求发给谁,这样一来我们的集群系统是不是没有意义了,那我们可以在网关路由器上配置静态路由指定VIP就是Director Server,或者使用一种机制不让Real Server 接收来自网络中的ARP地址解析请求,这样一来用户的请求数据包都会经过Director Servrer。
  3. 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP。
  4.  PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
  5.  IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
  6.  由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
  7.  RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
  8. 响应报文最终送达至客户端。

5.2.2、配置DR有三种方式:

第一种方式:

在路由器上明显说明vip对应的地址一定是Director上的MAC,只要绑定,以后再跟vip通信也不用再请求了,这个绑定是静态的,所以它也不会失效,也不会再次发起请求,但是有个前提,我们的路由设备必须有操作权限能够绑定MAC地址,万一这个路由器是运行商操作的,我们没法操作怎么办?第一种方式固然很简便,但未必可行。

第二种方式:

在给别主机上(例如:红帽)它们引进的有一种程序arptables,它有点类似于iptables,它肯定是基于arp或基于MAC做访问控制的,很显然我们只需要在每一个real server上定义arptables规则,如果用户arp广播请求的目标地址是本机的vip则不予相应,或者说相应的报文不让出去,很显然网关(gateway)是接受不到的,也就是director相应的报文才能到达gateway,这个也行。第二种方式我们可以基于arptables。

第三种方式:

在相对较新的版本中新增了两个内核参数(kernelparameter),第一个是arp_ignore定义接受到ARP请求时的相应级别;第二个是arp_announce定义将自己地址向外通告时的通告级别。【提示:很显然我们现在的系统一般在内核中都是支持这些参数的,我们用参数的方式进行调整更具有朴实性,它还不依赖于额外的条件,像arptables,也不依赖外在路由配置的设置,反而通常我们使用的是第三种配置】

arp_ignore:定义接受到ARP请求时的相应级别

0:  只要本地配置的有相应地址,就给予响应。(默认)

1:  仅回应目标IP地址是本地的入网地址的arp请求。

2:  仅回应目标IP地址是本地的入网地址,而且源IP和目标IP在同一个子网的arp请   求。

3:  不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应

4-7:保留未使用

8:  不回应所有的arp请求。

arp_announce:定义将自己地址向外通告是的通告级别;

0:    将本地任何接口上的任何地址向外通告

1:  试图仅向目标网络通告与其网络匹配的地址

2:  仅向与本地接口上地址匹配的网络进行通告

5.2.3、DR特性

  • 特点1:保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS。
  • Director和RS的VIP为同一个VIP。
  • RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问。
  • RS跟Director Server必须在同一个物理网络中。
  • 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server。
  • 不支持地址转换,也不支持端口映射
  • RS可以是大多数常见的操作系统
  • RS的网关绝不允许指向DIP(因为我们不允许他经过director)
  • RS上的lo接口配置VIP的IP地址
  • DR模式是市面上用得最广的。
  • 缺陷:RS和DS必须在同一机房中

 

补充:特点1的解决方法

  1. 在前端路由器做静态地址路由绑定,将对于VIP的地址仅路由到Director Server。存在问题:用户未必有路由操作权限,因为有可能是运营商提供的,所以这个方法未必实用。
  2. arptables:在arp的层次上实现在ARP解析时做防火墙规则,过滤RS响应ARP请求。这是由iptables提供的。
  3. 修改RS上内核参数(arp_ignore和arp_announce)将RS上的VIP配置在lo接口的别名上,并限制其不能响应对VIP地址解析请求。

5.3、Tunnel模式

5.3.1、Tunnel模式工作原理

  1. 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
  2. PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
  3. IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP。
  4. POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP。
  5. RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP
  6. 响应报文最终送达至客户端

5.3.2、Tunnel模式特性

  • RIP、VIP、DIP全是公网地址。
  • RS的网关不会也不可能指向DIP
  • 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
  • 不支持端口映射
  • RS的系统必须支持隧道

六、LVS的调度算法


 

固定调度算法:rr,wrr,dh,sh

动态调度算法:wlc,lc,lblc,lblcr

固定调度算法:即调度器不会去判断后端服务器的繁忙与否,一如既往得将请求派发下去。

动态调度算法:调度器会去判断后端服务器的繁忙程度,然后依据调度算法动态得派发请求。

6.1、rr:轮询(round robin)

这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。这个调度的缺点是,不管后端服务器的繁忙程度是怎样的,调度器都会讲请求依次发下去。如果A服务器上的请求很快请求完了,而B服务器的请求一直持续着,将会导致B服务器一直很忙,而A很闲,这样便没起到均衡的左右。

6.2、wrr:加权轮询(weight round robin)

这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。

6.3、dh:目标地址散列调度算法 (destination hash)

简单的说,即将同一类型的请求分配给同一个后端服务器,例如将以 .jgp、.png等结尾的请求转发到同一个节点。这种算法其实不是为了真正意义的负载均衡,而是为了资源的分类管理。这种调度算法主要应用在使用了缓存节点的系统中,提高缓存的命中率。

6.4、sh:源地址散列调度算法(source hash)

即将来自同一个ip的请求发给后端的同一个服务器,如果后端服务器工作正常没有超负荷的话。这可以解决session共享的问题,但是这里有个问题,很多企业、社区、学校都是共用的一个IP,这将导致请求分配的不均衡。

6.5、lc:最少连接数(least-connection)

这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1。这里问题是无法做到会话保持,即session共享。

6.6、wlc:加权最少连接数(weight least-connection)

这个比最少连接数多了一个加权的概念,即在最少连接数的基础上加一个权重值,当连接数相近,权重值越大,越优先被分派请求。

6.7、lblc:基于局部性的最少连接调度算法(locality-based least-connection)

将来自同一目的地址的请求分配给同一台RS如果这台服务器尚未满负荷,否则分配给连接数最小的RS,并以它为下一次分配的首先考虑。

6.8、lblcr:基于地址的带重复最小连接数调度 (Locality-Based Least-Connection with Replication)

这个用得少,可以略过。

七、LVS部署


 

7.1、ipvsadm命令详解

ipvsadm是ipvs的管理器,需要yum安装。

基本用法:

ipvsadm COMMAND [protocol] service-address [scheduling-method] [persistence options]

ipvsadm COMMAND [protocol] service-address server-address [packet-forwarding-method] [weight options]

第一条命令用于向LVS系统中添加一个用于负载均衡的virtual server(VS);第二条命令用来修改已经存在的VS的配置,service address用来指定涉及的虚拟服务即虚拟地址,server-address指定涉及的真实地址。

 

命令参数:

-A, --add-service:     为ipvs虚拟服务器添加一个虚拟服务,即添加一个需要被负载均衡的虚拟地址。虚拟地址需要是ip地址,端口号,协议的形式。

-E, --edit-service:     修改一个虚拟服务。

-D, --delete-service: 删除一个虚拟服务。

-C, --clear:               清除所有虚拟服务。

-R, --restore:            从标准输入获取ipvsadm命令。一般结合下边的-S使用。

-S, --save:                从标准输出输出虚拟服务器的规则。可以将虚拟服务器的规则保存,在以后通过-R直接读入,以实现自动化配置。

-a, --add-server:      为虚拟服务添加一个real server(RS)

-e, --edit-server:      修改RS

-d, --delete-server:  删除

-L, -l, --list:              列出虚拟服务表中的所有虚拟服务。可以指定地址。添加-c显示连接表。

-Z, --zero:               将所有数据相关的记录清零。这些记录一般用于调度策略。

--set tcp tcpfin udp:修改协议的超时时间。

--start-daemon state:设置虚拟服务器的备服务器,用来实现主备服务器冗余。(注:该功能只支持ipv4)

--stop-daemon:      停止备服务器。

-h, --help:               帮助。

 

参数:以下参数可以接在上边的命令后边。

-t, --tcp-service service-address: 

指定虚拟服务为tcp服务。service-address要是host[:port]的形式。端口是0表示任意端口。如果需要将端口设置为0,还需要加上-p选项(持久连接)。

-u, --udp-service service-address:

使用udp服务,其他同上。

-f, --fwmark-service integer:         

用firewall mark取代虚拟地址来指定要被负载均衡的数据包,可以通过这个命令实现把不同址、端口的虚拟地址整合成一个虚拟服务,可以让虚拟服务器同时截获处理去往多个不同地址的数据包。fwmark可以通过iptables命令指定。如果用在ipv6需要加上-6。

-s, --scheduler scheduling-method:

指定调度算法。调度算法可以指定以下8种:rr(轮询),wrr(权重),lc(最后连接),wlc(权重),lblc(本地最后连接),lblcr(带复制的本地最后连接),dh(目的地址哈希),sh(源地址哈希),sed(最小期望延迟),nq(永不排队)

-p, --persistent [timeout]:             

设置持久连接,这个模式可以使来自客户的多个请求被送到同一个真实服务器,通常用于ftp或者ssl中。

-M, --netmask netmask:               

指定客户地址的子网掩码。用于将同属一个子网的客户的请求转发到相同服务器。

-r, --real-server server-address:  

为虚拟服务指定数据可以转发到的真实服务器的地址。可以添加端口号。如果没有指定端口号,则等效于使用虚拟地址的端口号。

[packet-forwarding-method]:

此选项指定某个真实服务器所使用的数据转发模式。需要对每个真实服务器分别指定模式。

-g, --gatewaying:              使用网关(即直接路由),此模式是默认模式。

-i, --ipip:                            使用ipip隧道模式。

-m, --masquerading:         使用NAT模式。

-w, --weight weight:                         

设置权重。权重是0~65535的整数。如果将某个真实服务器的权重设置为0,那么它不会收到新的连接,但是已有连接还会继续维持(这点和直接把某个真实服务器删除时不同的)。

-x, --u-threshold uthreshold:        

设置一个服务器可以维持的连接上限。0~65535。设置为0表示没有上限。

-y, --l-threshold lthreshold:           

设置一个服务器的连接下限。当服务器的连接数低于此值的时候服务器才可以重新接收连接。如果此值未设置,则当服务器的连接数连续三次低于uthreshold时服务器才可以接收到新的连接。(PS:笔者以为此设定可能是为了防止服务器在能否接收连接这两个状态上频繁变换)

--mcast-interface interface:         

指定使用备服务器时候的广播接口。

--syncid syncid:                           

指定syncid,同样用于主备服务器的同步。

以下选项用于list命令:

-c, --connection:                           

列出当前的IPVS连接。

--timeout:                                     

列出超时

--daemon:

--stats:                                         

状态信息

--rate:                                           

传输速率

--thresholds:                               

列出阈值

--persistent-conn:                       

坚持连接

--sor:                                           

把列表排序。

--nosort:                                     

不排序

-n, --numeric:                             

不对ip地址进行dns查询

--exact:                                       

单位

-6:                                               

如果fwmark用的是ipv6地址需要指定此选项。     

其他注意事项:

  1.  如果使用IPv6地址,需要在地址两端加上“[]”。例如:ipvsadm -A -t [2001:db8::80]:80 -s rr
  2.  可以通过设置以下虚拟文件的值来防御DoS攻击:/proc/sys/net/ipv4/vs/drop_entry /proc/sys/net/ipv4/vs/drop_packet /proc/sys/net/ipv4/vs/secure_tcp
  3. 对于某一目的地址,对应有一个RS子集。对此地址的请求,为它分配子集中连接数最小的RS;如果子集中所有的服务器均已满负荷,则从集群中选择一个连接数较小的服务器,将它加入到此子集并分配连接;若一定时间内,这个子集未被做任何修改,则将子集中负载最大的节点从子集删除。

7.2、NAT模式测试

1)测试环境:

Director:         centos 6.8      VIP:192.168.1.111

                                                DIP:192.168.229.133

RealServer1: centos6.8        RIP:192.168.229.132

RealServer2: centos6.8        RIP:192.168.229.134

2)Director配置

安装ipvsadm:

[root@ShiYanLou LVS]# yum install ipvsadm –y

编辑脚本:/LVS/install.sh

#director设置 nat 防火墙
iptables -t nat -F

#!/bin/bash
VIP=192.168.1.111
DIP=192.168.229.133
RIP1=192.168.229.132
RIP2=192.168.229.134
# director服务器上开启路由转发功能:
echo 1 > /proc/sys/net/ipv4/ip_forward
# 关闭 icmp 的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects
# director设置 ipvsadm
IPVSADM=\'/sbin/ipvsadm\'
$IPVSADM -C
$IPVSADM -A -t $VIP:80 -s rr
$IPVSADM -a -t $VIP:80 -r $RIP1:80 -m
$IPVSADM -a -t $VIP:80 -r $RIP2:80 -m

3)RealServer配置

  1. 配置RealServer1和RealServer2的网关为DIP。如:
    vi /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    HWADDR=00:0C:29:46:3B:8C
    TYPE=Ethernet
    UUID=e2fa0e51-7240-4ef9-8572-bf82ef8bb6a8
    ONBOOT=yes
    NM_CONTROLLED=yes
    BOOTPROTO=static
    IPADDR=192.168.229.132
    NETMASK=255.255.255.0
    GATEWAY=192.168.229.133                #配置网关为DIP
  2. 安装httpd
    yum –y install httpd
    标记网页:
    RealServer1:echo ”I am RealServer1 192.168.229.132”>/var/www/html/index.html
    RealServer2:echo “I am RealServer2 192.168.229.134”>/var/www/html/index.html

4)验证

多次访问http://192.168.1.111

会轮询得到“I am RealServer1 192.168.229.132”“I am RealServer2 192.168.229.134”

注意:关闭Director的防火墙iptables,不然访问不成功。

7.3、DR模式测试

1)测试环境

Director:        centos 6.8        VIP:eth0:0:192.168.229.111

                                                 DIP:eth0:192.168.229.133

RealServer1: centos6.8        RIP:eth0:192.168.229.132

                                                 VIP:lo:0:192.168.229.111

RealServer2: centos6.8        RIP:eth0:192.168.229.134

                                                 VIP:lo:0:192.168.229.111

2)Director配置

脚本如下:

#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/sbin/ipvsadm
vip=192.168.229.111
rs1=192.168.229.132
rs2=192.168.229.134
ifconfig eth0:0 down
ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.0 up
route add -host $vip dev eth0:0
$ipv -C
$ipv -A -t $vip:80 -s rr
$ipv -a -t $vip:80 -r $rs1:80 -g
$ipv -a -t $vip:80 -r $rs2:80 –g

3)RealServer配置

脚本如下:

#!/bin/bash
vip=192.168.229.111
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

4)验证

多次访问http://192.168.1.111

会轮询得到“I am RealServer1 192.168.229.132”  “I am RealServer2 192.168.229.134”

注意:关闭Director的防火墙iptables,不然访问不成功。

7.4、Tun模式测试

1)测试环境

Director:        centos 6.8        VIP:eth0:0:192.168.299.111

                                                 DIP:eth0:192.168.229.133

RealServer1: centos6.8        RIP:eth0:192.168.229.132

                                                 VIP:tunl0:192.168.229.111

RealServer2: centos6.8        RIP:eth0:192.168.229.134

                                                 VIP:tunl0:192.168.229.111

2)Director配置

脚本如下:

#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/sbin/ipvsadm
vip=192.168.229.111
rs1=192.168.229.132
rs2=192.168.229.134
ifconfig eth0:0 down
ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.0 up
route add -host $vip dev eth0:0
iptables -t nat -F
setenforce 0
$ipv -C
$ipv -A -t $vip:80 -s rr
$ipv -a -t $vip:80 -r $rs1:80 -i
$ipv -a -t $vip:80 -r $rs2:80 -i

3)RealServer配置

a、加载ipip模块

[root@ulife3test LVS]# modprobe ipip

b、配置VIP:

[root@ulife3test LVS]# cd /etc/sysconfig/network-scripts/
[root@ulife3test network-scripts]# cp ifcfg-lo ifcfg-tunl0
[root@ulife3test network-scripts]# vi ifcfg-tunl0
DEVICE=tunl0
IPADDR=192.168.229.111
NETMASK=255.255.255.0
ONBOOT=yes
NAME=tunl0
[root@ulife3test network-scripts]# service network restart

c、关闭arp转发:

[root@ulife3test network-scripts]# echo \'0\'>/proc/sys/net/ipv4/ip_forward
[root@ulife3test network-scripts]# vi /etc/sysctl.conf                #加入以下行
net.ipv4.conf.tunl0.arp_ignore = 1
net.ipv4.conf.tunl0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.tunl0.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
[root@ulife3test network-scripts]# sysctl -p                           #永久生效
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.tunl0.arp_ignore = 1
net.ipv4.conf.tunl0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.tunl0.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0

d、关闭selinux

setenforce 0或者修改/etc/selinux/config 配置文件中SELINUX=disabled然后重启系统。

4)验证

多次访问http://192.168.1.111

会轮询得到“I am RealServer1 192.168.229.132”“I am RealServer2 192.168.229.134”

注意:关闭Director的防火墙iptables,不然访问不成功。

lvs原理及安装部署详解(参考)

LVS安装使用详解

 

摘至:http://www.cnblogs.com/MacoLee/p/5856858.html

简介

LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。

现在LVS已经是Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。

 

LVS主要用于服务器集群的负载均衡。其优点有:

技术分享
#工作在网络层,可以实现高性能,高可用的服务器集群技术。

#廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。

#易用,配置非常简单,且有多种负载均衡的方法。

#稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。

#可扩展性也非常好。
技术分享

 

安装配置

linux内核2.4版本以上的基本都支持LVS,要使用lvs,只需要再安装一个lvs的管理工具:ipvsadm

yum install ipvsadm

 

ipvsadm用法

其实LVS的本身跟iptables很相似,而且连命令的使用格式都很相似,其实LVS是根据iptables的框架开发的,那么LVS的本身分成了两个部分:

第一部分是工作在内核空间的一个IPVS的模块,其实LVS的功能都是IPVS模块实现的,

第二部分是工作在用户空间的一个用来定义集群服务的一个工具ipvsadm, 这个工具的主要作用是将管理员定义的集群服务列表传送给工作在内核空间中的IPVS模块,下面来简单的介绍下ipvsadm命令的用法

ipvsadm组件定义规则的格式:

技术分享技术分享
技术分享
#virtual-service-address:是指虚拟服务器的ip 地址
#real-service-address:是指真实服务器的ip 地址
#scheduler:调度方法

#ipvsadm 的用法和格式如下:
ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p[timeout]] [-M netmask]
ipvsadm -D -t|u|f virtual-service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface]
ipvsadm --stop-daemon
ipvsadm -h

#命令选项解释:有两种命令选项格式,长的和短的,具有相同的意思。在实际使用时,两种都可以。
-A --add-service #在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。
-E --edit-service #编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D --delete-service #删除内核虚拟服务器表中的一条虚拟服务器记录。
-C --clear #清除内核虚拟服务器表中的所有记录。
-R --restore #恢复虚拟服务器规则
-S --save #保存虚拟服务器规则,输出为-R 选项可读的格式
-a --add-server #在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-e --edit-server #编辑一条虚拟服务器记录中的某条真实服务器记录
-d --delete-server #删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l --list #显示内核虚拟服务器表
-Z --zero #虚拟服务表计数器清零(清空当前的连接数量等)
--set tcp tcpfin udp #设置连接超时值
--start-daemon #启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能。
--stop-daemon #停止同步守护进程
-h --help #显示帮助信息

#其他的选项:
-t --tcp-service service-address #说明虚拟服务器提供的是tcp 的服务[vip:port] or [real-server-ip:port]
-u --udp-service service-address #说明虚拟服务器提供的是udp 的服务[vip:port] or [real-server-ip:port]
-f --fwmark-service fwmark #说明是经过iptables 标记过的服务类型。
-s --scheduler scheduler #使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是: wlc.
-p --persistent [timeout] #持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。
-M --netmask #子网掩码
-r --real-server server-address #真实的服务器[Real-Server:port]
-g --gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
-i --ipip #指定LVS 的工作模式为隧道模式
-m --masquerading #指定LVS 的工作模式为NAT 模式
-w --weight weight #真实服务器的权值
--mcast-interface interface #指定组播的同步接口
-c --connection #显示LVS 目前的连接 如:ipvsadm -L -c
--timeout #显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
--daemon #显示同步守护进程状态
--stats #显示统计信息
--rate #显示速率信息
--sort #对虚拟服务器和真实服务器排序输出
--numeric -n #输出IP 地址和端口的数字形式

ipvsadm命令方法
技术分享
ipvsadm命令方法

 #virtual-service-address:是指虚拟服务器的ip 地址 #real-service-address:是指真实服务器的ip 地址 #scheduler:调度方法

#ipvsadm 的用法和格式如下:
ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p[timeout]] [-M netmask] ipvsadm -D -t|u|f virtual-service-address ipvsadm -C ipvsadm -R ipvsadm -S [-n] ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight] ipvsadm -d -t|u|f service-address -r server-address ipvsadm -L|l [options] ipvsadm -Z [-t|u|f service-address] ipvsadm --set tcp tcpfin udp ipvsadm --start-daemon state [--mcast-interface interface] ipvsadm --stop-daemon ipvsadm -h #命令选项解释:有两种命令选项格式,长的和短的,具有相同的意思。在实际使用时,两种都可以。
-A --add-service #在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。
-E --edit-service #编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D --delete-service #删除内核虚拟服务器表中的一条虚拟服务器记录。
-C --clear #清除内核虚拟服务器表中的所有记录。
-R --restore #恢复虚拟服务器规则
-S --save #保存虚拟服务器规则,输出为-R 选项可读的格式
-a --add-server #在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-e --edit-server #编辑一条虚拟服务器记录中的某条真实服务器记录
-d --delete-server #删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l --list #显示内核虚拟服务器表
-Z --zero #虚拟服务表计数器清零(清空当前的连接数量等)
--set tcp tcpfin udp #设置连接超时值
--start-daemon #启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能。
--stop-daemon #停止同步守护进程
-h --help #显示帮助信息

#其他的选项:
-t --tcp-service service-address #说明虚拟服务器提供的是tcp 的服务[vip:port] or [real-server-ip:port]
-u --udp-service service-address #说明虚拟服务器提供的是udp 的服务[vip:port] or [real-server-ip:port]
-f --fwmark-service fwmark #说明是经过iptables 标记过的服务类型。
-s --scheduler scheduler #使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是: wlc.
-p --persistent [timeout] #持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。
-M --netmask #子网掩码
-r --real-server server-address #真实的服务器[Real-Server:port]
-g --gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式) -i --ipip #指定LVS 的工作模式为隧道模式
-m --masquerading #指定LVS 的工作模式为NAT 模式
-w --weight weight #真实服务器的权值
--mcast-interface interface #指定组播的同步接口
-c --connection #显示LVS 目前的连接 如:ipvsadm -L -c
--timeout #显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
--daemon #显示同步守护进程状态
--stats #显示统计信息
--rate #显示速率信息
--sort #对虚拟服务器和真实服务器排序输出
--numeric -n #输出IP 地址和端口的数字形式
ipvsadm命令方法

LVS的10种调度算法

lvs调度算法(不区分大小写)可以分为两大类:

技术分享技术分享
技术分享
1.Fixed Scheduling Method 静态调服方法

RR  #轮询
#调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

WRR  #加权轮询
#调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。 这样可以保证处理能力强的服务器处理更多的访问流量。调度器 可以自动问询真实服务器的负载情况,并动态地调整其权值。

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

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



2.Dynamic Scheduling Method 动态调服方法

LC  #最少连接
#调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。 如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。

WLC #加权最少连接
#在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

SED #最少期望延迟
#基于wlc算法,举例说明:ABC三台机器分别权重123,连接数也分别是123,name如果使用WLC算法的话一个新请求 进入时他可能会分给ABC中任意一个,使用SED算法后会进行这样一个运算
#A:(1+1)/2    
#B:(1+2)/2    
#C:(1+3)/3
#根据运算结果,把连接交给C

NQ  #从不排队调度方法
#无需列队,如果有台realserver的连接数=0 就直接分配过去,不需要进行sed运算.

LBLC   #基于本地的最少连接
# "基于局部性的最少链接" 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。
#该算法根据请求的目标IP地址找出该 目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;
#若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务器,将请求发送到该服务器。

LBLCR   #带复制的基于本地的最少连接
#"带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。
#它与LBLC算法的不同 之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。
#该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按"最小连接"原则从服务器组中选出一台服务器,
#若服务器没有超载,将请求发送到该服务器;若服务器超载,则按"最小连接"原则从这个集群中选出一 台服务器 ,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改, 将最忙的服务器从服务器组中删除,以降低复制的程度。

lvs调度算法
技术分享
lvs调度算法

 

 1.Fixed Scheduling Method 静态调服方法 RR #轮询 #调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
WRR #加权轮询 #调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。 这样可以保证处理能力强的服务器处理更多的访问流量。调度器 可以自动问询真实服务器的负载情况,并动态地调整其权值。
DH #目标地址hash #算法也是针对目标IP地址的负载均衡,但它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。 #目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
SH #源地址hash #算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是 可用的且未超载,将请求发送到该服务器,否则返回空。 #它采用的散列函数与目标地址散列调度算法的相同。除了将请求的目标IP地址换成请求的源IP地址外,它的算法流程与目标地址散列调度算法的基本相似。在实际应用中,源地址散列调度和目标地址散列调度可以结合使用在防火墙集群中,它们可以保证整个系统的唯一出入口。



2.Dynamic Scheduling Method 动态调服方法 LC #最少连接 #调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。 如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。
WLC #加权最少连接 #在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
SED #最少期望延迟 #基于wlc算法,举例说明:ABC三台机器分别权重123,连接数也分别是123,name如果使用WLC算法的话一个新请求 进入时他可能会分给ABC中任意一个,使用SED算法后会进行这样一个运算 #A:(1+1)/2 #B:(1+2)/2 #C:(1+3)/3 #根据运算结果,把连接交给C
NQ #从不排队调度方法 #无需列队,如果有台realserver的连接数=0 就直接分配过去,不需要进行sed运算.
LBLC #基于本地的最少连接 # "基于局部性的最少链接" 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。 #该算法根据请求的目标IP地址找出该 目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器; #若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务器,将请求发送到该服务器。
LBLCR #带复制的基于本地的最少连接 #"带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。 #它与LBLC算法的不同 之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。 #该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按"最小连接"原则从服务器组中选出一台服务器, #若服务器没有超载,将请求发送到该服务器;若服务器超载,则按"最小连接"原则从这个集群中选出一 台服务器 ,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改, 将最忙的服务器从服务器组中删除,以降低复制的程度。
lvs调度算法

 



LVS三种工作模式:NAT(地址转换)、DR(直接路由)、TUN(隧道)



 

LVS-NAT:地址转换


架构图:

 

技术分享

 

 

工作方式:

NAT模型其实就是通过网络地址转换来实现负载均衡的。下面是它的流程:

技术分享
1.用户请求VIP(也可以说是CIP请求VIP)

2,Director Server 收到用户的请求后,发现源地址为CIP请求的目标地址为VIP,那么Director Server会认为用户请求的是一个集群服务,那么Director Server 会根据此前设定好的调度算法将用户请求负载给某台Real Server。
假如说此时Director Server 根据调度的结果会将请求分摊到RealServer1上去,那么Director Server 会将用户的请求报文中的目标地址,从原来的VIP改为RealServer1的IP,然后再转发给RealServer1 3,此时RealServer1收到一个源地址为CIP目标地址为自己的请求,那么RealServer1处理好请求后会将一个源地址为自己目标地址为CIP的数据包通过Director Server 发出去, 4.当Driector Server收到一个源地址为RealServer1 的IP 目标地址为CIP的数据包,此时Driector Server 会将源地址修改为VIP,然后再将数据包发送给用户
技术分享

 

LVS-NAT的性能瓶颈:

在LVS/NAT的集群系统中,请求和响应的数据报文都需要通过负载调度器(Director),当真实服务器(RealServer)的数目在10台和20台之间时,负载调度器(Director)将成为整个集群系统的新瓶颈。

大多数Internet服务都有这样的特点:请求报文较短而响应报文往往包含大量的数据。如果能将请求和响应分开处理,即在负载调度器(Director)中只负责调度请求而响应直接(RealServer)返回给客户,将极大地提高整个集群系统的吞吐量。

 

部署

在RealServer上部署httpd服务并测试

技术分享技术分享
技术分享
#安装httpd服务,创建httpd测试页面,启动httpd服务
[[email protected] ~]# yum -y install httpd
[[email protected] ~]# service httpd start
[[email protected] ~]# echo "RS1-web1 Allentuns.com" > /var/www/html/index.html
[[email protected] ~]# yum -y install httpd
[[email protected] ~]# echo "RS2-web2 Allentuns.com" > /var/www/html/index.html
[[email protected] ~]# service httpd start

#测试httpd服务是否OK! 
[[email protected] ~]# curl http://localhost
RS1-web1 Allentuns.com 
[[email protected] ~]# curl http://172.16.100.11
RS2-web2 Allentuns.com
技术分享
realserver部署

 #安装httpd服务,创建httpd测试页面,启动httpd服务
[[email protected] ~]# yum -y install httpd
[[email protected] ~]# service httpd start
[[email protected] ~]# echo "RS1-web1 Allentuns.com" > /var/www/html/index.html
[[email protected] ~]# yum -y install httpd
[[email protected] ~]# echo "RS2-web2 Allentuns.com" > /var/www/html/index.html
[[email protected] ~]# service httpd start

#测试httpd服务是否OK!
[[email protected] ~]# curl http://localhost
RS1-web1 Allentuns.com [[email protected] ~]# curl http://172.16.100.11
RS2-web2 Allentuns.com

在Director上部署ipvs服务并测试
添加集群服务

技术分享技术分享
技术分享
[[email protected] ~]# ipvsadm -A -t 192.168.0.200:80 -s rr #定义一个集群服务
[[email protected] ~]# ipvsadm -a -t 192.168.0.200:80 -r 172.16.100.10 -m #添加RealServer并指派调度算法为NAT
[[email protected] ~]# ipvsadm -a -t 192.168.0.200:80 -r 172.16.100.11 -m #添加RealServer并指派调度算法为NAT
[[email protected] ~]# ipvsadm -L -n #查看ipvs定义的规则列表
IP Virtual Server version 1.2.1 (size=4096) 
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.200:80 rr
-> 172.16.100.10:80 Masq 1 0 0 
-> 172.16.100.11:80 Masq 1 0 0 
[[email protected] ~]# cat /proc/sys/net/ipv4/ip_forward #查看Linux是否开启路由转发功能
0 
[[email protected] ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #启动Linux的路由转发功能
[[email protected] ~]# cat /proc/sys/net/ipv4/ip_forward 
1 
技术分享
添加集群服务

 [[email protected] ~]# ipvsadm -A -t 192.168.0.200:80 -s rr #定义一个集群服务
[[email protected] ~]# ipvsadm -a -t 192.168.0.200:80 -r 172.16.100.10 -m #添加RealServer并指派调度算法为NAT
[[email protected] ~]# ipvsadm -a -t 192.168.0.200:80 -r 172.16.100.11 -m #添加RealServer并指派调度算法为NAT
[[email protected] ~]# ipvsadm -L -n #查看ipvs定义的规则列表
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.0.200:80 rr -> 172.16.100.10:80 Masq 1 0 0 -> 172.16.100.11:80 Masq 1 0 0 [[email protected] ~]# cat /proc/sys/net/ipv4/ip_forward #查看Linux是否开启路由转发功能
0 [[email protected] ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #启动Linux的路由转发功能
[[email protected] ~]# cat /proc/sys/net/ipv4/ip_forward
1

测试访问http页面

技术分享技术分享
技术分享
[[email protected] ~]# curl http://192.168.0.200/index.html
RS2-web2 Allentuns.com #第一次是web2
[[email protected] ~]# curl http://192.168.0.200/index.html
RS1-web1 Allentuns.com #第二次是web1
[[email protected] ~]# curl http://192.168.0.200/index.html
RS2-web2 Allentuns.com #第三次是web1
[[email protected] ~]# curl http://192.168.0.200/index.html
RS1-web1 Allentuns.com #第四次是web2
技术分享
测试

 [[email protected] ~]# curl http://192.168.0.200/index.html
RS2-web2 Allentuns.com #第一次是web2
[[email protected] ~]# curl http://192.168.0.200/index.html
RS1-web1 Allentuns.com #第二次是web1
[[email protected] ~]# curl http://192.168.0.200/index.html
RS2-web2 Allentuns.com #第三次是web1
[[email protected] ~]# curl http://192.168.0.200/index.html
RS1-web1 Allentuns.com #第四次是web2

更改LVS的调度算法并压力测试,查看结果

技术分享技术分享
技术分享
[[email protected] ~]# ipvsadm -E -t 192.168.0.200:80 -s wrr
[[email protected] ~]# ipvsadm -e -t 192.168.0.200:80 -r 172.16.100.10 -m -w 3
[[email protected] ~]# ipvsadm -e -t 192.168.0.200:80 -r 172.16.100.11 -m -w 1
[[email protected] ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096) 
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.200:80 wrr
-> 172.16.100.10:80 Masq 3 0 2 
-> 172.16.100.11:80 Masq 1 0 2 

[[email protected] ~]# curl http://192.168.0.200/index.html
RS1-web1 Allentuns.com 
[[email protected] ~]# curl http://192.168.0.200/index.html
RS1-web1 Allentuns.com 
[[email protected] ~]# curl http://192.168.0.200/index.html
RS1-web1 Allentuns.com 
[[email protected] ~]# curl http://192.168.0.200/index.html
RS2-web2 Allentuns.com 
[[email protected] ~]# curl http://192.168.0.200/index.html
RS1-web1 Allentuns.com 
技术分享
lvs调度算法压力测试

 [[email protected] ~]# ipvsadm -E -t 192.168.0.200:80 -s wrr
[[email protected] ~]# ipvsadm -e -t 192.168.0.200:80 -r 172.16.100.10 -m -w 3
[[email protected] ~]# ipvsadm -e -t 192.168.0.200:80 -r 172.16.100.11 -m -w 1
[[email protected] ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.0.200:80 wrr -> 172.16.100.10:80 Masq 3 0 2
-> 172.16.100.11:80 Masq 1 0 2 [[email protected] ~]# curl http://192.168.0.200/index.html
RS1-web1 Allentuns.com [[email protected] ~]# curl http://192.168.0.200/index.html
RS1-web1 Allentuns.com [[email protected] ~]# curl http://192.168.0.200/index.html
RS1-web1 Allentuns.com [[email protected] ~]# curl http://192.168.0.200/index.html
RS2-web2 Allentuns.com [[email protected] ~]# curl http://192.168.0.200/index.html
RS1-web1 Allentuns.com

永久保存LVS规则并恢复

技术分享技术分享
#第一种方法: 
[[email protected] ~]# service ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [确定]

#第二种方法: 
[[email protected] ~]# ipvsadm -S > /etc/sysconfig/ipvsadm.s1
ipvsadm保存规则
 
 

#第一种方法:
[[email protected] ~]# service ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [确定] #第二种方法:
[[email protected] ~]# ipvsadm -S > /etc/sysconfig/ipvsadm.s1

模拟清空ipvsadm规则来恢复

技术分享技术分享
技术分享
[[email protected] ~]# ipvsadm -C
[[email protected] ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096) 
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[[email protected] ~]# ipvsadm -R < /etc/sysconfig/ipvsadm.s1 
[[email protected] ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096) 
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.200:80 wrr
-> 172.16.100.10:80 Masq 3 0 0 
-> 172.16.100.11:80 Masq 1 0 0
技术分享
ipvsadm恢复规则

 [[email protected] ~]# ipvsadm -C [[email protected] ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn [[email protected] ~]# ipvsadm -R < /etc/sysconfig/ipvsadm.s1
[[email protected] ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.0.200:80 wrr -> 172.16.100.10:80 Masq 3 0 0 -> 172.16.100.11:80 Masq 1 0 0

脚本

LVS-NAT服务控制脚本部署在Director上

技术分享技术分享
技术分享
#!/bin/bash
# 
# chkconfig: - 88 12
# description: LVS script for VS/NAT
# . /etc/rc.d/init.d/functions # VIP=192.168.0.200 
DIP=172.16.100.1 
RIP1=172.16.100.10
RIP2=172.16.100.11
# 
case "$1" in
start)           
 # /sbin/ifconfig eth1:0 $VIP netmask 255.255.255.0 up
# Since this is the Director we must be able to forward packets
  echo 1 > /proc/sys/net/ipv4/ip_forward
 # Clear all iptables rules.
  /sbin/iptables -F
 # Reset iptables counters.
  /sbin/iptables -Z
 # Clear all ipvsadm rules/services.
  /sbin/ipvsadm -C
 # Add an IP virtual service for VIP 192.168.0.219 port 80
# In this recipe, we will use the round-robin scheduling method. 
# In production, however, you should use a weighted, dynamic scheduling method. 
  /sbin/ipvsadm -A -t $VIP:80 -s rr
 # Now direct packets for this VIP to
# the real server IP (RIP) inside the cluster
  /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -m
  /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -m
    
  /bin/touch /var/lock/subsys/ipvsadm.lock
;; 
  
stop) # Stop forwarding packets
  echo 0 > /proc/sys/net/ipv4/ip_forward
 # Reset ipvsadm
  /sbin/ipvsadm -C
 # Bring down the VIP interface
  ifconfig eth1:0 down
    
  rm -rf /var/lock/subsys/ipvsadm.lock
;; 
  
status) 
  [ -e /var/lock/subsys/ipvsadm.lock ] && echo "ipvs is running..." || echo "ipvsadm is stopped..."
;; 
*) 
  echo "Usage: $0 {start|stop}"
;; esac

lvs-nat-director.sh
技术分享
lvs-nat-director.sh

 

分享LVS-NAT一键安装脚本

技术分享技术分享
技术分享
#!/bin/bash
# 
# 一键安装lvs-nat脚本,需要注意的是主机名成和ip的变化稍作修改就可以了 
HOSTNAME=`hostname`
  
Director=‘LVS‘
VIP="192.168.0.200"
RIP1="172.16.100.10"
RIP2="172.16.100.11"
RealServer1="web1"
RealServer2="web2"
Httpd_config="/etc/httpd/conf/httpd.conf"
  
 #Director Server Install configure ipvsadm
if [ "$HOSTNAME" = "$Director" ];then
ipvsadm -C 
yum -y remove ipvsadm
yum -y install ipvsadm
/sbin/ipvsadm -A -t $VIP:80 -s rr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -m
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -m
 echo 1 > /proc/sys/net/ipv4/ip_forward
 echo "========================================================" echo "Install  $Director sucess   Tel:13260071987 Qq:467754239" echo "========================================================" fi
  
  
  
 #RealServer Install htpd
if [ "$HOSTNAME" = "$RealServer1" ];then
yum -y remove httpd
rm -rf /var/www/html/index.html
yum -y install httpd
echo "web1 Allentuns.com" > /var/www/html/index.html
sed -i ‘/#ServerName www.example.com:80/a\\ServerName localhost:80‘ $Httpd_config
service httpd start
  
 echo "========================================================" echo "Install $RealServer1 success Tel:13260071987 Qq:467754239" echo "========================================================" fi
 if [ "$HOSTNAME" = "$RealServer2" ];then
yum -y remove httpd
rm -rf /var/www/html/index.html
yum -y install httpd
echo "web2 Allentuns.com" > /var/www/html/index.html
sed -i ‘/#ServerName www.example.com:80/a\\ServerName localhost:80‘ $Httpd_config
service httpd start
echo "Install $RealServer2"
  
 echo "=========================================================" echo "Install $RealServer1 success Tel:13260071987 Qq:467754239" echo "=========================================================" fi

lvs-nat-install
技术分享
lvs-nat-install.sh

 

LVS-DR:直接路由

架构图:

技术分享

 

 

工作方式:

上面说了NAT模型的实现方式,那么NAT模型有个缺陷,因为进出的每个数据包都要经过Director Server,当集群系统负载过大的时候Director Server将会成为整个集群系统的瓶颈,

那么DR模型就避免了这样的情况发生,DR模型在只有请求的时候才会经过Director Server, 回应的数据包由Real Server 直接响应用户不需要经过Director Server,其实三种模型中最常用的也就是DR模型了。

下面是它的工作流程:

技术分享
1, 首先用户用CIP请求VIP

2, 根据上图可以看到,不管是Director Server还是Real Server上都需要配置VIP,那么当用户请求到达我们的集群网络的前端路由器的时候,请求数据包的源地址为CIP目标地址为VIP,
此时路由器会发广播问谁是VIP,那么我们集群中所有的节点都配置有VIP,此时谁先响应路由器那么路由器就会将用户请求发给谁,这样一来我们的集群系统是不是没有意义了,
那我们可以在网关路由器上配置静态路由指定VIP就是Director Server,或者使用一种机制不让Real Server 接收来自网络中的ARP地址解析请求,这样一来用户的请求数据包都会经过Director Servrer 3,当Director Server收到用户的请求后根据此前设定好的调度算法结果来确定将请求负载到某台Real Server上去,假如说此时根据调度算法的结果,会将请求负载到RealServer 1上面去,
此时Director Server 会将数据帧中的目标MAC地址修改为Real Server1的MAC地址,然后再将数据帧发送出去 4,当Real Server1 收到一个源地址为CIP目标地址为VIP的数据包时,Real Server1发现目标地址为VIP,而VIP是自己,于是接受数据包并给予处理,当Real Server1处理完请求后,
会将一个源地址为VIP目标地址为CIP的数据包发出去,此时的响应请求就不会再经过Director Server了,而是直接响应给用户。
技术分享

 

编辑DR有三种方式(目的是让用户请求的数据都通过Director Server)

第一种方式:在路由器上明显说明vip对应的地址一定是Director上的MAC,只要绑定,以后再跟vip通信也不用再请求了,这个绑定是静态的,所以它也不会失效,也不会再次发起请求,但是有个前提,我们的路由设备必须有操作权限能够绑定MAC地址,万一这个路由器是运行商操作的,我们没法操作怎么办?第一种方式固然很简便,但未必可行。

 

第二种方式:在给别主机上(例如:红帽)它们引进的有一种程序arptables,它有点类似于iptables,它肯定是基于arp或基于MAC做访问控制的,很显然我们只需要在每一个real server上定义arptables规则,如果用户arp广播请求的目标地址是本机的vip则不予相应,或者说相应的报文不让出去,很显然网关(gateway)是接受不到的,也就是director相应的报文才能到达gateway,这个也行。第二种方式我们可以基于arptables。

 

第三种方式:在相对较新的版本中新增了两个内核参数(kernelparameter),第一个是arp_ignore定义接受到ARP请求时的相应级别;第二个是arp_announce定义将自己地址向外通告是的通告级别。【提示:很显然我们现在的系统一般在内核中都是支持这些参数的,我们用参数的方式进行调整更具有朴实性,它还不依赖于额外的条件,像arptables,也不依赖外在路由配置的设置,反而通常我们使用的是第三种配置】

arp_ignore:定义接受到ARP请求时的相应级别

技术分享
0:只要本地配置的有相应地址,就给予响应。

1:仅在请求的目标地址配置请求到达的接口上的时候,才给予响应(当别人的arp请求过来的时候,如果接收的设备上面没有这个ip,就不响应,默认是0,只要这台机器上面任何一个设备上面有这个ip,就响应arp请求,并发送MAC地址应答。)

2:只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内

3:不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应

4-7:保留未使用

8:不回应所有(本地地址)的arp查询
技术分享

arp_announce:定义将自己地址向外通告是的通告级别;

0: 将本地任何接口上的任何地址向外通告

1:试图仅想目标网络通告与其网络匹配的地址

2:仅向与本地借口上地址匹配的网络进行通告

 

部署

在Real Server1 和Real Server2上做以下配置

技术分享技术分享
技术分享
# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
#以上命令需填加到/etc/rc.local文件中让其开机自动生效 

# vim /etc/sysconfig/network-scripts/ifcfg-lo:0 内容如下 
DEVICE=lo:0  
IPADDR=172.16.100.100
NETMASK=255.255.255.255 
BROADCAST=172.16.100.100
ONBOOT=yes 
NAME=loopback  


# ifdown lo:0
# ifup lo:0 
# route add -host 172.16.100.100 dev lo:0
# echo "route add -host 172.16.100.100 dev lo:0" >> /etc/rc.local
技术分享
realserver配置

在Director Server上做以下配置

技术分享技术分享
技术分享
# vim /etc/sysconfig/network-scripts/ifcfg-eth2:0 内容如下 
DEVICE=eth2:0 
IPADDR=172.16.100.100 
NETMASK=255.255.255.255 
BROADCAST=172.16.100.100 
ONBOOT=yes # ifdown eth2:0 

#命令
# ifup eth2:20 
# route add -host 172.16.100.100 dev eth2:0 
# echo "route add -host 172.16.100.100 dev eth2:0" >> /etc/rc.local 
# echo "1" > /proc/sys/net/ipv4/ip_forward 
# echo "echo "1" > /proc/sys/net/ipv4/ip_forward" >> /etc/rc.local 
# ipvsadm -A -t 172.16.100.100:80 -s wlc
# ipvsadm -a -t 172.16.100.100:80 -r 172.16.100.10 -g -w 2
# ipvsadm -a -t 172.16.100.100:80 -r 172.16.100.11 -g -w 1
技术分享
director配置

 

脚本

Director脚本

技术分享技术分享
技术分享
#!/bin/bash
# 
# LVS script for VS/DR
# . /etc/rc.d/init.d/functions # VIP=172.16.100.100 
RIP1=172.16.100.10
RIP2=172.16.100.11
PORT=80 
 #
case "$1" in
start) 
  
  /sbin/ifconfig eth2:0 $VIP broadcast $VIP netmask 255.255.255.255 up
  /sbin/route add -host $VIP dev eth2:0
 # Since this is the Director we must be able to forward packets
  echo 1 > /proc/sys/net/ipv4/ip_forward
 # Clear all iptables rules.
  /sbin/iptables -F
 # Reset iptables counters.
  /sbin/iptables -Z
 # Clear all ipvsadm rules/services.
  /sbin/ipvsadm -C
 # Add an IP virtual service for VIP 192.168.0.219 port 80
# In this recipe, we will use the round-robin scheduling method. 
# In production, however, you should use a weighted, dynamic scheduling method. 
  /sbin/ipvsadm -A -t $VIP:80 -s wlc
 # Now direct packets for this VIP to
# the real server IP (RIP) inside the cluster
  /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1
  /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 2
  
  /bin/touch /var/lock/subsys/ipvsadm &> /dev/null
;; 
  
stop) # Stop forwarding packets
  echo 0 > /proc/sys/net/ipv4/ip_forward
 # Reset ipvsadm
  /sbin/ipvsadm -C
 # Bring down the VIP interface
  /sbin/ifconfig eth2:0 down
  /sbin/route del $VIP
  
  /bin/rm -f /var/lock/subsys/ipvsadm
  
  echo "ipvs is stopped..."
;; 
  
status) 
  if [ ! -e /var/lock/subsys/ipvsadm ]; then
    echo "ipvsadm is stopped ..."
  else
    echo "ipvs is running ..."
    ipvsadm -L -n
  fi
;; 
*) 
  echo "Usage: $0 {start|stop|status}"
;; esac

Director.sh
技术分享
Direcotor.sh

RealServer脚本

技术分享技术分享
技术分享
#!/bin/bash
# 
# Script to start LVS DR real server.
# description: LVS DR real server
# .  /etc/rc.d/init.d/functions
  
VIP=172.16.100.100
host=`/bin/hostname`
 case "$1" in
start) 
       # Start LVS-DR real server on this machine.
        /sbin/ifconfig lo down
        /sbin/ifconfig lo up
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
  
        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        /sbin/route add -host $VIP dev lo:0
  
;; 
stop) 
  
        # Stop LVS-DR real server loopback device(s).
        /sbin/ifconfig lo:0 down
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
  
;; 
status) 
  
        # Status of LVS-DR real server.
        islothere=`/sbin/ifconfig lo:0 | grep $VIP`
        isrothere=`netstat -rn | grep "lo:0" | grep $VIP`
        if [ ! "$islothere" -o ! "isrothere" ];then
            # Either the route or the lo:0 device
            # not found.             echo "LVS-DR real server Stopped."
        else
            echo "LVS-DR real server Running."
        fi
;; 
*) 
            # Invalid entry.
            echo "$0: Usage: $0 {start|status|stop}"
            exit 1
;; esac

RealServer.sh
技术分享
RealServer.sh

 

LVS-TUN:隧道

架构图:

技术分享

 

工作方式:

TUN的工作机制跟DR一样,只不过在转发的时候,它需要重新包装IP报文。这里的real server(图中为RIP)离得都比较远。

用户请求以后,到director上的VIP上,它跟DR模型一样,每个realserver上既有RIP又有VIP,Director就挑选一个real server进行响应,但director和real server并不在同一个网络上,这时候就用到隧道了,Director进行转发的时候,一定要记得CIP和VIP不能动。

我们转发是这样的,让它的CIP和VIP不动,在它上面再加一个IP首部,再加的IP首部源地址是DIP,目标地址的RIP的IP地址。收到报文的RIP,拆掉报文以后发现了里面还有一个封装,它就知道了,这就是隧道。

 

其实数据转发原理和DR是一样的,不过这个我个人认为主要是位于不同位置(不同机房);LB是通过隧道进行了信息传输,虽然增加了负载,可是因为地理位置不同的优势,还是可以参考的一种方案;

优点:负载均衡器只负责将请求包分发给物理服务器,而物理服务器将应答包直接发给用户。所以,负载均衡器能处理很巨大的请求量,这种方式,一台负载均衡能为超过100台的物理服务器服务,负载均衡器不再是系统的瓶颈。
使用VS-TUN方式,如果你的负载均衡器拥有100M的全双工网卡的话,就能使得整个Virtual Server能达到1G的吞吐量。 不足:但是,这种方式需要所有的服务器支持"IP Tunneling"(IP Encapsulation)协议;

 

LVS的健康状态检查

在LVS模型中,director不负责检查RS的健康状况,这就使得当有的RS出故障了,director还会将服务请求派发至此服务器,这种情况对用户、企业都是很不爽的,哪个用户倒霉说不定就遇到类似了。

为了让Director更人性化、可靠还要给director提供健康检查功能;如何实现?Director没有自带检查工具,只有手动编写脚本给director实现健康状态检查功能!

技术分享技术分享
技术分享
#!/bin/bash
# VIP=172.16.100.100
CPORT=80 
FAIL_BACK=127.0.0.1
RS=("172.16.100.10" "172.16.100.11")
declare -a RSSTATUS
RW=("2" "1")
RPORT=80 
TYPE=g 
CHKLOOP=3 
LOG=/var/log/ipvsmonitor.log
addrs() { 
ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2
[ $? -eq 0 ] && return 0 || return 1
} 
delrs() { 
ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
[ $? -eq 0 ] && return 0 || return 1
} 
checkrs() {  local I=1 while [ $I -le $CHKLOOP ]; do if curl --connect-timeout 1 http://$1 &> /dev/null; then return 0 fi let I++ done return 1 
} 
initstatus() {  local I local COUNT=0;
for I in ${RS[*]}; do if ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null ; then
RSSTATUS[$COUNT]=1
else
RSSTATUS[$COUNT]=0
A++ 
Dir[0]=$A  fi let COUNT++
done
} 
initstatus  while :; do let COUNT=0 for I in ${RS[*]}; do if checkrs $I; then if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then
addrs $I ${RW[$COUNT]}
[ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && echo "`date +‘%F %H:%M:%S‘`, $I is back." >> $LOG
fi else if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then
delrs $I 
[ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date +‘%F %H:%M:%S‘`, $I is gone." >> $LOG
fi fi 
let COUNT++ done sleep 5 done

check-lvs-health.sh

#!/bin/bash # # chkconfig: - 88 12 # description: LVS script for VS/NAT # . /etc/rc.d/init.d/functions # VIP=192.168.0.200
DIP=172.16.100.1 RIP1=172.16.100.10 RIP2=172.16.100.11
#
case "$1" in start) # /sbin/ifconfig eth1:0 $VIP netmask 255.255.255.0 up # Since this is the Director we must be able to forward packets
  echo 1 > /proc/sys/net/ipv4/ip_forward # Clear all iptables rules.
  /sbin/iptables -F # Reset iptables counters.
  /sbin/iptables -Z # Clear all ipvsadm rules/services.
  /sbin/ipvsadm -C # Add an IP virtual service for VIP 192.168.0.219 port 80 # In this recipe, we will use the round-robin scheduling method. # In production, however, you should use a weighted, dynamic scheduling method.
  /sbin/ipvsadm -A -t $VIP:80 -s rr # Now direct packets for this VIP to # the real server IP (RIP) inside the cluster
  /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -m /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -m /bin/touch /var/lock/subsys/ipvsadm.lock ;; stop) # Stop forwarding packets
  echo 0 > /proc/sys/net/ipv4/ip_forward # Reset ipvsadm
  /sbin/ipvsadm -C # Bring down the VIP interface
ifconfig eth1:0 down rm -rf /var/lock/subsys/ipvsadm.lock ;; status) [ -e /var/lock/subsys/ipvsadm.lock ] && echo "ipvs is running..." || echo "ipvsadm is stopped..." ;; *) echo "Usage: $0 {start|stop}" ;; esac lvs-nat-director.sh


















































































































以上是关于LVS原理详解以及部署的主要内容,如果未能解决你的问题,请参考以下文章

LVS原理详解以及部署

lvs原理及安装部署详解(参考)

LVS原理详解(3种工作模式及8种调度算法)

集群------LVS-DR负载均衡群集(部署过程图文详解)

LVS原理详解

使用 LVS 实现负载均衡原理及安装配置详解