负载均衡集群

[TOC]

1、集群是什么?

  • 集群(cluster)技术可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术。
  • 集群组成后,可以利用多个计算机和组合进行海量请求处理(负载均衡),从而获得很高的处理效率,也可以用多个计算机做备份(高可用HA),使得任何一个机器坏了整个系统还是能正常运行。

2、负载均衡集群技术

  • 负载均衡(Load Balance):负载均衡集群为企业需求提供了可解决容量问题的有效方案。负载均衡集群使负载可以在计算机集群中尽可能平均地分摊处理。
  • 负载通常包括应用程序处理负载网络流量负载,每个节点都可以承担一定的处理负载,并且可以实现处理负载在节点之间的动态分配,以实现负载均衡。

3、负载均衡集群技术的实现

负载均衡(Load Balance)

负载均衡技术类型:基于 4 层负载均衡技术和基于 7 层负载均衡技术

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

硬件负载均衡产品:F5

软件负载均衡产品: LVS(Linux Virtual Server)、 Haproxy、Nginx

4、实现效果如图

1562677488047

5、负载均衡分类

负载均衡根据所采用的设备对象(软/硬件负载均衡),应用的OSI网络层次(网络层次上的负载均衡),及应用的地理结构(本地/全局负载均衡)等来分类。下面着重介绍的是根据应用的 OSI 网络层次来分类的负载均衡类型。

6、四层负载均衡(基于IP+端口的负载均衡)

四层负载均衡(Layer 4 Load Balancing)是指在网络通信中,负载均衡设备在网络传输的第四层(传输层,即TCP/UDP层)对数据流进行负载均衡操作。它主要通过分析传输层的源IP地址、目标IP地址、源端口、目标端口等信息来实现负载均衡,从而将网络请求分发到多台服务器上。

四层负载均衡的特点如下:

  1. 基于IP+端口:四层负载均衡是基于IP地址和端口号的负载均衡,通过发布三层的IP地址(虚拟IP)再加上四层的端口号来实现。
  2. 处理TCP/UDP协议:四层负载均衡通常用于分发TCP和UDP协议的数据流。
  3. 高效转发:由于四层负载均衡工作在传输层,它可以更高效地处理网络流量,减少了应用层(七层)的复杂性。

四层负载均衡的应用场景包括:

  1. TCP/UDP协议的负载均衡:对于基于TCP或UDP协议的请求,可以使用四层负载均衡来分发流量。
  2. 端口映射和转发:四层负载均衡可以实现端口映射和端口转发,将外部请求转发到内部服务器的指定端口。

实现四层负载均衡的有:

  • F5:硬件负载均衡器,功能很好,但是成本很高;
  • LVS:重量级的四层负载均衡软件;
  • haproxy、Nginx:模拟四层、七层转发,较灵活;

7、七层的负载均衡(基于虚拟的URL或主机IP的负载均衡)

  1. 所谓七层负载均衡,也称为“内容交换”,

    1. 七层负载均衡是指在网络通信中,负载均衡设备在网络传输的应用层(OSI模型的第七层)对数据流进行负载均衡操作。它通过对网络流量进行分析和处理,将请求分发到不同的服务器上,以实现负载均衡。

      七层负载均衡主要基于应用层协议(如HTTP、HTTPS、SMTP等)进行智能的流量分发,从而提高服务器的性能和可靠性。它可以根据应用层协议的内容(如URL、请求头、请求体等)进行更精细的流量分发,确保将请求分发到最适合处理该请求的服务器上。

      七层负载均衡的应用场景包括但不限于Web服务器集群、应用服务器集群。

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

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

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

8、四层负载与七层负载的区别(面试题)

