LVS(Linux virual server) Linux 虚拟服务器

avatar
作者
猴君
阅读量:0

LVS简介

LVS (Linux Virtual Server) 是一个基于 Linux 内核的负载均衡集群技术。它通过 IP 负载均衡技术和基于内容请求分发技术,将访问请求分发到多个服务器上,从而实现整个服务器集群对外提供高可用性和高性能的服务。

作用
  • 提高响应速度:通过将请求分发到多台服务器,可以显著减少单一服务器的压力,提高响应速度。
  • 增加系统可用性:当某一台后端服务器出现问题时,LVS 可以将其从服务池中剔除,确保用户仍然能够访问其他健康的服务器。
  • 负载均衡:合理分配流量,防止过载。
LVS的优势与不足

优势

  • 成本低:使用开源软件构建,无需额外购买昂贵的硬件或软件。
  • 高性能:能够处理大量并发连接。
  • 高可用性:通过故障检测机制确保服务不中断。
  • 易于扩展:可以通过增加更多的后端服务器来轻松扩展系统。

不足

  • 配置复杂度较高:对于初学者来说可能需要花费较多的时间学习和配置。
  • 调试困难:问题排查可能较为复杂,尤其是在大型部署环境中。
  • 缺乏高级特性:与商业解决方案相比,在某些高级功能方面可能存在局限。
LVS专业术语
  • Director:负责接收客户端请求并根据调度算法选择后端服务器进行转发。
  • Real Server:实际处理客户端请求的服务节点。
  • Scheduler:位于 Director 中的模块,用于决定将请求转发给哪个 Real Server。
集群简介

集群是指一组相互连接的计算机协同工作以完成特定任务的集合。集群可以提供更高的可用性、负载均衡和计算能力。

分布式简介

分布式系统是由多台独立计算机组成的网络,这些计算机通过通信协议相互通信和协作,共同完成一个或多个任务。分布式系统可以跨越不同的地理位置。

LVS集群体系结构

LVS 架构主要包括以下几个部分:

  • 前端(Director):接收外部请求的入口。
  • 后端(Real Server):处理实际业务逻辑的服务器。
  • 调度器(Scheduler):决定如何将请求分发给后端服务器。
    在这里插入图片描述
  1. 第一层:负载调度器(Load Balancer / Scheduler)

    • 职责:接收客户端的请求,并根据一定的调度算法选择合适的后端服务器进行转发。
    • 实现:在 LVS 中,这一层通常由运行在 Linux 内核中的调度器实现,例如 IPVS(IP Virtual Server)模块。
    • 示例:NAT、DR 或 TUN 模式的调度器。
  2. 第二层:服务器池(Server Pool / Real Servers)

    • 职责:处理负载调度器转发过来的请求,并返回结果。
    • 实现:由一组实际的服务器组成,它们可以是物理服务器也可以是虚拟机。
    • 示例:Web 服务器、应用服务器等。
  3. 第三层:共享存储(Shared Storage)

    • 职责:提供数据的一致性和高可用性,确保所有服务器都能访问相同的最新数据。
    • 实现:可以通过 NFS、SAN、NAS 或分布式文件系统等多种技术实现。
    • 示例:NFS 共享文件系统、Ceph 分布式存储等。

LVS 集群体系结构示意图

这里是一个简化的 LVS 集群体系结构示意图:

+------------------+       +----------------+       +----------------+ | Load Balancer    | ----> | Server Pool    | ----> | Shared Storage | | (Scheduler)      |       | (Real Servers) |       |                | +------------------+       +----------------+       +----------------+ 

LVS 集群的工作流程

  1. 客户端发起请求:客户端向虚拟 IP 地址发送请求。
  2. 负载调度器接收请求:负载调度器接收到请求后,根据设定的调度算法选择一台合适的服务器。
  3. 请求转发:负载调度器将请求转发到选定的后端服务器。
  4. 服务器处理请求:后端服务器处理请求,并从共享存储中获取必要的数据。
  5. 响应返回:后端服务器处理完请求后,将响应发送回客户端。
  6. 负载调度器处理响应:在某些模式下(如 NAT 模式),负载调度器可能会参与响应的处理,以确保正确的 IP 地址转换。

注意事项

  • NAT 模式:在 NAT 模式下,所有的请求和响应都需要经过负载调度器。
  • DR 模式:在 DR 模式下,请求和响应直接在客户端和服务器之间传输,负载调度器仅负责请求的转发。
  • TUN 模式:在 TUN 模式下,请求和响应也直接在客户端和服务器之间传输,负载调度器通过 IP 封装技术进行转发。

