云计算学习之路——LVS负载均衡

  • Post author:
  • Post category:其他




LVS



一、 负载均衡集群介绍



1、集群是什么?

集群技术是一种较新的技术,可以在付出较低成本的情况下获得在性能、可靠性、灵活性等方面的相对较高的收益,其任务调度则是集群系统中的核心技术。

集群组成后,可以利用多个计算机和组合进行海量请求的处理(负载均衡),从而获得很高的处理效率,也可以用多个计算机做备份(高可用),使得任意一个机器坏了整个系统仍然能够正常运行。



2、负载均衡集群技术

负载均衡(Load Balance):负载均衡集群为企业需求提供了可解决容量问题的有效方案。负载均衡集群使负载可以在计算机集群中尽可能平均分摊处理。

负载通常包括应用程序处理负载和网络流量负载,每个节点都可以承担一定的处理负载,并且使用不同负载均衡算法可以实现处理负载在节点之间的动态分配,以实现负载均衡。



3、负载均衡集群技术实现方式和产品

负载均衡技术类型:

4层负载均衡技术



7层负载均衡技术


负载均衡实现方式:硬件负载均衡设备或

软件负载均衡


硬件负载均衡产品:F5、深信服、Redware

软件负载均衡产品:

LVS

(Linux Virtual Server)、

Haproxy



Nginx

、Ats(Apache traffic server)



4、负载均衡实现效果图

在这里插入图片描述



5、负载均衡分类

1、二层负载均衡(mac):

一般是用虚拟mac地址方式,外部对虚拟mac地址请求,负载均衡器接收后分配后端实际的mac地址。

2、三层负载均衡(ip):

一半采用虚拟ip地址方式,外部请求虚拟ip地址,负载均衡接收后分配后段实际的ip地址。

3、

四层负载均衡

(tcp):


在三层负载均衡的基础上,用ip+port接受请求,再转发到对应的机器上,是局域IP和端口的负载均衡。


实现四层负载均衡的产品有:

F5:硬件负载均衡器,功能很好,但成本高。


LVS:重量级的私藏负载均衡软件


nginx:轻量级的四层负载均衡软件,带有缓存功能,正则表达式灵活。

haproxy:模拟四层转发,较灵活。

4、

七层负载均衡

(http)


根据虚拟的url,ip或主机名接受请求,再转向相应的处理服务器。七层的负载均衡是基于虚拟的URL或主机IP的负载均衡

,它在四层负载均衡的基础上(没有四层绝对不可能有七层),再考虑应用层的特征,比如同一个web服务器的负载均衡,除了根据VIP+80端口辨别是否需要处理的流量,还可根据七层的URL,浏览器类别来决定是否要进行负载均衡。

实现七层负载均衡的软件有:


haproxy:天生的负载均衡技能,全面支持七层代理,会话保持,标记吗,路径转移;


nginx:只在http协议和mail协议上功能比较好,性能和haproxy差不多。



6、四层负载均衡与七层负载均衡的区别

区别 四层负载均衡 七层负载均衡
基于 基于IP+Port 基于虚拟URL或主机IP
类似于 路由器 代理服务器
复杂度 复杂度低 复杂度高
性能 性能高,无需解析内容 性能适中,需要算法识别URL,Cookie和http head等信息
安全性
额外功能 会话保持,图片压缩等

总结:从上面的对比看来四层负载与七层负载最大的区别就是效率与功能的区别。四层负载架构设计比较简单,无需解析具体的消息内容,在网络吞吐量及处理能力上会相对比较高,而七层负载均衡的优势则体现在功能多,控制灵活强大。在具体业务架构设计时,使用七层负载或者四层负载还得根据具体的情况综合考虑



二、LVS介绍

1、LVS简介

LVS 是Linux Virtual Server的简称,也就是 Linux 虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,因此性能较高,实现负载均衡的功能是由Linux操作系统内核完成的。

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

2、LVS的优点与不足


优点:



高并发连接:

LVS基于内核网络层面工作,有超强的承载能力和并发处理能力。单台LVS负载均衡器课支持上万并发连接。


稳定性强:

LVS是工作在网路四层之上做分发之用,这个特点也决定了它在负载均衡软件里的性能最强,稳定性最好,对内存和CPU资源消耗极低。


成本低廉:

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

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


支持多种算法:

支持多种论调算法,可根据业务场景灵活调配进行使用

支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。

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


不足


工作在4层,不支持7层规则修改,机制过于庞大,不适合小规模应用。

3、LVS的组成

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

1)ipvs(ip virtual server):一段工作于内核空间的代码程序,是真正生效实现调度的代码,可根据用户定义的集群实现转发请求。

2)ipvsadm:用户空间的命令行工具,用于管理集群服务和集群服务上的Rs(Real Server)。