四层负载均衡和七层负载均衡的主要区别体现在它们工作的网络层次、处理的数据内容以及应用场景上。

  1. 工作的网络层次:四层负载均衡工作在OSI模型的传输层,即TCP/UDP层,主要基于IP地址和端口号进行负载均衡。而七层负载均衡则工作在OSI模型的应用层,即HTTP、HTTPS、SMTP等应用层协议层,能够基于应用层协议的内容进行更精细的流量分发。
  2. 处理的数据内容:四层负载均衡主要处理的是网络传输的IP地址和端口号信息,它可以通过这些信息来决定将请求转发到哪个后端服务器。而七层负载均衡则能够处理应用层协议的内容,如URL、请求头、请求体等,从而根据这些内容进行更精细的流量分发。
  3. 应用场景:四层负载均衡通常用于处理基于TCP或UDP协议的请求,而七层负载均衡则更适用于Web服务器集群、应用服务器集群等场景,它能够根据应用层协议的内容进行智能的流量分发,提高服务器的性能和可靠性。

此外,两者在以下方面也存在一些差异:

  1. 转发效率:四层负载均衡的转发效率通常比七层负载均衡高,因为它只需要处理IP地址和端口号信息,不需要解析应用层协议的内容。但是,四层负载均衡在处理复杂应用层协议时可能不如七层负载均衡灵活。
  2. 可扩展性:七层负载均衡由于能够处理应用层协议的内容,因此可以更容易地实现一些高级功能,如会话保持、缓存、压缩等。这使得七层负载均衡在构建大规模集群架构时具有更好的可扩展性。
  3. 安全性:七层负载均衡可以基于应用层协议的内容进行安全过滤和防护,如https协议等。而四层负载均衡则通常只提供基本的网络安全功能。

9、LVS 实现四层负载均衡项目实战

1、LVS 介绍

​ 官网:www.linuxvirtualserver.org

LVS(Linux Virtual Server)是一个开源的负载均衡器,用于实现网络服务的负载均衡和高可用性。它运行在 Linux 操作系统上,并利用操作系统的网络功能和内核支持来实现负载均衡。LVS 提供了一种低成本、高性能的负载均衡解决方案。

以下是 LVS 的一些关键特点和优势:

  1. 高可用性:LVS 可以实现网络服务的高可用性,通过将负载分配到多个后端服务器上,并且提供故障转移和冗余机制,以防止单点故障,并确保服务的连续性。工作在网络4层之上仅作分发之用,这个特点也决定了它在负载均衡软件里的性能最强,稳定性最好,对内存和cpu资源消耗极低。
  2. 灵活的负载均衡算法:LVS 支持多种负载均衡算法,包括轮询、加权轮询、最少连接、加权最少连接等。管理员可以根据实际需求选择合适的负载均衡算法,以实现最佳的负载均衡效果。
  3. 水平扩展性:LVS 具有良好的水平扩展性,可以通过添加更多的后端服务器来扩展系统的容量和性能,以应对不断增长的流量和请求。
  4. 高性能:LVS 的设计注重性能,能够处理大规模的并发连接和高负载,保证了服务的响应速度和吞吐量。单台LVS负载均衡器,可支持上万并发连接。

2、LVS 不足之处

​ 工作在4层,不支持7层规则修改。

3、LVS 核心组件和专业术语

1、核心组件

IPVSadm:是用于管理和配置 IPVS 的命令行工具。通过 IPVSadm,管理员可以添加、删除、修改虚拟服务器、后端服务器池和负载均衡规则等配置

IPVS 负责实现基于 IP 的负载均衡功能。IPVS 通过拦截和转发网络数据包来实现负载均衡,根据预定义的负载均衡策略将数据包分发到后端的真实服务器上。IPVS 支持多种负载均衡调度算法,包括轮询、加权轮询、最少连接、加权最少连接等。

LVS模块:该模块位于Director Server(负载调度器)上,LVS模块的工作类似于一个路由器,它包含完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给后端的应用服务器(Real Server)。

Ldirectord监控模块:该模块也安装在负载调度器上,用于监测各个Real Server服务的健康状况。在Real Server不可用时,Ldirectord会将其从LVS路由表中剔除,待Real Server恢复后再重新加入。

