lvs集群
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工作原理
LVS工作原理:
- 当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。
- 当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。
- LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将经过INPUT链送至用户空间,交给用户空间的进程来处理。
- 如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。
- 最后经由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
-
client 发送请求 给VIP;
-
VIP 收到package后,会根据LVS设置的LB算法选择一个合适的RealServer,然后把package 的目的IP 修改为RIP:
-
RealServer 收到这个package后判断目的ip 是自己,就处理这个package ,处理完后把这个包发送给LVS VIP
-
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_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也不需要开启。