这种三层架构确保了 LVS 集群不仅能够高效地处理高并发请求,还能够保证数据的一致性和高可用性。

LVS集群的类型

LVS 支持三种基本的集群架构:

  • NAT (Network Address Translation):通过 NAT 进行地址转换。
  • DR (Direct Routing):直接路由。
  • TUN (IP Tunneling):IP 封装隧道。
LVS负载均衡四种工作模式
  1. NAT模式

    • 在此模式下,Director 收到客户端的请求后,将请求的目的 IP 地址改为后端服务器的 IP 地址,并转发给该服务器。
    • 后端服务器直接回应给 Director,Director 再将响应包中的源 IP 地址改回虚拟服务 IP,然后转发给客户端。
    • 优点是简单易用,但 Director 是瓶颈,且后端服务器需要和 Director 在同一个子网内。
  2. DR模式

    • Director 和后端服务器共享同一个物理网络接口地址。
    • Director 收到请求后,改变 MAC 地址并转发给后端服务器,后端服务器直接回应客户端。
    • 适合大规模的集群环境,但所有服务器必须在同一广播域内。
  3. TUN模式

    • Director 使用 IP 封装技术将请求发送给后端服务器。
    • 后端服务器解封装后处理请求,并直接回应客户端。
    • 适合地理位置分散的集群。
  4. Fullcone模式

    • Fullcone 模式是在 DR 模式的基础上,允许 Director 对不同的客户端使用不同的 MAC 地址进行转发。
    • 这种模式适用于需要在不同子网之间转发的情况。

LVS的调度算法

LVS 的调度算法决定了如何将请求分发到后端的 Real Server 上。这些算法可以根据不同的策略来优化负载均衡效果,提高系统的整体性能和可用性。LVS 支持多种调度算法,分为静态和动态两大类。

LVS静态调度算法

静态调度算法是指在调度过程中不考虑后端服务器的实际负载情况,而是按照一定的规则来进行调度。

  • 轮询(Round Robin, RR):按顺序轮流将请求分发到每一台后端服务器。
  • 加权轮询(Weighted Round Robin, WRR):为每台服务器分配一个权重值,按照权重比例轮流分发请求。
  • 最少连接(Least Connections, LC):将新的请求分发给当前连接数最少的服务器。
  • 加权最少连接(Weighted Least Connections, WLC):为每台服务器分配一个权重值,按照权重和当前连接数的比例来选择服务器。
LVS动态调度算法

动态调度算法是指在调度过程中考虑后端服务器的实际负载情况,以达到最优的负载均衡效果。

  • 最短预期延迟(Shortest Expected Delay, SED):基于服务器的负载情况和历史响应时间,选择最合适的服务器。这要求 LVS 能够收集到每台服务器的实时状态信息。
  • 加权最短预期延迟(Weighted Shortest Expected Delay, WSED):为每台服务器分配一个权重值,并结合服务器的当前负载和历史响应时间来选择服务器。
LVS常见调度算法

以下是 LVS 中一些常见的调度算法:

  • 轮询(Round Robin, RR)
  • 最少连接(Least Connections, LC)
  • 最短预期延迟(Shortest Expected Delay, SED)
  • 加权轮询(Weighted Round Robin, WRR)
  • 加权最少连接(Weighted Least Connections, WLC)
  • 加权最短预期延迟(Weighted Shortest Expected Delay, WSED)
ipvsadm

ipvsadm 是一个用于管理 LVS 的命令行工具。它可以用来创建、修改和删除 LVS 的服务定义和服务实例。以下是一些 ipvsadm 常见的操作命令:

语法

 ipvsadm -A|E -t|u|f <集群服务地址> [-s <调度算法>] [-p <超时时间>] [-M <掩码>] [-b <标志>]  ipvsadm -D -t|u|f <集群服务地址>  ipvsadm -C  ipvsadm -R  ipvsadm -S [-n]  ipvsadm -a|e -t|u|f <集群服务地址> -r <真实服务器地址> [选项]  ipvsadm -d -t|u|f <集群服务地址> -r <真实服务器地址>  ipvsadm -L|l [options]  ipvsadm -Z [-t|u|f <集群服务地址>]  ipvsadm --set <超时时间>  ipvsadm --start-daemon <主或备> [--mcast-interface <组播接口>] [--syncid <SID>]  ipvsadm --stop-daemon <主或备>  ipvsadm -h 