2、专业术语
  • VS:Virtual Server

    虚拟服务器,是LVS的核心概念之一,代表一个虚拟的网络服务。客户端将请求发送到虚拟服务器的IP地址上,然后LVS根据配置将请求转发到后端的真实服务器。

  • Director, Balancer

    • Director:

      • Director 是 LVS 架构中的中心节点,也称为负载均衡器(Load Balancer)。
    • Balancer

      • Director 扮演了负载均衡器的角色,因此可以将其称为 Balancer。
  • RS:Real Server

    真实服务器,也称为后端服务器或节点,是实际处理客户端请求的服务器。LVS将请求从虚拟服务器转发到真实服务器上。

  • CIP: Client IP
    在 LVS(Linux Virtual Server)中,CIP 可能指的是 “Client IP”,即客户端 IP。

  • VIP:Director Virtual IP
    “VIP” 指的是 “Virtual IP”,即虚拟 IP。VIP 是 LVS 架构中的一个重要概念,代表了一个虚拟的网络地址,客户端将请求发送到该地址上,然后 LVS 负责将请求转发到后端的真实服务器上。

  • DIP:Director IP

    DIP 是指 LVS 集群中的负载均衡器(Director)的真实 IP 地址,

  • RIP:Real Server IP
    在 LVS(Linux Virtual Server)中,”RIP” 通常指的是 “Real Server IP”,即真实服务器的 IP 地址。
3、具体图解

1562677582545

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

1、NAT模式(LVS-NAT)

LVS(Linux Virtual Server)的 NAT模式是一种负载均衡模式,用于在传入的请求和传出的响应之间进行地址转换,从而实现负载均衡和透明的服务访问。

NAT 模式(即:网络地址映射)其工作原理是:客户端访问LVS时,LVS通过重写请求报文的目标地址,且根据预设的调度算法,将请求分派给后端真实服务器,真实服务器接收到请求处理后,发出响应报文也需要通过LVS返回,返回时需要修改报文的源地址,然后返回给客户,完成整个负载调度过程

  • DNAT:目标地址转换,改变的是目标地址
  • SNAT:源地址转换,改变的是源地址

NAT 模式就是使用 SNAT 和 DNAT 技术完成报的转发,NAT 方式可支持任何的操作系统,以及私有网络,并且只需一个 Internet IP 地址,非常节省成本,但是整个系统的性能受到限制。因为执行 NAT 每次需要重写数据包,有一定的延迟,另外,大部分应用有 80%的数据是从服务器流向客户机,也就是用户的请求非常短,而服务器的回应非常大,对LVS形成很大压力,容易成为瓶颈。

  • 在NAT模式下,当客户端发送请求到虚拟IP地址(VIP)时,LVS调度器会接收这些请求,并根据配置的调度算法选择一个后端真实服务器(RS)。然后,LVS会修改请求数据包的目的IP地址为选定RS的IP地址,并将数据包转发给该RS。响应数据包在返回给客户端之前,也会经过LVS,LVS将其源IP地址修改为VIP后,再发回给客户端。
  • 优点:NAT模式的配置相对简单,不需要VIP和真实服务器处于同一网段内,因此在某些网络环境下更为灵活。此外,由于所有数据包都经过LVS,可以实现更高层次的流量监控和管理。

缺点:

  1. 性能瓶颈: NAT 模式需要在负载均衡器上执行地址转换,可能会增加负载均衡器的处理负担,导致性能瓶颈。

1564358958845

  1. 数据包CIP->VIP,如果直接将数据包塞给RS,RS会丢弃,因此LVS修改目标地址VIP为RIP(D-NAT),此时数据包变成CIP->RIP发给RS
  2. RS处理完成后发送数据包RIP->CIP,这个数据包直接塞给客户端,客户端是不会收的,因为客户端是发给VIP的,但是回来就变成RIP给客户端的了,客户端也会丢弃,因此LVS修改源地址为VIP(S-NAT),此时数据包变成VIP->CIP发给客户端

注意事项:RS应该使用私有地址,DIP和RIP必须在同一个网段内,RS的网关必须指向DIP(因为最终给CIP的数据包要扔回给LVS)

2、直接路由(Direct Routing)模式(LVS-DR)
LVS(Linux Virtual Server)的 DR(Direct Routing)模式是一种负载均衡模式,它允许负载均衡器将传入的请求直接转发给后端真实服务器,而无需负载均衡器直接参与数据包的转发。

