目录

Lvs原理及实践

简介

LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(real server)上。为了避免不同机器上用户请求得到的数据不一样,需要用到了共享存储,这样保证所有用户请求的数据是一样的。

LVS是 Linux Virtual Server 的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网站是 http://www.linuxvirtualserver.org 现在 LVS 已经是 Linux 内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。

基本工作原理

LVS 工作在二层/三层/四层最底层,仅作分发之用,对 CPU 和内存消耗极低,抗负载能力极强。所以它几乎可以对所有应用做负载均衡,包括 HTTP、数据库、在线聊天室等,并且 LVS 的 4 种工作模式、10 种调度算法使其在负载均衡端有更灵活的策略选择。

https://tc.ctq6.cn/tc/20220426153653.png

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

LVS是四层负载均衡,也就是说建立在OSI模型的第四层——传输层之上,传输层上有我们熟悉的TCP/UDP,LVS支持TCP/UDP的负载均衡。因为LVS是四层负载均衡,因此它相对于其它高层负载均衡的解决办法,比如DNS域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的。

LVS的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。

LVS 组成

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

IPVS 是直接作用在内核空间进行数据包的修改及转发的。而 Nginx/HAProxy 作用在用户空间,这使得 LVS 的性能更强。

Ipvsadm:工作在用户空间,主要用于用户定义和管理集群服务的工具。所以实际在安装配置 LVS 时,主要是安装配置 Ipvsadm。

工作模式介绍及分析

LVS 二层 DR 模式原理

https://tc.ctq6.cn/tc/20220426154823.png

(1) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP

(2) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链

(3) IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址

(4) 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。

(5) RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP

(6) 响应报文最终送达至客户端

LVS/DR 模式的特点

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

DR(Direct Routing 直接路由模式)此模式时LVS 调度器只接收客户发来的请求并将请求转发给后端服务器,后端服务器处理请求后直接把内容直接响应给客户,而不用再次经过LVS调度器。LVS只需要将网络帧的MAC地址修改为某一台后端服务器RS的MAC,该包就会被转发到相应的RS处理,注意此时的源IP和目标IP都没变。RS收到LVS转发来的包时,链路层发现MAC是自己的,到上面的网络层,发现IP也是自己的,于是这个包被合法地接受,RS感知不到前面有LVS的存在。而当RS返回响应时,只要直接向源IP(即用户的IP)返回即可,不再经过LVS。

注意:

(1) 确保前端路由器将目标IP为VIP的请求报文发往Director;

(2) RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director;

(3) RS跟Director要在同一个物理网络;

(4) 请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client;

(5) 此模式不支持端口映射;

缺点: 唯一的缺陷在于它要求LVS 调度器及所有应用服务器在同一个网段中,因此不能实现集群的跨网段应用。

优点: 可见在处理过程中LVS Route只处理请求的直接路由转发,所有响应结果由各个应用服务器自行处理,并对用户进行回复,网络流量将集中在LVS调度器之上。

LVS 三层 IPTunnel 模式原理

https://tc.ctq6.cn/tc/20220427152348.png

(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) 响应报文最终送达至客户端

LVS/TUN模型特性

TUN(virtual server via ip tunneling IP 隧道)调度器把请求的报文通过IP隧道转发到真实的服务器。真实的服务器将响应处理后的数据直接返回给客户端。这样调度器就只处理请求入站报文。此转发方式不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP),由于一般网络服务应答数据比请求报文大很多,采用lvs-tun模式后,集群系统的最大吞吐量可以提高10倍。

注意

(1) DIP, VIP, RIP都应该是公网地址;

(2) RS的网关不能,也不可能指向DIP;

(3) 请求报文要经由Director,但响应不能经由Director;

(4) 此模式不支持端口映射;

(5) RS的操作系统得支持隧道功能

缺点:

由于后端服务器RS处理数据后响应发送给用户,此时需要租借大量IP(特别是后端服务器使用较多的情况下)。