子命令

  --add-service     -A        添加一个集群服务,需要使用选项   --edit-service    -E        编辑一个集群服务,需要使用选项   --delete-service  -D        删除指定集群服务,需要使用选项   --clear           -C        删除所有集群服务,包括真实服务器转发策略规则   --restore         -R        从标准输入中恢复策略规则   --save            -S        保存策略规则到标准输出   --add-server      -a        添加一个真实服务器,需要使用选项   --edit-server     -e        编辑一个真实服务器,需要使用选项   --delete-server   -d        删除一个真实服务器,需要使用选项   --list            -L|-l     查看集群服务列表,包括真实服务器转发策略规则   --zero            -Z        计数器清零。清除连接数、包转发等数量统计信息 --set <超时时间>            设置TCP、TCPFIN(TCP关闭连接状态)、UDP连接超时时间,用于                              会话保持。一般情况下TCP和UDP超时时间保持默认就好,TCPFIN                              可以根据情况设定,指定它则用户请求连接关闭,该连接则会变                              为非活跃(InActive)空闲等待状态,在空闲等待时间内,如果                              来自同一源IP的请求,则还会转发给后端的同一台真实服务器上  --start-daemon              开启连接同步守护进程。在选项后面指定自己是Master(主)还                              是backup(备),主负载调度器会同步所有策略及连接状态到备                              负载调度器,当主故障,备可以接替其工作  --stop-daemon               停止连接同步守护进程  --help            -h        显示帮助信息 

选项

--tcp-service  -t  <集群服务地址>   允许集群服务使用的传输协议为TCP。<IP:Port>  --udp-service  -u <集群服务地址>    允许集群服务使用的传输协议为UDP。<IP:Port>  --fwmark-service  -f <防火墙标识>   使用一个整数值来防火墙标识集群服务,而不是地址、                                      端口和协议使用它,我们可以通过结合IPtables将多                                      个以调度器为目标的端口定义成一个防火墙标识,由                                      ipvsdam通过此项关联标识,则可以实现对一个IP多                                      端口调度,即实现后端服务器可以开放多个服务  --scheduler    -s scheduler         指定集群服务使用的调度算法:rr|wrr|lc|wlc|lblc                                      |lblcr|dh|sh|sed|nq,默认为wlc  --persistent   -p <超时时间>        开启持久化服务,开启它则表示在指定时间内,来自同                                      一IP的请求都会转发到后端同一台真实服务器上  --netmask      -M <网络掩码>        使用网络掩码来屏蔽持久化来源IP的地址范围,默认值                                      为255.255.255.255,即所有来源IP请求都会享受持久                                      化服务  --real-server  -r <真实服务器地址>  指定真实服务器的主机IP与端口  --gatewaying   -g                   指定真实服务器转发工作模式,使用DR模式,默认  --ipip         -i                   指定真实服务器转发工作模式,使用TUN模式  --masquerading -m                   指定真实服务器转发工作模式,使用NAT模式  --weight       -w <权重值>          指定真实服务器的权重值  --u-threshold  -x <上阀值>          设置转发请求的最大上连接阀值,范围为0~65535,当                                      当连接数超过指定上限时,LVS则不会转发请求                                     --l-threshold  -y <下阀值>          设置转发请求的下连接阀值,范围为0~65535,当连接                                      数降低至指定值时,LVS则继续提供服务,默认值为0  --mcast-interface interface         设置用于连接同步守护进程的组播接口  --syncid sid                        设置连接同步守护进程的SID号,用于标识,范围0~255  --connection   -c                   显示连接信息,一般与"-l"连用  --timeout                           显示TCP、TCPFIN、UDP超时时间信息,一般与"-l"连用  --daemon                            显示连接同步守护信息,一般与"-l"连用  --stats                             显示统计信息,一般与"-l"连用  --rate                              显示转发速率信息,一般与"-l"连用  --exact                             显示数据包和字节计数器的确切值,扩大字符长度  --thresholds                        显示阀值信息,一般与"-l"连用  --persistent-conn                   显示持久化连接信息,一般与"-l"连用  --numeric      -n                   地址和端口以数字格式显示,一般与"-l"连用  --sched-flags  -b <标识>            设置调度算法的范围标识,用于SH算法,有两个标识:                                      sh-fallback,如果真实服务器不可用,则将其转发到                                      其他真实服务器上。                                      sh-port,将源地址的端口号也添加到散列键=值中 

ipvsadm 提供了强大的灵活性来管理 LVS 的配置,使其成为 LVS 日常管理和维护的重要工具之一。

实验项目

第一部分 NAT模式
nodeIPVIProlemethod
LVS192.168.0.100172.25.250.100调度器NAT、仅主机
RS1192.168.0.10服务器1仅主机
RS2192.168.0.20服务器2仅主机
client172.25.250.200客户端NAT