工作原理

  1. 在DR模式下,LVS和RS都配置有VIP,但是RS的VIP配置在lo(回环)接口上,并且禁止ARP(地址解析协议)响应。
  2. 当客户端的请求报文到达LVS后,LVS会修改请求报文的MAC地址为目标RS的MAC地址,并将报文发送给RS。
  3. RS收到请求报文后,会识别出报文中的VIP地址是自己的,于是处理报文, 报文直接返回给客户端,而不是返回给LVS。
  4. 主要特点
    • 高性能:因为RS可以直接响应客户端,不需要经过LVS调度器中转,所以减少了延迟,提高了性能;DR模式无需进行复杂的地址转换配置;
    • 适用范围:适用于调度器和后端服务器在同一局域网内的场景,这样能够确保MAC地址的修改有效并且后端服务器能正确接收和处理请求。

缺点

  1. 不适用于非直连网络

    LVS DR模式的工作原理通过改写请求报文的目标MAC地址,将请求直接发送给真实的服务器(Real Server),而真实服务器响应后的处理结果也直接返回给客户端用户。在这种模式下,负载均衡器(Director)和真实服务器必须位于同一个物理网络中,并且要求负载均衡器与真实服务器都有一块网卡连接到同一物理网段上。

    而非直连网络是指两个或多个网络通过路由器或其他网络设备连接,它们之间并不直接相连。在非直连网络中,数据包需要通过路由器进行转发才能到达目标网络。由于LVS DR模式要求负载均衡器和真实服务器在同一物理网络中,因此它无法直接适用于非直连网络。

1564358987844

3、IP隧道(Tunnel)模式(LVS-TUN)

​ 原理:LVS-TUN模式是Linux Virtual Server(LVS)负载均衡技术中的一种工作模式,也被称为IP隧道模式。在这种模式下,LVS调度器(Director)将接收到的客户端请求数据包封装在一个新的IP数据包中,然后转发给后端的应用服务器(Real Server)。Real Server在处理完请求后,直接将响应数据包发送回客户端,无需再次经过LVS调度器。

LVS-TUN模式的工作原理是在原有的IP报文外再次封装一层IP首部,内部IP首部(源地址为CIP,目标IP为VIP),外层IP首部(源地址为DIP,目标IP为RIP)。这样,通过IP隧道技术,可以将目标为一个IP地址的数据报文封装和转发到另一个IP地址,实现跨网段的负载均衡。

​ 优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户,减少了负载均衡器的大量数据流动。
​ 缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议。

1564359021882

4、FULL-NAT模式(双向转换模式)

原理:LVS(Linux Virtual Server)的双向转换模式通常指的是LVS-FullNAT模式。在这种模式下,LVS(负载均衡器)对进站和出站的数据流量都进行地址转换。具体来说,当客户端发送请求时,LVS会修改请求报文的源地址为目标RS(真实服务器)的IP地址(RIP),并将目标地址修改为LVS的虚拟IP地址(VIP)。当RS处理完请求并返回响应时,LVS会再次修改响应报文的源地址为VIP,目标地址为客户端的IP地址(CIP),然后将响应报文发送给客户端。

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

image-20220210140940567

5、四者的区别

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

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

   lvs-fullnat:双向转换

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

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

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

6、LVS ipvsadm 命令的使用

1、LVS-server安装lvs管理软件
1
yum -y install ipvsadm

程序包:ipvsadm(LVS管理工具)

主程序:/usr/sbin/ipvsadm

规则保存工具:/usr/sbin/ipvsadm-save > /path/to/file

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

2、命令选项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-A --add-service #在服务器列表中新添加一条新的虚拟服务器记录
-t #表示为tcp服务
-u #表示为udp服务
-s --scheduler #使用的调度算法, rr | wrr | lc | wlc | lblb | lblcr | dh | sh | sed | nq 默认调度算法是 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 选项可读的格式
-e -edit-server #编辑一条虚拟服务器记录中的某条真实服务器记录
-d -delete-server #删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l –list #显示内核虚拟服务器表

--numeric, -n:#以数字形式输出地址和端口号
--exact: #扩展信息,精确值
--connection,-c: #当前IPVS连接输出
--stats: #统计信息
--rate : #输出速率信息