优点:

实现lvs-tun模式时,LVS 调度器将TCP/IP请求进行重新封装并转发给后端服务器,由目标应用服务器直接回复用户。应用服务器之间是通过IP 隧道来进行转发,故两者可以存在于不同的网段中。

LVS 四层 NAT 模式原理

https://tc.ctq6.cn/tc/20220427154241.png

(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

LVS/NAT模型的特性

NAT(Network Address Translation 网络地址转换)是一种外网和内外地址映射的技术,内网可以是私有网址,外网可以使用NAT方法修改数据报头,让外网与内网能够互相通信。NAT模式下,网络数据报的进出都要经过LVS的处理。LVS需作为RS(真实服务器)的网关。当包到达LVS时,LVS做目标地址转换(DNAT),将目标IP改为RS的IP。RS接收到包以后,仿佛是客户端直接发给它的一样。RS处理完,返回响应时,源IP是RS IP,目标IP是客户端的IP。这时RS的包通过网(LVS)中转,LVS会做源地址转换(SNAT),将包的源地址改为VIP,这样,这个包对客户端看起来就仿佛是LVS直接返回给它的。客户端无法感知到后端RS的存在。

注意

(1)RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP;

(2)请求报文和响应报文都必须经由Director转发;Director易于成为系统瓶颈;

(3)支持端口映射,可修改请求报文的目标PORT;

(4)vs必须是Linux系统,rs可以是任意系统;

缺点:

在整个过程中,所有输入输出的流量都要经过LVS 调度服务器。显然,LVS 调度服务器的网络I/O压力将会非常大,因此很容易成为瓶颈,特别是对于请求流量很小,而响应流量很大的Web类应用来说尤为如此。

优点:

NAT模式的优点在于配置及管理简单,由于了使用NAT技术,LVS 调度器及应用服务器可以在不同网段中,网络架构更灵活,应用服务器只需要进行简单的网络设定即可加入集群。

LVS 四层 FULLNAT 模式原理

LVS 本身不支持 FULLNAT 模式,需要额外对内核打补丁后才能使用

https://tc.ctq6.cn/tc/20220427155309.png

(1) 当用户请求到达Director Server后,Director Server会对请求数据包同时做 SNAT 和 DNAT,将请求数据包修改为:{ 均衡出口 IP 地址、端口号、Director的 MAC 地址 } ➡️ { RS的 IP 地址、RS的端口号、RS的 MAC 地址 }。

(2) 这样Director就可以独立的和RS进行数据包的传送。

(3) RS收到请求的数据包,返回响应的数据包:{ RS的 IP 地址、RS的端口号、RS的 MAC 地址 } ➡️ { Director的 IP 地址、端口号、Director的 MAC 地址 } 。此时在RS上查看 TCP 连接为:DIP ➡️ RIP。

(4) 当返回的数据包到达Director后,Director将返回数据包再次同时做 DNAT 和 SNAT。

(5) Director返回数据包给客户端。

LVS/FULLNAT 模式特点

1.同时修改数据包的「源 IP 地址」和「目标 IP 地址」,可以对端口进行转发

2.Director不需要以网关的形式存在,即Director可以和真实服务器在不同的网络中

3.RS最终建立的连接是 DIP ➡️ RIP,无法获取真实客户端的 IP 地址

4.所有的请求数据包、响应数据包都要经过Director

注意

(1) VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP;

(2) RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client;

(3) 请求和响应报文都经由Director;

(4) 支持端口映射;

LVS 调度算法

  • 静态调度

    1、rr(Round Robin):轮询调度,轮叫调度

    轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。【提示:这里是不考虑每台服务器的处理能力】

    2、wrr:weight,加权(以权重之间的比例实现在各主机之间进行调度)

    由于每台服务器的配置、安装的业务应用等不同,其处理能力会不一样。所以,我们根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。

    3、sh:source hashing,源地址散列。主要实现会话绑定,能够将此前建立的session信息保留了

    源地址散列调度算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的并且没有超负荷,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同。它的算法流程与目标地址散列调度算法的基本相似,除了将请求的目标IP地址换成请求的源IP地址,所以这里不一个一个叙述。

    4、Dh:Destination hashing:目标地址散列。把同一个IP地址的请求,发送给同一个server。

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

  • 动态调度

    1、lc(Least-Connection):最少连接

    最少连接调度算法是把新的连接请求分配到当前连接数最小的服务器,最小连接调度是一种动态调度短算法,它通过服务器当前所活跃的连接数来估计服务器的负载均衡,调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1,当连接中止或超时,其连接数减一,在系统实现时,我们也引入当服务器的权值为0时,表示该服务器不可用而不被调度。

    简单算法:active*256+inactive(谁的小,挑谁)

    2、wlc(Weighted Least-Connection Scheduling):加权最少连接。

    加权最小连接调度算法是最小连接调度的超集,各个服务器用相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权限,加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。

    简单算法:(active*256+inactive)/weight【(活动的连接数+1)/除以权重】(谁的小,挑谁)

    3、sed(Shortest Expected Delay):最短期望延迟

    基于wlc算法

    简单算法:(active+1)*256/weight 【(活动的连接数+1)*256/除以权重】

    4、nq(never queue):永不排队(改进的sed)

    无需队列,如果有台realserver的连接数=0就直接分配过去,不需要在进行sed运算。

    5、LBLC(Locality-Based Least Connection):基于局部性的最少连接

    基于局部性的最少连接算法是针对请求报文的目标IP地址的负载均衡调度,不签主要用于Cache集群系统,因为Cache集群中客户请求报文的布标IP地址是变化的,这里假设任何后端服务器都可以处理任何请求,算法的设计目标在服务器的负载基本平衡的情况下,将相同的目标IP地址的请求调度到同一个台服务器,来提高个太服务器的访问局部性和主存Cache命中率,从而调整整个集群系统的处理能力。

    基于局部性的最少连接调度算法根据请求的目标IP地址找出该目标IP地址最近使用的RealServer,若该Real Server是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。

    6、LBLCR(Locality-Based Least Connections withReplication):带复制的基于局部性最少链接

    带复制的基于局部性最少链接调度算法也是针对目标IP地址的负载均衡,该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

LVS 部署实践

开启Linux的路由转发功能

修改/etc/sysctl.conf配置文件,添加如下配置

1
net.ipv4.ip_forward=1

执行如下命令生效

1
sysctl -p

配置真实服务器的ARP请求与响应策略

修改/etc/sysctl.conf配置文件,添加如下配置

1
2
3
4
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_announce=2

执行如下命令生效

1
sysctl -p

配置真实服务器的反向路由过滤策略

LVS 在 VS/TUN 模式下,需要对 tunl0 虚拟网卡的反向路由过滤策略进行配置。最直接的办法是把其值设置为 0

修改/etc/sysctl.conf配置文件,添加如下配置

1
2
net.ipv4.conf.tunl0.rp_filter=0
net.ipv4.conf.all.rp_filter=0

执行如下命令生效

1
sysctl -p

配置tunl0网卡

LVS 在 VS/TUN 模式下,需要在每个真实服务器上开启 tunl0 网卡,并把 VIP 配置到 tunl0 网卡上

LVS 在 VS/TUN 模式下 因为 Director 主机需要通过 ipip 协议向 RealServer 分发数据包;所以需要在 RealServer 上配置防火墙,允许 ipip 协议的数据包通过

1
iptables -I INPUT 1 -p 4 -j ACCEPT

使用ipvsadm 配置LVS负载均衡

基于LVS NAT模式配置

1、基础环境准备

三台服务器,一台作为 director,两台作为 real server,director 有一个外网网卡(8.218.132.149) 和一个内网ip(172.28.81.5),两个 real server 上只有内网 ip (172.28.80.1) 和 (172.28.80.2),并且需要把两个 real server 的内网网关设置为 director 的内网 ip(172.28.81.5)

2、安装准备

  • 两个 real server 上都安装 nginx 服务
    1
    2
    3
    4
    5
    6
    
    yum install -y nginx
    # rs1上执行
    echo 'RS 172.28.80.1' > /usr/share/nginx/html/index.html
    # rs2上执行
    echo 'RS 172.28.80.2' > /usr/share/nginx/html/index.html
    systemctl start nginx
    
  • Director 上安装 ipvsadm
    1
    
    yum install -y ipvsadm
    

3、配置

  • Director开启路由转发功能
    1
    
    echo 1 > /proc/sys/net/ipv4/ip_forward
    
  • 关闭icmp重定向
    1
    2
    3
    
    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
    
  • Director设置NAT防火墙
    1
    2
    3
    
    iptables -t nat -F 
    iptables -t nat -X 
    iptables -t nat -A POSTROUTING -s 172.28.0.0/20 -j MASQUERADE
    
  • Director设置ipvsadm
    1
    2
    3
    4
    
    ipvsadm -C
    ipvsadm -A -t 8.218.132.149:80 -s wrr 
    ipvsadm -a -t 8.218.132.149:80 -r 172.28.80.1:80 -m -w 1 
    ipvsadm -a -t 8.218.132.149:80 -r 172.28.80.2:80 -m -w 1
    

4、查看ipvsadm设置规则

1
ipvsadm -ln

https://tc.ctq6.cn/tc/20220427191335.png

5、测试LVS的效果 通过浏览器测试2台机器上的web内容 http://8.218.132.149 https://tc.ctq6.cn/tc/20220427191831.png

手动关闭RS1上nginx服务,测试调度是否正常,可见ipvsadm无法自动剔除异常的RS https://tc.ctq6.cn/tc/20220427192430.png

此时需要手动修改ipvsadm规则,清除异常的RS

1
ipvsadm -d -t 8.218.132.149:80 -r 172.28.80.1:80

再次测试发现,访问正常,都调度到正常的RS2上 https://tc.ctq6.cn/tc/20220427193227.png

基于LVS DR模式配置

1、基础环境准备

三台节点

Director节点: (eth0 192.168.10.176 vip eth0:0 192.168.10.200) Real server1: (eth0 192.168.10.177 vip lo:0 192.168.10.200) Real server2: (eth0 192.168.10.178 vip lo:0 192.168.10.200)

2、安装准备

  • 两个 real server 上都安装 nginx 服务
    1
    2
    3
    4
    5
    6
    
    yum install -y nginx
    # rs1上执行
    echo 'RS 192.168.10.177' > /usr/share/nginx/html/index.html
    # rs2上执行
    echo 'RS 192.168.10.178' > /usr/share/nginx/html/index.html
    systemctl start nginx
    
  • Director 上安装 ipvsadm
    1
    
    yum install -y ipvsadm
    

3、配置

  • Director配置内核参数
    1
    
    echo 1 > /proc/sys/net/ipv4/ip_forward
    
  • 关闭icmp重定向
    1
    2
    3
    
    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/enp0s3/send_redirects
    
  • Director设置ipvsadm
    1
    2
    3
    4
    5
    6
    7
    
    ifconfig enp0s3:0 down 
    ifconfig enp0s3:0 192.168.10.200 broadcast 192.168.10.200 netmask 255.255.255.255 up 
    route add -host 192.168.10.200 dev enp0s3:0
    ipvsadm -C
    ipvsadm -A -t 192.168.10.200:80 -s wrr 
    ipvsadm -a -t 192.168.10.200:80 -r 192.168.10.177:80 -g -w 3
    ipvsadm -a -t 192.168.10.200:80 -r 192.168.10.178:80 -g -w 1
    
  • Rs配置
    1
    2
    3
    4
    5
    6
    
    ifconfig lo:0 192.168.10.200 broadcast 192.168.10.200 netmask 255.255.255.255 up 
    route add -host 192.168.10.200 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、测试LVS的效果 通过浏览器测试2台机器上的web内容 http://192.168.10.200

https://tc.ctq6.cn/tc/20220427221701.png

手动关闭RS2上nginx服务,测试调度是否正常,可见ipvsadm无法自动剔除异常的RS https://tc.ctq6.cn/tc/20220427221846.png

此时需要手动修改ipvsadm规则,清除异常的RS

1
ipvsadm -d -t 192.168.10.200:80 -r 192.168.10.177:80

再次测试发现,访问正常,都调度到正常的RS2上

https://tc.ctq6.cn/tc/20220427221947.png

基于LVS TUN模式配置

1、基础环境准备

三台节点

Director节点: (eth0 192.168.10.176 vip eth0:0 192.168.10.200) Real server1: (eth0 192.168.10.177 vip lo:0 192.168.10.200) Real server2: (eth0 192.168.10.178 vip lo:0 192.168.10.200)

2、安装准备

  • 两个 real server 上都安装 nginx 服务
    1
    2
    3
    4
    5
    6
    
    yum install -y nginx
    # rs1上执行
    echo 'RS 192.168.10.177' > /usr/share/nginx/html/index.html
    # rs2上执行
    echo 'RS 192.168.10.178' > /usr/share/nginx/html/index.html
    systemctl start nginx
    
  • Director 上安装 ipvsadm
    1
    
    yum install -y ipvsadm
    

3、配置

  • Director配置内核参数
    1
    
    echo 1 > /proc/sys/net/ipv4/ip_forward
    
  • 添加TUN隧道
    1
    
    modprobe ipip
    
  • 给隧道绑定VIP
    1
    
    ip addr add 192.168.10.200/32 dev tunl0
    
  • 激活隧道
    1
    
    ip link set up tunl0
    
  • Director设置ipvsadm
    1
    2
    3
    4
    
    ipvsadm -C
    ipvsadm -A -t 192.168.10.200:80 -s wrr 
    ipvsadm -a -t 192.168.10.200:80 -r 192.168.10.177:80 -i -w 3
    ipvsadm -a -t 192.168.10.200:80 -r 192.168.10.178:80 -i -w 1
    
  • Rs配置 添加TUN隧道
    1
    
    modprobe ipip
    
    给隧道绑定VIP
    1
    
    ip addr add 192.168.10.200/32 dev tunl0
    
    修改rp_filter参数全为0 激活隧道
    1
    
    ip link set up tunl0
    
    修改/etc/sysctl.conf,将rp_filter参数全改为0
    1
    2
    3
    4
    5
    6
    
    net.ipv4.conf.default.rp_filter = 0
    net.ipv4.conf.all.rp_filter = 0
    net.ipv4.conf.default.rp_filter = 0
    net.ipv4.conf.docker0.rp_filter = 0
    net.ipv4.conf.enp0s3.rp_filter = 0
    net.ipv4.conf.tunl0.rp_filter = 0
    
    重新加载配置
    1
    
    sysctl -p
    

4、测试LVS的效果 通过浏览器测试2台机器上的web内容 http://192.168.10.200

https://tc.ctq6.cn/tc/20220427221701.png

手动关闭RS1上nginx服务,测试调度是否正常,可见ipvsadm无法自动剔除异常的RS https://tc.ctq6.cn/tc/20220428082824.png

此时需要手动修改ipvsadm规则,清除异常的RS

1
ipvsadm -d -t 192.168.10.200:80 -r 192.168.10.177:80

再次测试发现,访问正常,都调度到正常的RS2上

https://tc.ctq6.cn/tc/20220428082907.png