4、LVS专业术语


VS:Virtual Server #虚拟服务

RS: Real Server #后端真实的请求处理服务器

CIP:Client IP #客户端IP

VIP:Virtual IP #虚拟IP地址,公布给用户访问的IP地址

DIP: Director Server IP #主要用于和内部主机通讯的IP地址。

RIP: Real Server IP # 后端真实的请求处理服务器的IP地址



三、LVS工作模式



1、LVS负载均衡的四种工作模式

LVS/NAT:网络地址转换模式,进站/出站的数据流量经过分发器(IP负载均衡,他修改的是IP地址) –利用三层功能

LVS/DR:直接路由模式,只有进站的数据流量经过分发器(数据链路层负载均衡,因为他修改的是目的mac地址)–利用二层功能mac地址

LVS/TUN:隧道模式,只有进站的数据流量经过分发器

LVS/full-nat:双向转换:通过请求报文的源地址为DIP,目标为RIP来实现转发:对于响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发



2、四种工作模式的原理、优缺点


1)NAT模式:



原理

:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此RS来处理,RS处理完成后把数据交给经过负载均衡器,负载均衡器再把数据包的原IP地址改为自己的IP,将目的地址改为客户端IP地址即可。期间,无论是进来的流量,还是出去的流量,都必须经过负载均衡器。


优点

:集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址。


缺点

:扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!

在这里插入图片描述

2)

DR(直接路由)模式




原理

:负载均衡器和RS都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有RS对本身这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的RS,把目的MAC地址改为RS的MAC(因为IP一致)并将请求分发给这台RS。这时RS收到这个数据包,处理完成之后,由于IP一致,可以直接将数据返给客户,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端,DR 模式是性能最好的一种模式。。


DR 模式下需要 LVS 和RS绑定同一个 VIP(RS 通过将 VIP 绑定在 loopback 实现)



优点

:和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。


缺点

:(不能说缺点,只能说是不足)要求负载均衡器的网卡必须与物理网卡在一个物理段上。

在这里插入图片描述

3)IP隧道(Tunnel)模式

原理:互联网上的大多Internet服务的请求包很短小,而应答包通常很大。那么隧道模式就是,把客户端发来的数据包,封装一个新的IP头标记(仅目的IP)发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后,直接返回给客户端,不需要再经过负载均衡器。注意,由于RS需要对负载均衡器发过来的数据包进行还原,所以说必须支持IPTUNNEL协议。所以,在RS的内核中,必须编译支持IPTUNNEL这个选项

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

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

在这里插入图片描述

4)FULL-NAT模式(了解)

原理:客户端对VIP发起请求,Director接过请求发现是请求后端服务。Direcrot对请求报文做full-nat,把源ip改为Dip,把目标ip转换为任意后端RS的rip,然后发往后端,rs接到请求后,进行响应,相应源ip为Rip目标ip还是DIP,由内部路由路由到Director,Director接到响应报文,进行full-nat,将源地址改为为VIP,目标地址改为CIP、

请求使用DNAT,响应使用SNAT



3、四种工作模式的区别


lvs-nat与lvs-fullnat:请求和响应报文都经由Director

lvs-nat:RIP的网关要指向DIP

lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信

lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client

lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发

lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信



四、LVS管理工具——ipvsadm

从2.4版本开始,linux内核默认支持LVS。要使用LVS的能力,只需安装一个LVS的管理工具:ipvsadm。

1、LVS-server管理工具ipvsadm

安装ipvsadm:yum -y install ipvsadm

程序包:ipvsadm

主程序:/usr/sbin/ipvsadm

规则保存工具:/usr/sbin/ipvsadm –save > /etc/sysconfig/ipvsadm

配置文件:/etc/sysconfig/ipvsadm-config

2、命令选项

-A –add-service #在服务器列表中新添加一条新的虚拟服务器记录

-t #表示为tcp服务

-u #表示为udp服务

-s –scheduler #使用的调度算法, rr | wrr | lc | wlc 默认调度算法是 wlc

例:ipvsadm -A -t 192.168.1.2:80 -s wrr


-a –add-server #在服务器表中添加一条新的真实主机记录

-t –tcp-service #说明虚拟服务器提供tcp服务

-u –udp-service #说明虚拟服务器提供udp服务

-r –real-server #真实服务器地址

-m –masquerading #指定LVS工作模式为NAT模式

-w –weight #真实服务器的权值

-g –gatewaying #指定LVS工作模式为直接路由器模式(也是LVS默认的模式)

-i –ip #指定LVS的工作模式为隧道模式

-p #会话保持时间,定义流量呗转到同一个realserver的会话存留时间


例:ipvsadm -a -t 192.168.1.2:80 -r 192.168.2.10:80 -m -w 1