参数也可以从/proc/net/ip_vs*映射文件中查看
-Z –zero #虚拟服务表计数器清零(清空当前的连接数量等)

7、LVS 负载均衡集群企业级应用实战

1、准备虚拟机

准备 3 台纯净的虚拟机,两台 web 服务器

2、LVS-server 安装lvs管理软件
1
[root@lvs-server ~]# yum -y install ipvsadm

程序包:ipvsadm(LVS管理工具)

主程序:/usr/sbin/ipvsadm

规则保存工具:/usr/sbin/ipvsadm-save > /path/to/file

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

3、LVS/DR 模式

实验说明:
1.虚拟机网络使用NAT模式
2.DR模式要求Director DIP 和 所有RealServer RIP必须在同一个网段及广播域
3.所有节点网关均指定真实网关

1568546953134 上图所示:CIP为客户端IP,VIP为负载均衡器虚拟IP,需要和后端提供服务的主机IP地址为一个网段,DIP为负载均衡器的真实主机IP地址。RIP为后端提供服务的主机IP地址。但是在LVS DR模式下,后端主机还需要配置一个VIP,并且绑定在该主机的回环网卡(lo)上,掩码位为32位,用于收到客户端请求后。将数锯直接返回给客户端,无需在经过负载均衡器。

思考:为什么LVS DR模式需要关闭arp广播?

为了避免ARP广播导致的冲突,确保流量能够正确地通过LVS进行负载均衡。

ARP广播会产生的问题 当客户端发起访问VIP对应的域名的请求(curl 10.0.0.32)时,根据网络通信原理会产生ARP广播,因为负载均衡器和真实的服务器rs在同一网络并且VIP设置在集群中的每个节点上,此时集群内的真实服务器会尝试回答来自客户端计算机的查找VIPARP广播,这就会产生问题,大家都说我是”VIP”。)为了达到负载均衡的目的,在所有real server上要关闭所有arp请求,导致不能响应client发出的arp请求(相当于哑巴),只有lvs可以响应,这样请求就会传到lvsvip中,这就是为什么要禁止real serverarp请求和响应。因此必须想法办让真实服务器忽略来自客户端计算机的ARP广播请求。

思考:为什么LVS DR模式下需要开启精准IP地址回包

当客户端发送请求到VIP时,调度器会根据负载均衡算法选择一台真实服务器,并将请求转发给该服务器。此时,真实服务器需要能够直接响应客户端的请求,而不需要再次通过调度器进行转发。

为了实现这一点,真实服务器需要开启精准IP地址回包功能。具体来说,当真实服务器处理完客户端的请求后,它会将响应数据包的源IP地址设置为VIP,目标IP地址设置为客户端的IP地址。这样,当数据包返回给客户端时,客户端会认为是直接从VIP接收到的响应,而不是经过某个中间设备(如调度器)转发的。

如果没有开启精准IP地址回包功能,真实服务器可能会将响应数据包的源IP地址设置为自己的真实IP地址,而不是VIP。这样,当数据包返回给客户端时,客户端会认为响应来自一个不同的IP地址,而不是它最初请求的VIP。这可能导致客户端与服务器之间的通信出现问题,例如连接中断或响应错误。

2、LVS/DR模式实施(部署)

1、准备工作(集群中所有主机)关闭防火墙和selinux

1
2
3
$ systemctl disable --now firewalld
$ setenforce 0
$ sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

2、Director分发器配置

配置VIP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@lvs-server ~]# ip addr add dev ens33 192.168.174.101/32 #设置VIP
# 参数说明
ip addr: 这是用于管理网络接口的命令,用于查看和修改网络接口的配置。
add: 这是ip addr命令的一个子命令,用于添加一个新的IP地址到指定的网络接口上。
dev ens33: 这是指定要操作的网络接口的名称。在这个例子中,网络接口的名称是ens33。
192.168.246.101/32: 这是要添加到网络接口上的IP地址和子网掩码。

# 安装ipvsadm
[root@lvs-server ~]# yum install -y ipvsadm