网络配置信息
LVS网络配置

cat /etc/NetworkManager/system-connections/eth0.nmconnection cat /etc/NetworkManager/system-connections/eth1.nmconnection 

(文件名可能不同,自行查看)
在这里插入图片描述
RS网络配置
同上查看方法
在这里插入图片描述
client网络配置
在这里插入图片描述
方便辨识以下更改主机名,方法如下:

hostnamectl set-hostname lvs 

更改后重新打开终端即可

第二部分 在LVS中启用内核路由功能
[root@lvs ~]# sysctl -a | grep ip_forward net.ipv4.ip_forward = 0 net.ipv4.ip_forward_update_priority = 1 net.ipv4.ip_forward_use_pmtu = 0 [root@lvs ~]#  [root@lvs ~]# vim /etc/sysctl.conf  [root@lvs ~]#  [root@lvs ~]# sysctl -p net.ipv4.ip_forward = 1 [root@lvs ~]#  [root@lvs ~]# cat /etc/sysctl.conf  # sysctl settings are defined through files in # /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/. # # Vendors settings live in /usr/lib/sysctl.d/. # To override a whole file, create a new file with the same in # /etc/sysctl.d/ and put new settings there. To override # only specific settings, add a file with a lexically later # name in /etc/sysctl.d/ and put new settings there. # # For more information, see sysctl.conf(5) and sysctl.d(5). net.ipv4.ip_forward=1 

安装ipvsadm

yum install ipvsadm -y 

添加调度策略

ipvsadm -A -t 172.25.250.100:80 -s rr ipvsadm -a -t 172.25.250.100:80 -r 192.168.0.10:80 -m ipvsadm -a -t 172.25.250.100:80 -r 192.168.0.20:80 -m 

查看调度策略

 [root@lvs ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn TCP  172.25.250.100:80 rr   -> 192.168.0.10:80              Masq    1      0          0            -> 192.168.0.20:80              Masq    1      0          0  

保存策略

[root@lvs ~]# ipvsadm -Sn -A -t 172.25.250.100:80 -s rr -a -t 172.25.250.100:80 -r 192.168.0.10:80 -m -w 1 -a -t 172.25.250.100:80 -r 192.168.0.20:80 -m -w 1   [root@lvs ~]# cat /etc/sysconfig/ipvsadm -A -t 172.25.250.100:80 -s rr -a -t 172.25.250.100:80 -r 192.168.0.10:80 -m -w 1 -a -t 172.25.250.100:80 -r 192.168.0.20:80 -m -w 1 

设置开机启动

systemctl enable --now ipvsadm.service 

第三部分 RS1和RS2中配置服务并测试

设置web服务
安装httpdnf install httpd -y

[root@rs1 ~]# echo RS1 > /var/www/html/index.html  [root@rs1 ~]# systemctl restart httpd   [root@rs2 ~]# echo RS2 > /var/www/html/index.html  [root@rs2 ~]# systemctl restart httpd 

client客户端测试
测试LVS调度器的VIP

[root@client ~]# for i in {1..10} > do  > curl 172.25.250.100 > done RS1 RS2 RS1 RS2 RS1 RS2 RS1 RS2 RS1 RS2 

防火墙标签解决轮询错误

在RS中安装mod_ssl并重启apache

yum install mod_ssl -y systemctl restart httpd 

在这里插入图片描述
设定端口标签

iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 666 

在这里插入图片描述
设定调度规则

[root@lvs ~]# ipvsadm -C   [root@lvs ~]# ipvsadm -A -f 666 -s rr [root@lvs ~]# ipvsadm -a -f 666 -r 192.168.0.10 -g [root@lvs ~]# ipvsadm -a -f 666 -r 192.168.0.20 -g   [root@lvs ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn FWM  666 rr   -> 192.168.0.10:0               Route   1      0          0            -> 192.168.0.20:0               Route   1      0          0            [root@lvs ~]# systemctl restart ipvsadm.service    [root@lvs ~]# cat /etc/sysconfig/ipvsadm -A -f 666 -s rr -a -f 666 -r 192.168.0.10:0 -g -w 1 -a -f 666 -r 192.168.0.20:0 -g -w 1 

client客户端测试

[root@client ~]# curl -k https://192.168.0.200 RS1 [root@client ~]# curl -k https://192.168.0.200 RS2     [root@client ~]# curl -k https://192.168.0.200;curl 192.168.0.200 RS1 RS2 

    广告一刻

    为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!