赞
踩
目录
一.什么是LVS
LVS(Linux Virtual Server)是一种基于Linux内核的高性能、高可用的负载均衡软件,它可以将网络流量分发到多个服务器上,提高系统的可用性和性能。 LVS的负载均衡功能实现在Linux内核中,通过对网络数据包的转发和调度,将来自客户端的请求分发到多台服务器上,从而实现负载均衡。
LVS支持多种负载均衡算法:轮询、加权轮询、最小链接数等,同时还支持多种会话保持方法:IP散列、基于源 IP 端口的哈希、基于 Cookie 的会话保持等。
LVS 是一个实现负载均衡集群的开源软件项目,LVS 架构从逻辑上可分为调度层、Server 集群层和共享存储层。
tips:
本项目在 1998 年 5 月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。
LVS支持多种协议的负载均衡,包括TCP、UDP、HTTP等。
IP 散列(IP Hash):根据客户端的 IP 地址计算哈希值,通过哈希值将来自同一 IP 地址的请求始终分发到同一台后端服务器。
基于源 IP 端口的哈希(Source IP and Port Hash):结合客户端的 IP 地址和端口号计算哈希值,以此确定请求分发的后端服务器。
基于 Cookie 的会话保持:LVS 可以识别客户端请求中的特定 Cookie 信息,根据 Cookie 来将请求分配到相应的后端服务器。
1.LVS的负载均衡功能实现在Linux内核中,具有非常高的性能和稳定性。
2.LVS支持多台服务器共同提供服务,其中一台服务器出现故障时,LVS可以自动将流量转发到其他正常工作的服务器上,从而提高系统的可用性。
3.LVS支持多种负载均衡算法和会话保持方法,可以根据实际需求进行配置。
1.主要用于多服务器的负载均衡。
2.工作在网络层,可实现高性能,高可用的服务器集群技术。
3.廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。
4.易用,配置简单,有多种负载均衡的方法。
5.稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。
6.可扩展性好。
LVS 由两部分程序组成: 1.ipvs(ip virtual server):LVS 是基于内核态的 Netfilter 框架实现的 IPVS 功能,工作在内核态。用户配置 VIP 等相关信息并传递到 IPVS 就需要用到 ipvsadm 工具。 2.ipvsadm:ipvsadm 是 LVS 用户态的配套工具,可以实现 VIP 和 RS 的增删改查功能,是基于 Netlink 或 raw socket 方式与内核 LVS 进行通信的,如果 LVS 类比于 Netfilter,那 ipvsadm 就是类似 iptables 工具的地位。
1.负载均衡群集:Load Balance Cluster,以提高应用系统的响应能力,尽可能处理更多的访问请求、减少延迟为目标,从而获得高并发、高负载的整体性能。
2.高可用群集:High Availability Cluster,以提高应用系统的可靠性,尽可能的减少终端时间为目标、确保服务的连续性,达到高可用的容错效果。
3.高性能运算群集:High Performance Computer Cluster,以提高应用系统的 CPU 运算速度、扩展硬件资源和分析能力为目标、从而获得相当于大型、超级计算机的高性能计算能力。
1.分布式系统一定是由多个节点组成的系统。其中,节点指的是计算机服务器,而且这些节点一般不是孤立的,而是互通的。
2.这些连通的节点上部署了我们的节点,并且相互的操作会有协同。
3.不同的业务模块部署在不同的服务器上或者同一个业务模块分拆多个子业务,部署在不同的服务器上,解决高并发的问题,提供可扩展性以及高可用性,业务中使用分布式的场景主要有分布式存储以及分布式计算。分布式存储中可以将数据分片到多个节点上,不仅可以提高性能(可扩展性),同时也可以使用多个节点对同一份数据进行备份。
Ceph(是一个统一的、分布式的存储系统,具有出色的扩展性和可靠性。它支持对象存储、块存储和文件存储,被广泛应用于云计算和大规模数据存储场景。), GlusterFs(一款开源的分布式文件系统,能够通过将多个服务器的存储资源整合起来,提供大容量、高并发的文件存储服务,常见于企业级的文件共享和存储解决方案中), FastDFS(是一个轻量级的分布式文件系统,特别适合存储中小文件,如图片、文档等。在互联网应用中,FastDFS 常用于图片服务器的搭建), MogileFs(用于分布式存储和管理大量的静态文件,具有良好的容错性和可扩展性。)
hadoop(是一个大数据处理框架,包含了分布式文件系统(HDFS)和分布式计算模型(MapReduce)。它能够处理 PB 级别的数据,常用于数据挖掘、数据分析等领域), Spark(是一个快速、通用的大数据计算引擎,相比 Hadoop 的 MapReduce,Spark 具有更高的计算效率和更丰富的计算模型)
分布式应用-服务按照功能拆分,使用微服务 分布式静态资源--静态资源放在不同的存储集群上 分布式数据和存储--使用key-value缓存系统 分布式计算--对特殊业务使用分布式计算,比如Hadoop集群
tips:
集群:同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能没有差别,数据和代码都是一样的
分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。
分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务 分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率, 对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决定由给哪一台去完成响应,并且台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点,都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败
VS: Virtual Server,负责调度
DS:Director Server,前端负载均衡节点服务器,调度器。
RS:Real Server,后端真实服务器。
CIP:Client IP,客户端 IP 地址。
VIP:Virtual IP,负载均衡对外提供访问的 IP 地址,一般负载均衡 IP 都会通过 Virtual IP 实现高可用。
RIP:RealServer IP,负载均衡后端的真实服务器 IP 地址。
DIP:Director IP,负载均衡与后端服务器通信的 IP 地址。
CMAC:客户端 MAC 地址,LVS 连接的路由器的 MAC 地址。
VMAC:负载均衡 LVS 的 VIP 对应的 MAC 地址。
DMAC:负载均衡 LVS 的 DIP 对应的 MAC 地址。
RMAC:后端真实服务器的 RIP 地址对应的 MAC 地址。
访问流程:CIP <--> VIP == DIP <--> RIP
简单点:VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS
1.客户端发送请求 客户端向 LVS 服务器发送请求,请求的目标通常是一个虚拟 IP 地址(VIP)。
2.LVS 接收请求 LVS 服务器接收到客户端的请求。
3.选择后端服务器 LVS 根据预先配置的负载均衡算法从后端的真实服务器(Real Server)中选择一台合适的服务器。常见的负载均衡算法包括:
-轮询(Round Robin):依次将请求分配给各台服务器。
-加权轮询(Weighted Round Robin):根据服务器的权重依次分配请求。
-最少连接(Least Connections):将请求分配给当前连接数最少的服务器。
-加权最少连接(Weighted Least Connections):结合服务器权重和连接数进行分配。
4.转发请求 根据选择的结果,LVS 以不同的工作模式将请求转发给后端服务器: -
NAT 模式:修改请求数据包的目标 IP 地址为所选后端服务器的 IP 地址,并将响应数据包的源 IP 地址修改为 VIP 地址,再转发给客户端。
-DR 模式:将请求数据包的目标 MAC 地址修改为所选后端服务器的 MAC 地址,直接将数据包转发到后端服务器。
-TUN 模式:给请求数据包加上新的 IP 头,将数据包封装后通过隧道转发给后端服务器。
-fullnet模式:通过同时修改请求报文的源IP地址和目标IP地址进行转发。
5.后端服务器处理请求 后端服务器接收到请求后进行处理,并将响应直接返回给客户端。 例如: 假设一个网站使用 LVS 进行负载均衡,有三台后端服务器 A、B、C。采用轮询算法,当第一个请求到来时,LVS 选择服务器 A 处理;第二个请求选择服务器 B;第三个请求选择服务器 C,以此类推。如果采用加权轮询,假设服务器 A 的权重为 2,B 和 C 的权重为 1,那么大约每两个请求中有一个会分配给 A,而 B 和 C 各分配一个。 通过 LVS 的负载均衡,可以有效地提高系统的处理能力和可用性,确保客户端能够快速、稳定地获得服务。
lvs-nat: 修改请求报文的目标IP,多目标IP的DNAT
lvs-dr: 操纵封装新的MAC地址
lvs-tun: 在原请求IP报文之外新加一个IP首部
lvs-fullnat: 修改请求报文的源和目标IP
十一.四种工作模式
原理:在NAT模式下,LVS作为客户端和后端服务器之间的中间人,接收来自客户端的请求,将请求的目标IP地址和端口转换为后端服务器的IP地址和端口,然后将请求转发给后端服务器。后端服务器处理请求后,将响应数据包发送给LVS,LVS再将响应数据包的源IP地址和端口修改为自己的IP地址和端口,然后将响应返回给客户端。
特点: 请求和响应的数据包都必须经过LVS,这可能导致LVS成为瓶颈。同时,NAT模式支持跨网段通信。 本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发。 RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP。 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈。 支持端口映射,可修改请求报文的目标PORT。VS必须是Linux系统,RS可以是任意OS系统。 客户请求到达vip后进入PREROUTING,在没有ipvs的时候因该进入本机INPUT,当IPVS存在后访问请求在通过PREROUTING后被ipvs结果并作nat转发 因为ipvs的作用点是在PREROUTING和INPUT链之间,所以如果在prerouting中设定规则会干扰ipvs的工作。所以在做lvs时要把iptables的火墙策略全清理掉。
原理:在DR模式下,LVS不会修改数据包中的IP地址和端口,而是直接修改数据帧的目标MAC地址为所选后端服务器的MAC地址,并通过交换机或路由器将数据包转发给后端服务器。后端服务器处理请求后,直接将响应数据包发送给客户端,无需经过LVS。
特点:由于响应数据包不经过LVS,因此LVS不会成为瓶颈。但DR模式要求LVS和后端服务器必须在同一个局域网内,因为它们是通过MAC地址进行通信的。 DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。 在DR模式中,RS接收到访问请求后不需要回传给VS调度器,直接把回传数据发送给client,所以RS和vs上都要有vip
原理:在TUN模式下,LVS将客户端的请求数据包封装在一个新的IP隧道中,并将封装后的数据包发送给后端服务器。后端服务器处理请求后,将响应数据包通过隧道返回给LVS,LVS再将响应数据包解封装后发送给客户端。
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)
TUN模式特点 1.DIP, VIP, RIP都应该是公网地址 2.RS的网关一般不能指向DIP 3.请求报文要经由Director,但响应不能经由Director 4.不支持端口映射 5.RS的OS须支持隧道功能 6.TUN模式支持跨网段通信,因为数据包是通过IP隧道在LVS和后端服务器之间传输的。但TUN模式需要额外的处理来封装和解封装数据包,可能会增加一些处理开销。
fullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发 CIP --> DIP VIP --> RIP
1.VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
2.RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
3.请求和响应报文都经由Director 4.支持端口映射 (所用内核不支持)
tips:
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头实现转发,支持远距离通信
1.ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态被分为两种:静态方法和动态方法 静态方法:仅根据算法本身进行调度,不考虑RS的负载情况 动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
2.LVS支持多种调度算法,用于确定如何将请求分发到后端服务器上。
1.轮询(RR):按顺序轮流分配请求到不同的服务器上,确保每台服务器接收到的请求数大致相同。
2.加权轮询(WRR):根据后端服务器的处理能力给每台服务器分配不同的权值,权值越高的服务器接收到的请求数越多。
3.源地址散列(SH):根据请求的源IP地址进行散列运算,将请求分配到同一台服务器上,以保证来自同一客户端的请求始终被同一台服务器处理。
4.目标地址散列(DH):目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
1.LC:least connections(最少链接发) 适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活动链接数)
2.WLC:Weighted LC(权重最少链接) 默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
3.SED:Shortest Expection Delay, 初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接
4.NQ:Never Queue,第一轮均匀分配,后续SED
5.LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
6.LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS
tips:
最短延迟调度:SED,最短的预期延迟调度算法将网络连接分配给具有最短的预期延迟的服务器。如果将请求发送到第 i 个服务器,则预期的延迟时间为(Ci +1)/Ui,其中 Ci 是第 i 个服务器上的连接数,而 Ui 是第 i 个服务器的固定服务速率(权重) 。
永不排队调度:NQ,从不队列调度算法采用两速模型。当有空闲服务器可用时,请求会发送到空闲服务器,而不是等待快速响应的服务器。如果没有可用的空闲服务器,则请求将被发送到服务器,以使其预期延迟最小化(最短预期延迟调度算法)
-A 用于添加一个新的虚拟服务。
-E 用于编辑现有的虚拟服务。
-t 表示 TCP 协议,-u 表示 UDP 协议,-f 表示防火墙标记。
service-address 是集群服务的地址。
-s scheduler 用于指定调度算法,如轮询、加权轮询等。
-p [timeout] 用于设置持久连接的超时时间。
-M netmask 指定网络掩码。
--pepersistence_engine 涉及持久化引擎的相关设置。
-b sched-flags 用于设置调度标志。
ipvsadm -D -t|u|f service-address:用于删除指定的虚拟服务。
ipvsadm –C:清空当前的 IPVS 规则和连接信息。
ipvsadm –R:重载之前保存的规则。
ipvsadm -S [-n]:保存当前的规则配置。-n 选项通常用于以数字形式显示地址和端口,而不是进行 DNS 解析。
-a 用于添加一个真实服务器(Real Server)到虚拟服务中。
-e 用于编辑现有的真实服务器配置。 -e #更改realserver
-t 表示 TCP 协议,-u 表示 UDP 协议,-f 表示防火墙标记。
service-address 是之前定义的虚拟服务的地址。
-r server-address 是要添加或编辑的真实服务器的地址。
-g 表示使用直接路由(DR)模式,-i 表示使用隧道(TUN)模式,-m 表示使用 NAT 模式。
-w weight 用于设置真实服务器的权重,决定其在负载均衡中的处理能力比例。
ipvsadm -d -t|u|f service-address -r server-address:用于从虚拟服务中删除指定的真实服务器。
ipvsadm -L|l [options]:用于查看真实服务器(RS)的相关信息。常见的选项可以包括 -n 以数字形式显示地址和端口等。
-C #清空lvs策略
-n #不做解析
--rate :输出速率信息
ipvsadm -Z [-t|u|f service-address] 清楚计数器
ipvsadm-save > /etc/sysconfig/ipvsadm-config
systemctl enable --now ipvsadm.service
1.DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:
a.在前端网关做静态绑定
b.在各RS使用arptables
c.在各RS修改内核参数,来限制arp响应和通告的级别
2.限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
3.限制通告级别:arp_announce
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告
4.配置要点
a.Director服务器采用双IP桥接网络,一个是VPP,一个DIP
b.Web服务器采用和DIP相同的网段和Director连接
c.每个Web服务器配置VIP
d.每个web服务器可以出外网
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题,当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上。
测试问题
- [root@client ~]# curl http://192.168.0.200;curl -k https://192.168.0.200
- RS1 server - 192.168.0.10
- RS1 server - 192.168.0.10 #当访问vip时两次调度都到了
FWM:FireWall Mark MARK target 可用于给特定的报文打标记,
--set-mark value 其中:value 可为0xffff格式,表示十六进制数字借助于防火墙标记来分类报文,而后基于标记定义集群服务:可将多个不同的应用使用同一个集群服务进行调度
实现方法:
在Director主机打标记:
iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports $portl,$port2,..-i MARK --set-mark NUMBER
在Director主机基于标记定义集群服务: ipvsadm -A -f NUMBER [options]
示例如下
- iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports
- 80,443 -j MARK --set-mark 6666 #在vs调度器中设定端口标签,人为80和443是一个整体设定调度规则
- [root@lvs ~]# ipvsadm -A -f 6666 -s rr
- [root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.10 -g
- [root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.20 -g
- curl -k https://192.168.0.200;curl 192.168.0.200 #测试结果
在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单粗暴,可能会导致调度失衡。
解决方案 在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源的主机调度到了那个RS上。 如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到同一台RS上。 如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上。
ipvsadm -A|E -tlulf service-address [-s scheduler] [-p [timeout]]
#默认360秒 在lvs调度器中设定
- [root@lvs ~]# ipvsadm -E -f 6666 -s rr -p [3000]
- [root@lvs ~]# ipvsadm -LnC
tips: 相关的配置可以看lvs-nat模式和dr模式集群原理及部署方法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。