# 启动
[root@lvs-server ~]# systemctl enable --now ipvsadm
注意:启动如果报错: /bin/bash: /etc/sysconfig/ipvsadm: 没有那个文件或目录
需要手动生成文件

# 保存 IPVS 的当前配置
[root@lvs-server ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
# 参数说明:
--save: 这是ipvsadm的一个选项,用于将当前的ipvsadm配置保存到一个文件中。这个选项会将当前配置的所有规则和设置写入指定的文件。

/etc/sysconfig/ipvsadm: 这是保存ipvsadm配置的文件路径。/etc/sysconfig目录通常用于存储系统配置文件,而ipvsadm文件则包含了ipvsadm的配置信息。

定义LVS分发策略

1
2
3
4
5
6
7
8
9
10
11
12
-A:添加VIP
-t:用的是tcp协议
-a:添加的是lo的vip地址
-r:转发到realserverip
-s:算法
-L|-l –list #显示内核虚拟服务器表
--numeric, -n:#以数字形式输出地址和端口号
-g --gatewaying #指定LVS工作模式为直接路由器模式DR(也是LVS默认的模式)
-S -save #保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式
rr:轮循
如果添加ip错了,删除命令如下:
# ip addr del 192.168.174.101 dev ens33
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 清除内核虚拟服务器表中的所有记录。
[root@lvs-server ~]# ipvsadm -C

# 查看目前主机存在的规则
[root@lvs-server ~]# ipvsadm -ln

#
[root@lvs-server ~]# ipvsadm -A -t 192.168.174.101:80 -s rr


# 添加一台后端主机,如果用户的请求到VIP的端口上时,转发至后端提供服务的主机上,并且使用LVS的DR模式。
[root-@lvs-server ~]# ipvsadm -a -t 192.168.174.101:80 -r 192.168.174.20 -g
# 参数解释
-a: "add" 的缩写,表示你想添加一个虚拟服务到 IPVS 表中。

-t 192.168.174.101:80: 这部分指定了虚拟服务的 IP 地址和端口。在这种情况下,IP 地址是 192.168.174.101,端口是 80(HTTP 的默认端口)。这意味着所有发送到 192.168.174.101 的 80 端口的流量都将被 IPVS 截取并分发到一组真实服务器。

-r 192.168.174.40: 这部分指定了一个真实服务器的 IP 地址。在这个例子中,真实服务器的 IP 地址是 192.168.174.20。

-g:表示使用 "gatewaying"(或称为直接路由)方法,并且调度算法是默认的(通常是轮询,但具体取决于 IPVS 的配置)。使用直接路由时,LVS 负载均衡器只是将数据包的目标地址更改为真实服务器的地址,并将数据包直接发送到该服务器。


[root@lvs-server ~]# ipvsadm -a -t 192.168.174.101:80 -r 192.168.174.41 -g



# 保存方式,保存到一个文件中
[root@lvs-server ~]# ipvsadm -S > /etc/sysconfig/ipvsadm
# 参数说明
-S:是 --save 的简写形式

[root@lvs-server ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.174.101:80 rr
-> 192.168.174.40:80 Route 1 1 0
-> 192.168.174.41:80 Route 1 2 0
# 参数解释:
TCP 192.168.174.101:80 rr:这是一个虚拟服务器的配置,使用TCP协议,本地地址为192.168.174.101,端口为80,使用轮询(round-robin)调度器

192.168.174.40:80 Route 1 1 0:这是一个真实服务器的配置,使用路由(Route)转发方式,远程地址为192.168.174.40,端口为80,权重为1,活动连接数为1,非活动连接数为0
192.168.174.41:80 Route 1 2 0:这是另一个真实服务器的配置,与上一个配置类似,远程地址为192.168.174.41,端口为80,权重为1,活动连接数为2,非活动连接数为0。

[root@lvs-server ~]# ipvsadm -L -n

# 显示统计信息
[root@lvs-server ~]# 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-server ~]# 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) 每秒出流量(字节)

3、所有RS配置

配置好网站服务器,测试所有RS #为了测试效果,提供不同的页面(以下两台real-server都操作)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[root@real-server1 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

# 两台机器都安装nginx作为后端服务,按顺序添加不同的主机名以示区分
[root@real-server1 ~]# yum install -y nginx
[root@real-server1 ~]# echo "real-server1" >> /usr/share/nginx/html/index.html

[root@real-server2 ~]# yum install -y nginx
[root@real-server2 ~]# echo "real-server1" >> /usr/share/nginx/html/index.html

# 在lo接口上绑定VIP
[root@real-server1 ~]# ip addr add dev lo 192.168.174.101/32
# 参数解释
addr: 这是 ip 命令的一个子命令,用于管理网络接口的地址。

add: 这个参数告诉 ip addr 命令要添加一个地址到指定的网络接口。

dev lo: 这部分指定了要操作的网络接口。在这个例子中,lo 是回环接口(loopback interface)的别名,它通常用于本地通信(例如,ping 127.0.0.1)。

192.168.174.101/32: 这是要添加到 lo 接口的 IP 地址和子网掩码

[root@real-server2 ~]# ip addr add dev lo 192.168.174.100/32

# real-server1 忽略arp广播
[root@real-server1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# real-server1 匹配精确ip地址回包
[root@real-server1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

# real-server2 忽略arp广播
[root@real-server2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# real-server2 匹配精确ip地址回包
[root@real-server2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

# 启动nginx实例
[root@real-server1 ~]# systemctl enable --now nginx
[root@real-server2 ~]# systemctl enable --now nginx

测试:游览器清楚缓存,http://192.168.174.101(修改后端nginx服务器的长连接keep-alive)

8、LVS-NAT模式:

环境准备

1
2
3
192.168.174.39	lvs-server
192.168.174.40 real-server01
192.168.174.41 real-server02

注意: 此处的环境需要的主机,以自己创建的主机地址为准

所有主机关闭防火墙和SELIUX

1
2
3
$ systemctl disable --now firewalld
$ setenforce 0
$ sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

查看linux已加载的内核模块

1
[root@lvs-server ~]# lsmod | grep ip_vs

加载与卸载ip_vs内核模块

1
2
3
4
5
6
7
8
# 动态加载ip_vs 模块,这个命令只是临时生效,需要添加到开机启动文件里面
[root@lvs-server ~]# modprobe ip_vs

# 过滤模块是否加载成功
[root@lvs-server ~]# lsmod | grep ip_vs

# 动态卸载ip_vs模块
[root@lvs-server ~]# modprobe -r ip_vs
1
2
3
4
# 设置开机启动项
[root@lvs-server ~]# echo "modprobe ip_vs" >> /etc/rc.local
# 自启脚本添加执行权限
[root@lvs-server ~]# chmod +x /etc/rc.local

添加到开机启动项里面如果不需要这个模块的时候只需要将etc/rc.local里面对应的命令删除掉。但是这样需要重新启动服务器。 可以通过下面的命令立即生效。

LVS-NAT模式:

1568551568776

建议:先在Real Server安装如nginx(两台机器real-server)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 两台后端服务安装nginx服务
[root@real-server1 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

# 缓存元数据
[root@real-server1 ~]# yum makecache fast

# 安装nginx web服务
[root@real-server1 ~]# yum install -y nginx

# 准备网页文件
[root@real-server01 ~]# echo "real-server1" >> /usr/share/nginx/html/index.html
[root@real-server02 ~]# echo "real-server2" >> /usr/share/nginx/html/index.html

# 两台后端主机启动服务
[root@real-server01 ~]# systemctl enable --now nginx
[root@real-server02 ~]# systemctl enable --now nginx

# 测试网站是否正常访问
[root@real-server ~]# curl 主机IP
2、LVS/NAT模式配置
  1. RS配置

设置real-server(提供服务主机)所有服务器的默认网关指向Directory的DIP(负载均衡器主机IP)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 如果系统没有route 命令请使用如下命令安装
[root@real-server1 ~]# yum install -y net-tools

# redl-server01 配置
[root@real-server1 ~]# route add default gw 192.168.100.39 dev ens33
# 参数说明
default:表示这是一个默认路由,即当数据包的目的地不在本地路由表中时,数据包将发送到这个路由所指定的下一跳地址。

gw 192.168.100.39:指定了网关的地址,也就是数据包的下一跳地址。

dev ens33:指定了数据包应该通过哪个网络接口发送出去。在这个例子中,数据包将通过名为 ens33 的网络接口发送出去。

# redl-server02 配置
[root@real-server2 ~]# route add default gw 192.168.100.39 dev ens33

# 查看是否添加完成
[root@real-server01 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.174.39 0.0.0.0 UG 0 0 0 ens33
0.0.0.0 192.168.174.2 0.0.0.0 UG 100 0 0 ens33
192.168.174.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33

提示: 上述代码中的IP地址和网卡名称需要和自己的实际创建的一致,注意修改哟!

  1. Director分发器配置

先给LVS服务器新添加一块网卡网络模式设置为桥接模式。会自动生成一个ip,作为VIP。

image-20240412140045570 image-20240412140158353 image-20240412140230022

image-20240413142305761

1
2
3
4
5
6
7

# 开启路由转发
[root@lvs-server ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

# 开启转发功能
[root@lvs-server ~]# sysctl -p

思考题:为什么LVS NAT模式下需要开始路由转发功能?

主要是因为NAT模式的工作原理决定了数据包需要在负载均衡器上进行地址转换。

在NAT模式下,当客户端发送一个请求到虚拟IP地址(VIP)时,这个请求首先到达LVS服务器。LVS服务器会修改数据包的目标IP地址,将其更改为后端真实服务器(RealServer)的IP地址,并将修改后的数据包转发给RealServer。这个过程涉及到了IP地址的转换,也就是NAT。

当RealServer处理完请求并返回响应时,它并不知道最初的请求是发送给VIP的,因此它会直接将响应发送回请求的源IP地址(即客户端的IP地址)。但是,由于RealServer的IP地址与VIP不同,因此这个响应数据包不能直接路由回客户端。此时,LVS服务器需要再次介入,将响应数据包的源IP地址更改为VIP,并将数据包转发给客户端。

为了实现这个过程,LVS服务器需要开启路由转发功能。这是因为默认情况下,Linux服务器不会转发来自非本地网络的数据包。开启路由转发功能后,LVS服务器就能够接收来自RealServer的响应数据包,并将其转发给客户端了。

  1. 定义LVS的分发策略(负载均衡器配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 安装ipvsadm
[root@lvs-server ~]# yum install -y ipvsadm

# 配置ipvs 路由规则存放文件地址,默认无
[root@lvs-server ~]# ipvsadm -S > /etc/sysconfig/ipvsadm

# 启动ipvs,并加入开机自启
[root@lvs-server ~]# systemctl enable --now ipvsadm

# 在IPVS服务器中添加一个虚拟IP(VIP),其IP地址为192.168.246.160,使用tcp协议,端口号为80,并使用轮询算法进行负载均衡。
[root@lvs-server ~]# ipvsadm -A -t 192.168.43.202:80 -s rr
# 参数解释:
-A:添加一个新的虚拟服务。
192.168.43.202:80:指定虚拟服务(VIP)的 IP 地址和端口号。
-t:使用tcp协议。
-s rr:指定调度算法为轮询(round-robin)。

# 添加一台后端主机,如果用户的请求到VIP的端口上时,转发至后端提供服务的主机上,并且使用LVS的NAT模式。
[root@lvs-server ~]# ipvsadm -a -t 192.168.43.202:80 -r 192.168.174.40 -m
[root@lvs-server ~]# ipvsadm -a -t 192.168.43.202:80 -r 192.168.174.41 -m
# 保存配置
[root@lvs-server ~]# ipvsadm -S > /etc/sysconfig/ipvsadm

[root@lvs-server ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.50.128:80 rr
-> 192.168.246.161:80 Masq 1 1 3
-> 192.168.246.162:80 Masq 1 1 3
[root@lvs-server ~]# ipvsadm -L -n --stats // 显示统计信息
[root@lvs-server ~]# ipvsadm -L -n --rate //看速率
  1. 测试游览器访问:http://192.168.43.202