首页 > 技术文章 > lvs集群

shipment 2020-07-23 11:32 原文

1. LVS集群介绍

1.1 集群介绍

1. 集群是什么?

集群是一组协同工作的服务器,对外表现为一个整体。

集群的意义:更好的利用现有资源实现服务的高度可用

集群扩展方式:

  • 垂直扩展:更换服务器硬件
  • 水平扩展:添加更多的服务器节点

2. 集群的分类

  • 负载均衡集群-LBC

    使用意图:减轻单台服务器的压力,将用户请求分担给多台主机一起处理。

    实现方法:硬件:典型代表F5 软件:LVS Nginx HaProxy RAC 等

    使用范围:业务并发较大的应用程序

  • 高可用集群-HAC

    使用意图:最大限度的保证用户的应用持久,不间断的提供服务

    实现原理:心跳检测

    实现方法:硬件:F5 软件:heartbeat Linux-HA keepalived

    使用范围:需要持续提供服务的应用程序

  • 高性能运算集群-HPC

    使用意图:提供单台计算机所不具备的计算能力

    负载均衡集群和高性能运算集群的原理对比:

    负载均衡集群通过提高单位时间内的执行的任务数来提升效率

    高性能运算集群通过缩短单个任务的执行时间来提高效率

1.2 LVS介绍

LVS,是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目。LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。

LVS特点:

通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。LVS的主要特点有以下几个方面:

  • 负载能力强:LVS基于内核网络层面工作,有超强的承载能力和并发处理能力。单台LVS负载均衡器,可支持上万并发连接。稳定性强:是工作在网络4层之上仅作分发之用,这个特点也决定了它在负载均衡软件里的性能最强,稳定性最好,对内存和cpu资源消耗极低。

  • 成本低廉:硬件负载均衡器少则十几万,多则几十万上百万,LVS只需一台服务器和就能免费部署使用,性价比极高。

  • 配置简单:LVS配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理。

  • 支持多种算法:支持多种论调算法,可根据业务场景灵活调配进行使用
    支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。

  • 应用范围广:因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、DNS、ftp服务等等

2. LVS工作原理

iptabls工作原理

LVS工作原理:

  1. 当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。
  2. 当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。
  3. LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将经过INPUT链送至用户空间,交给用户空间的进程来处理。
  4. 如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。
  5. 最后经由POSTROUTING链发往后端服务器。

LVS常见术语

LVS中有一些常见的术语,如下表所示:

名称 解释
ipvsadm 用户空间的命令行工具,用于管理集群服务及集群服务上的RS等;
IPVS 工作于内核上的netfilter INPUT HOOK之上的程序,可根据用户定义的集群实现请求转发;
VS Virtual Server ,Director Server(DS),Dispatcher(调度器),Load Balancer
Director, Balancer 负载均衡器、分发器
RS Real Server(lvs),upstream server(nginx), backend server(haproxy)
CIP Client IP,客户端IP
VIP Director Virtual IP,负载均衡器虚拟IP , VS的外网IP
DIP Director IP,负载均衡器IP
RIP Real Server IP,后端请求处理服务器IP

3. LVS 4种工作模式和与十种调度算法

3.1 LVS集群工作模式

​ lvs-nat : 修改请求报文的目标IP,多目标的DNAT

​ lvs-dr : 操纵封装新的MAC地址

​ lvs-tun : 在原有请求IP报文之外加一个IP首部

​ lvs-fullnat : 修改请求报文的源和目标IP

3.1.1 LVS的NAT模式

lvs-nat : 本质是多目标IP的DNAT

  1. client 发送请求 给VIP;

  2. VIP 收到package后,会根据LVS设置的LB算法选择一个合适的RealServer,然后把package 的目的IP 修改为RIP:

  3. RealServer 收到这个package后判断目的ip 是自己,就处理这个package ,处理完后把这个包发送给LVS VIP

  4. LVS 收到这个package 后把源ip改成VIP的IP,dst ip改成 client ip然后发送给client:

NAT 模式的注意事项:

NAT 模式修改的是dst IP,直接走 switch 或pub 不需要修改MAC 所以,不需要VIP 和realserver 同在一个网段内。 NAT 模式 package in 和package out 都需要经过LVS ;因此LVS 的可能会成为一个系统瓶颈问题。

3.1.2 LVS的DR模式

DR模式原理过程简述:

客户端将请求报文通过VIP发送给DR,DR模式将报文直接路由给目标真实服务器。在DR模式中,调度器根据调度算法选择RS来处理请求,不修改目标IP地址和目标端口,也不封装IP报文,而是将请求报文的数据帧的目标MAC地址改为真实服务器的MAC地址。然后再将修改的数据帧在服务器组的局域网上发送。因为数据帧的MAC地址是真实服务器的MAC地址,并且又在同一个局域网。那么根据局域网的通讯原理,RS是一定能够收到由DR发出的数据包。RS接收到请求数据包的时候,解开IP包头查看到的目标IP是VIP。(此时只有自己的IP符合目标IP才会接收进来,所以我们需要在本地的回环接口上面配置VIP。另:由于网络接口都会进行ARP广播响应,集群的其他机器都有这个VIP的lo接口,都响应就会冲突。所以我们需要把RS的lo接口的ARP响应关闭掉,抑制arp请求。)然后真实服务器做成请求响应,之后根据自己的路由信息将这个响应数据包发送回给客户,并且源IP地址还是VIP。

LVS-DR模式的注意情况:

VS 的VIP 和 RS 必须在同一个网段,不然广播后所有的包都会丢掉: 提前确认LVS/硬件LB 是什么模式,是否需要在同一个网段 所有的RS都必须绑定VIP的IP地址,否则RS收到package后发现dst 不是自己的IP,所有包都会丢掉。 RS处理完包后直接把package 通过dst IP 发送给 client ,不通过LVS/迎接IP 了这样的LVS /VIP 效率会更高一点。【通过把realserver的ip暴漏给外界,不是很安全】

3.1.3 LVS的TUN模式

原理图过程简述:

1)客户请求数据包,目标地址VIP发送到DR上。

2)DR接收到客户请求包,进行IP Tunnel封装。即在原有的包头加上IP Tunnel的包头。然后发送出去。

3)DR节点服务器根据IP Tunnel包头信息(此时就有一种逻辑上的隐形隧道,只有DR和RS知道)收到请求包,然后解开IP Tunnel包头信息,得到客户的请求包并进行响应处理。

4)响应处理完毕之后,RS服务器使用自己的出公网的线路,将这个响应数据包发送给客户端。源IP地址还是VIP地址。

NAT模式优缺点:
优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。

缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。

3.1.4 LVS的FULLNAT

原理:

在包从DIR转到 RS 的过程中,源地址从客户端IP被替换成了LVS 的内网IP。内网IP之间可以通过多个交换机跨VLAN通信。

当RS处理完接受到的包,返回时,会将这个包返回给DIR的内网IP,这一步也不受限于 VLAN。

DIR收到包后,在NAT模式修改源地址的基础上,再把RS发来的包中的目标地址从DIR内网IP改为客户端的 IP。

Full-NAT主要的思想是把网关和其下机器的通信,改为了普通的网络通信,从而解决了跨VLAN 的问题。采用这种方式,DIR和RS的部署在VLAN上将不再有任何限制,大大提高了运维部署的便利性。

3.2 十种调度算法

LVS调度算法分为静态和动态两类:

静态算法(4种):

只根据算法进行调度 而不考虑后端服务器的实际连接情况和负载情况

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

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

DH:目标地址散列调度(Destination Hash )
根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

SH:源地址 hash(Source Hash)
源地址散列”调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

动态算法(6种):
前端的调度器会根据后端真实服务器的实际连接情况来分配请求

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

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

SED:最短延迟调度(Shortest Expected Delay )
在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。