-E -edit-service #编辑内核虚拟服务器表中的一条虚拟服务器记录。

-D -delete-service #删除内核虚拟服务器表中的一条虚拟服务器记录。


-C -clear #清除内核虚拟服务器表中的所有记录。


-R -restore #恢复虚拟服务器规则


-S -save #保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式

-d -delete-server #删除一条虚拟服务器记录中的某条真实服务器记录

-L|-l –list #显示内核虚拟服务器表

–numeric, -n:#以数字形式输出地址和端口号

–stats: #统计信息

–rate : #输出速率信息


-Z –zero #虚拟服务表计数器清零(清空当前的连接数量等)



五、LVS负载均衡集群实战应用



1、环境:

四台干净虚拟机,两台作为web服务器,一台作为LVS实现负载均衡服务器。

虚拟机 ip地址 充当角色 VIP
虚拟机1 DIP:192.168.58.143 lvs-dr,DR模式的负载均衡服务器 192.168.58.140
虚拟机2 SIP1:192.168.58.162 rs-1,真实提供web服务的服务器1 192.168.58.140
虚拟机3 SIP2:192.168.58.155 rs-2,真实提供web服务的服务器2 192.168.58.140
虚拟机4 192.168.58.164 测试使用,不做任何配置

注意:

① 四台虚拟机都要关闭firewalld和selinux;

② 网络都采用NAT模式

③ DR模式要求Director DIP 和 所有RealServer RIP必须在同一个网段及广播域

④ 所有节点网关均指定真实网关



2、搭建web服务器


虚拟机2:


安装并开启nginx,并在nginx默认发布目录中写入测试内容


[root@rs-1 ~]# yum -y install nginx && systemctl start nginx



[root@rs-1 ~]# echo lvs-rs1 > /usr/share/nginx/html/index.html



[root@rs-1 ~]# nginx -s reload


虚拟机3:


安装并开启nginx,并在nginx默认发布目录中写入测试内容


[root@rs-2 ~]# yum -y install nginx && systemctl start nginx



[root@rs-2 ~]# echo lvs-rs2 > /usr/share/nginx/html/index.html



[root@rs-2 ~]# nginx -s reload


虚拟机4:


测试两台web服务器

在这里插入图片描述

两台web服务搭建成功,能够正常访问。



3、LVS负载均衡配置


虚拟机1


1)安装LVS管理工具ipvsadm


[root@lvs-dr ~]# yum -y install ipvsadm

2)配置VIP


[root@lvs-dr ~]# ip addr add dev ens33 192.168.58.140/32

#设置VIP,该命令是临时设定,若重启服务器临时ip消失,子网掩码必须设置为32。

在这里插入图片描述

在这里插入图片描述

3)启动ipvsadm


[root@lvs-dr ~]# systemctl start ipvsadm


注意:启动如果报错: /bin/bash: /etc/sysconfig/ipvsadm: 没有那个文件或目录

需要手动生成/etc/sysconfig/ipvsadm文件,然后再启动ipvsadm即可


[root@lvs-dr ~]# ipvsadm --save > /etc/sysconfig/ipvsadm


定义LVS分发策略


4)创建虚拟服务器并指定IP地址:端口、协议和算法策略


[root@lvs-dr ~]# ipvsadm -A -t 192.168.58.140:80 -s rr

# rr 轮叫调度算法

5)向虚拟服务器中添加真实记录,并指定工作模式


[root@lvs-dr ~]# ipvsadm -a -t 192.168.58.140:80 -r 192.168.58.162 -g



[root@lvs-dr ~]# ipvsadm -a -t 192.168.58.140:80 -r 192.168.58.155 -g


在这里插入图片描述



-a:在虚拟服务器表中添加一条新的真实主机记录

-t:指定使用TCP协议

-r:指定真实服务器ip地址

-g:指定LVS的工作模式为直接路由模式,是LVS的默认工作模式

6)保存服务器规则


[root@lvs-dr ~]# ipvsadm -S > /etc/sysconfig/ipvsadm

# -S替换为- -save也行

以上虚拟机1的DR部署完成

查看负载均衡配置的内容


[root@lvs-dr ~]# ipvsadm -ln


在这里插入图片描述

还有以下查看方式,参数释义为:

[root@lvs-dr ~]# ipvsadm -L -n –stats #显示统计信息

1、Conns (connections scheduled) 已经转发过的连接数

2、InPkts (incoming packets) 入包个数

3、 OutPkts (outgoing packets) 出包个数

4、 InBytes (incoming bytes) 入流量(字节)

5、 OutBytes (outgoing bytes) 出流量(字节)

[root@lvs-dr ~]# ipvsadm -L -n –rate #看速率

1、 CPS (current connection rate) 每秒连接数