NQ永不排队/最少队列调度(Never Queue Scheduling NQ)
无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空间。在SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲着,不考虑非活动连接,才用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力。

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

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

4.LVS相关配置

LVS-DR配置

DR模式是通过director将报文源和目标MAC地址修改,发送给RS,RS将响应报文直接发送给client。

环境说明:

LVS服务器(DR) DIP:192.168.32.125 VIP:192.168.32.250
apache服务器(RS) IP:192.168.32.130 VIP:192.168.32.250
apache服务器(RS) IP:192.168.32.135 VIP:192.168.32.250

三台机器分别配置了对应的本地静态地址DIP和RIP,VIP之后配置

LVS服务器配置

  LVS是被编译进内核中,主要分为两部分ipvs和ipvsadm,ipvs是LVS软件核心,是运行在LB上的,这是个基于ip层的负载均衡;ipvsadm是用户空间的集群管理工具。

​ 要想起到负载均衡效果,那么所有请求报文必须发往LVS服务器(DS),然后DS根据指定算法分发到后端服务器上,因此DS必须配置VIP地址,VIP是与公网client通信地址,这样DS才能接受到请求报文进行分发。

#安装ipvsadm工具
[root@dr ~]# yum -y install ipvsadm
[root@dr ~]# ip addr add 192.168.32.250/32 dev eth0
[root@dr ~]# ip a
[root@localhost network-scripts]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:39:18:a9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.32.125/24 brd 192.168.32.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.32.250/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe39:18a9/64 scope link 
       valid_lft forever preferred_lft forever

RS服务器配置

arp_ignore和arp_announce内核参数

arp_announce : INTEGER

对网络接口上本地IP地址发出的ARP报文作出相应级别的限制。

0:本机所有IP地址都向任何一个接口通告ARP报文。

1:尽量仅向该网卡回应与该网段匹配的ARP报文。

2:只向该网卡回应与该网段匹配的ARP报文。

arp_ignore : INTEGER

定义对目标地址为本地IP的ARP询问不同的应答模式。

0:响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上。

1:只响应目的IP地址为接收网卡上的本地地址的arp请求。

2:只响应目的IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段。

3:如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包。

4~7:预留。

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

[root@rs ~]# vim /etc/sysctl.conf
#添加以下两行
net.ipv4.conf.all.arp_ignore = 1
# 将对应网卡设置为只回应目标IP为自身接口地址的ARP请求
net.ipv4.conf.all.arp_announce = 2
# 将ARP请求的源IP设置为eth0上的IP,也就是RIP