2、 InPPS (current in packet rate) 每秒的入包个数

3、 OutPPS (current out packet rate) 每秒的出包个数

4、 InBPS (current in byte rate) 每秒入流量(字节)

5、 OutBPS (current out byte rate) 每秒出流量(字节)


虚拟机2


1)在lo接口上绑定VIP


[root@rs-1 ~]# ip addr add dev lo 192.168.58.140/32



需要注意的是:LVS负载均衡服务器需要将VIP绑定在ens33网卡上,而两台真实web服务器需要可将VIP绑定在lo网卡上

2)忽略arp广播,使ARP静默,保证用户在访问VIP时能够访问到dr


[root@rs-1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

#临时修改,重启消失。这个命令的作用是忽略arp广播,使ARP静默,保证用户在访问VIP时能够访问到dr,默认是不忽略的

3)开启路由转发功能


[root@rs-1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

#临时修改,重启消失。



永久修改:

[root@rs-1 ~]# vim /etc/sysctl.conf

在这里插入图片描述

使用 sysctl -p 使配置生效

4)匹配精确ip地址回包


[root@rs-1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce


此步操作是为了实现RS能够直接将数据返回给Client

5)开启nginx


[root@rs-1 ~]# systemctl start nginx


虚拟机3

与虚拟机2的操作相同



4、验证


虚拟机4

测试LVS负载均衡功能

在这里插入图片描述

访问VIP,实现轮流访问两台web服务器,说明以rr调度算法的LVS-DR负载均衡服务集群搭建成功。



六、LVS的调度算法

LVS的调度算法分为静态算法与动态算法两类,总共包括10种算法,这里介绍较常用的5种算法



1、静态算法


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


1)

RR:轮叫调度(Round Robin)


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

示例:

ipvsadm -A -t 192.168.58.140:80 -s rr

ipvsadm -a -t 192.168.58.140 -r 192.168.58.155 -g

2)

WRR:加权轮叫(Weight RR)


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

示例:

ipvsadm -A -t 192.168.58.140:80 -s wrr

ipvsadm -a -t 192.168.58.140 -r 192.168.58.155 -g -w 2



2、动态算法


前端的调度器会根据后端真实服务器的实际连接情况来分配请求

1)

LC:最少链接(Least Connections)


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

示例:

ipvsadm -A -t 192.168.58.140:80 -s lc

ipvsadm -a -t 192.168.58.140 -r 192.168.58.155 -g

2)

WLC:加权最少连接(默认采用的就是这种)(Weighted Least Connections)


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

示例:

ipvsadm -A -t 192.168.58.140:80 -s wlc

ipvsadm -a -t 192.168.58.140 -r 192.168.58.155 -g

3)

NQ:永不排队/最少队列调度(Never Queue Scheduling NQ)


无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空闲。

示例:

ipvsadm -A -t 192.168.58.140:80 -s nq

ipvsadm -a -t 192.168.58.140 -r 192.168.58.155 -g



七、LVS健康监测脚本


lvs默认情况下没有健康检测,当有real-server服务挂掉后,lvs不能及时判断,就可能导致用户访问失败,那么如何通过脚本的方式进行健康检测呢?


[root@lvs-dr ~]# vim lvs.sh

脚本内容如下:

#!/bin/bash
rs1=192.168.58.162
ping -c 1 $rs1 &> /dev/null
if [ $? -eq 0 ];then
        curl $rs1
        if [ $? -eq 0 ];then
                /usr/sbin/ipvsadm -Ln | grep $rs1 &> /dev/null
                if [ $? -eq 0 ];then
                        break
                else
                        /usr/sbin/ipvsadm -a -t 192.168.58.140:80 -r $rs1 -g
                fi

        else
                 /usr/sbin/ipvsadm -d -t 192.168.58.140:80 -r $rs1
        fi
else
        /usr/sbin/ipvsadm -d -t 192.168.58.140:80 -r $rs1
fi

rs2=192.168.58.155
ping -c 1 $rs2 &> /dev/null
if [ $? -eq 0 ];then
        curl $rs2
        if [ $? -eq 0 ];then
                /usr/sbin/ipvsadm -Ln | grep $rs2 &> /dev/null
                if [ $? -eq 0 ];then
                        exit
                else
                        /usr/sbin/ipvsadm -a -t 192.168.58.140:80 -r $rs2 -g
                fi

        else
                 /usr/sbin/ipvsadm -d -t 192.168.58.140:80 -r $rs2
        fi
else
        /usr/sbin/ipvsadm -d -t 192.168.58.140:80 -r $rs2
fi

添加定时任务,每分钟检测一次改脚本


[root@lvs-dr ~]# crontab -e


在这里插入图片描述



版权声明:本文为weixin_44178770原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。