[root@rs ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2



##两台RS都要进行以上操作

配置VIP

一定要先设置好内核参数在配置VIP,如果先配置VIP,VIP配置好后会立即通告给所有人,而修改内核参数就是为了不通告

#两台RS都要配置
[root@rs ~]# ip addr add 192.168.32.250/32 dev lo

配置路由信息

所有RS上都要做

[root@rs ~]# route add -host 192.168.32.250/32 dev lo
[root@rs ~]# route add -host 192.168.32.250/32 dev lo
#永久配置
echo '192.168.32.250/32 via 0.0.0.0 dev lo' > /etc/sysconfig/network-scripts/route-lo



[root@dr ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.32.2    0.0.0.0         UG    100    0        0 eth0
192.168.32.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0
192.168.32.250  0.0.0.0         255.255.255.255 UH    0      0        0 lo

[root@rs ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.32.2    0.0.0.0         UG    100    0        0 ens33
192.168.32.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.32.250  0.0.0.0         255.255.255.255 UH    0      0        0 lo


在DR上添加并保存ipvs规则

在director上添加并保存规则:

ipvsadm -A -t vip:port -s wrr

ipvsadm -a -t vip:port -r rip:port -g -w权重

ipvsadm -S > /etc/sysconfig/ipvsadm

[root@dr ~]# ipvsadm -A -t 192.168.32.250:80 -s wrr
# 添加虚拟服务,指定IP、端口、算法
[root@dr ~]# ipvsadm -a -t 192.168.32.250:80 -r 192.168.32.130:80 -g
[root@dr ~]# ipvsadm -a -t 192.168.32.250:80 -r 192.168.32.135:80 -g

[root@dr ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  dr:http wrr
  -> 192.168.32.130:http          Route   1      0          0         
  -> 192.168.32.135:http          Route   1      0          0  
  
[root@dr ~]# ipvsadm -S > /etc/sysconfig/ipvsadm

验证

[root@rs ~]# cat /var/www/html/index.html 
http1
[root@rs ~]# cat /var/www/html/index.html 
http2
#在另一台主机上验证
[root@localhost ~]# for i in $(seq 10);do curl 192.168.32.250:80;done
http1
http2
http1
http2
http1
http2
http1
http2
http1
http2

LVS-DR模式要点

几点思考
1、为什么所有RS上都要配置VIP
因为当调度器把请求转发给对应RS时,并没有修改报文目的IP,因此请求报文目的IP仍为VIP,所以如果RS没有配置VIP,那么报文到达RS后就会被丢弃。

2、为什么所有RS要设置arp_ignore=1和arp_announce=2
arp_ignore=1:只响应目的IP地址为接收网卡上的本地地址的arp请求

因为我们在RS上都配置了VIP,因此此时是存在IP冲突的,当外部客户端向VIP发起请求时,会先发送arp请求,此时调度器和RS都会响应这个请求。如果某个RS响应了这个请求,则之后该客户端的请求就都发往该RS,并没有经过LVS,因此也就没有真正的负载均衡,LVS也就没有存在的意义。因此我们需要设置RS不响应对VIP的arp请求,这样外部客户端的所有对VIP的arp请求才会都解析到调度器上,然后经由LVS的调度器发往各个RS。

系统默认arp_ignore=0,表示响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上。也就是说,如果机器上有两个网卡设备A和B,即使在A网卡上收到对B IP的arp请求,也会回应。而arp_ignore设置成1,则不会对B IP的arp请求进行回应。由于lo肯定不会对外通信,所以如果只有一个对外网口,其实只要设置这个对外网口即可,不过为了保险,很多时候都对all也进行设置。

arp_announce=2:网卡在发送arp请求时使用出口网卡IP作为源IP

当RS处理完请求,想要将响应发回给客户端,此时想要获取目的IP对应的目的MAC地址,那么就要发送arp请求。arp请求的目的IP就是想要获取MAC地址的IP,那arp请求的源IP呢?自然而然想到的是响应报文的源IP地址,但也不是一定是这样,arp请求的源IP是可以选择的,而arp_announce的作用正是控制这个地址如何选择。系统默认arp_announce=0,也就是源ip可以随意选择。这就会导致一个问题,如果发送arp请求时使用的是其他网口的IP,达到网络后,其他机器接收到这个请求就会更新这个IP的mac地址,而实际上并不该更新,因此为了避免arp表的混乱,我们需要将arp请求的源ip限制为出口网卡ip,因此需要设置arp_announce=2。

3、为什么RS上的VIP要配置在lo上
由上可知,只要RS上的VIP不响应arp请求就可以了,因此不一定要配置在lo上,也可以配置在其他网口。由于lo设备不会直接接收外部请求,因此只要设置机器上的出口网卡不响应非本网卡上的arp请求接口。但是如果VIP配置在其他网口上,除了上面的配置,还需要配置该网口不响应任何arp请求,也就是arp_ignore要设置为8。

4、为什么RS上lo配置的VIP掩码为32位
这是由于lo设备的特殊性导致, 如果lo绑定192.168.0.200/24,则该设备会响应该网段所有IP(192.168.0.1~192.168.0.254) 的请求,而不是只响应192.168.0.200这一个地址。

5、为什么调度器与RS要在同一网段中
根据DR模式的原理,调度器只修改请求报文的目的mac,也就是转发是在二层进行,因此调度器和RS需要在同一个网段,从而ip_forward也不需要开启。

推荐阅读