LVS 的全方位解读:从基础概念到搭建实战
1. 集群与分布式
当一台主机被大量用户访问时,如果该主机不能处理这么多的信息就会宕机。此时在用户与该主机之间添加一台主机,且该主机不处理客户访问请求,只做流量调度,这样的体系流程叫做集群。LVS就是负责流量调度的工具。
在互联网中,硬件有瓶颈不能无限增大,但是用户是无限的。只能横向扩展设备,调度流量。
集群
同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能没有差别,数据和代码都是一样的。集群是为了解决某个特定问题将多台计算机组合起来形成的单个系统
- 负载均衡(LB):解决的是单机处理不了请求的问题
- 高可用(HA):不让整体架构出故障
- 高性能计算机(HPC)
分布式
一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务
-
分布式应用-服务按照功能拆分,使用微服务
-
分布式静态资源–静态资源放在不同的存储集群上
集群是一个业务系统,部署在多台主机上,这些主机的数据和代码一致。
分布式是一个业务拆分成多块,每台主机完成不同的任务。
通常情况下集群和分布式是结合使用的。
2. LVS(四层负载)
- 概念
PC0作为执行流量调度的主机,PC1与PC2分别提供静态页面处理和动态页面处理。PC0通过客户访问的请求的报文中的url判断数据流量分配给哪个主机执行。该过程需要PC0将访问的数据拆开,读取数据中的报文,而四层的LVS不能执行TCP三次握手之后的操作,所以有了七层的负载。
但是四层的LVS并没有被淘汰,而是被直接嵌入在内核上,因为内核运行更快。
在上述的集群中,执行流量调度的VS想要将流量分配给对应主机不能使用DNAT。因为DNAT是单点的技术,只能指向一台PC。而集群的工作中需要分配流量给多台PC。
lvs集群体系结构
用户的请求通过网络达到LB,其中PC黑与PC白组合成为一个高可用,他们之间使用虚拟路由的冗余协议进行相互检测,当其中一台主机宕机或者不可用时,另一台主机可以顶替其继续工作,保证了架构的稳定性。LB负责将用户请求调度在不同的ServerPC上,其中调度的方法有NAT模式
,直连路由DR模式
、跨网络的直连路由TURN模式
、FULLNAT模式
(目前编译器不支持)。
LVS概念
名称 | 含义 |
---|---|
VS | Virtual Server,负责调度流量包 |
RS | Real Server,负责真正提供服务 |
CIP | 客户端IP |
VIP | Virtual serve IP,VS外网的IP |
DIP | Director IP,VS内网的IP |
RIP | Real server IP |
LVS软件相关信息
- 程序包:
ipvsadm
- Unit File:
ipvsadm.service
- 规则保存工具:
/usr/sbin/ipvsadm-save
- 规则重载工具:
/usr/sbin/ipvsadm-restore
- 配置文件:
/etc/sysconfig/ipvsadm-config
- ipvs调度规则文件:
/etc/sysconfig/ipvsadm
2.1 NAT模式
工作原理
客户端将请求发送到VS上,其中包含客户端的CIP和请求的目标地址VIP;VS收到请求后通过内部的调度算法将请求发送到某一个后端服务器上(此时假设是Server1),此时请求的IP不变,目标地址IP编程类RIP1;后端服务器Server1收到请求后处理数据将结果返还给VS,此时是一个新的请求,该请求的原IP是RIP1,目标IP是CIP;VS收到该请求后将请求转发给客户端,此时的原IP变成VIP,目标IP不变。客户端收到结果,流程完成。
NAT模式的本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发。
NAT模式中IP的变化:
请求到达的位置 | 原IP | 目标IP | 端口号 |
---|---|---|---|
客户机发出 | CIP | VIP | 80 |
LVS | CIP | RIP1 | 9000 |
Server PC1 | RIP1 | CIP | 9000 |
LVS | VIP | CIP | 80 |
客户端接收 | VIP | CIP | 80 |
缺点:流量的负载全都在lvs的主机上,后台最多挂10台主机。
服务搭建
- 实验环境
- VMWare的虚拟网络编辑器中保证
VMnet1
的仅主机模式和VMnet8
的NAT模式开启 - 虚拟机配置
主机名 | IP | 服务 | 网卡模式 |
---|---|---|---|
Lvs | 172.25.254.100 192.168.0.100 | lvs | NAT模式 仅主机模式 |
server1 | 192.168.0.10 | httpd | 仅主机模式 |
server2 | 192.168.0.20 | httpd | 仅主机模式 |
Test | 172.25.254.136 | / | NAT模式 |
- 详细配置
server主机配置:
- 网卡配置内容如下:
需要注意Server1 与Server2的IP
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
addresses1=192.168.0.10/24,192.168.0.100
method=manual
- 网页配置
下载apache:yum install httpd -y
在网页中配置内容:echo “This is hostname -I
.” > /var/www/html/index.html
-
关闭防火墙和SELinux
-
在lvs主机里检测网址是否能获取内容
curl + IP
Lvs主机配置
- 网卡配置
在VM中添加网卡后在配置文件中做以下配置,NAT模式的网卡配置如下
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
addresses1=172.25.254.100/24,172.25.254.2
method=manual
dns=114.114.114.114
仅主机模式的网卡配置如下
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ipv4]
addresses1=192.168.0.100/24
method=manual
- 修改内核
虚拟机中虽然添加了两张网卡,但是他们互相之间不能交流,所以要修改内核使两张网卡彼此间能够通信。
使用 sysctl -a | grep ip _forwaord
命令查看内核,可以看到此时net.ipv4.ip_forward的参数是0,此刻不允许转发IP,将该参数修改为1即可。修改的文件路径为 /etc/sysctl.conf
。
使用 `sysctl -p`命令使刚才的修改生效
- 下载LVS的软件 ipvsadm:
yum install ipvsadm -y
- 使用
ipvsadm -A -t 172.25.254.100:80 -s rr
命令在lvs中添加新的策略。 - 使用
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 2
命令添加后端服务器的信息。 - 同样将
192.168.0.20
的信息添加在策略中 - 使用
ipvsadm -Ln
命令查看当前策略信息
- 在客户机中使用
curl 172.25.254.100
命令访问
当前权重在此策略不执行是因为在添加策略的时候指定了轮询的算法。
实验总结
在添加策略时有许多字母,以下是一些常用的字母及其解释
命令 | 含义 |
---|---|
-A | 添加一个新的服务 |
-a | 添加realserver |
-C | 清空lvs策略 |
-E | 更改服务 |
-e | 更改realserver |
-f | 火墙 标签 |
-g | 直连路由 |
-i | ip隧道模式 |
-L | 查看lvs策略 |
-m | 当前lvs的模式是NAT |
-n | 不做解析 |
-r | real server |
-s | 指定调度算法 |
-t | 指定服务的类型为tcp |
-u | udp协议 |
-w | 指定权重 |
-Z | -C清空计数器 |
2.2 DR模式(企业用的较多)
工作原理
客户端将请求发送给VS,该请求由VS中的调度策略将请求发送到后端服务器上(假设该服务器为Server1),服务器处理完该请求,发出的结果不通过VS而直接发送给客户端。
完成该工作流程需要后端服务器中存在VIP,但此时该结构中又存在VS的VIP与后端服务器的VIP地址冲突的问题。当一台PC启动时会向网络中发送ARP,向网络中询问是否有设备使用该IP,如果有设备回复则说明该IP被占用。要解决这个问题需要在后端服务器中关闭ARP的回应功能。
因此,在DR模式的信息转发中加入了设备的Mac地址,该流程中的IP不发生改变。VS需要通过ARP广播才能知道后端服务器的Mac地址,该请求的原IP是DIP,目标地址的IP是后端服务器的VIP。
DR模式解决lvs的负载情况,后端服务器只接受请求,不会有任何回应。该模式下不能实现跨VLAN。
服务搭建
1.实验环境
- 虚拟机配置
主机名 | IP | 网关 | 服务 |
---|---|---|---|
client | 172.25.254.200 | 172.25.254.100 | NAT |
router | VIP:172.25.254.100 DIP:192.168.0.100 | 172.25.254.2 | NAT 仅主机 |
lvs | VIP:192.168.0.200/32 DIP:192.168.0.50 | 192.168.0.100 | 仅主机 |
serve1 | RIP:192.168.0.10 VIP:192.168.0.200/32 | 192.168.0.100 | 仅主机 |
serve2 | RIP:192.168.0.20 VIP:192.168.0.200/32 | 192.168.0.100 | 仅主机 |
- 详细配置
Client配置
只需配置客户机的IP和网关,需要注意客户机中不能安装http服务。配置信息如下
router:
- 在VMWare虚拟机中添加物理网卡,并设置其网络模式为仅主机
- 修改本虚拟机的网卡配置如下
注意修改网卡的时候不要弄错两张网卡的配置,在NAT模式的网卡中有网关和dns,而仅主机模式的网卡中只有IP。
- 修改内核 :
echo >> /etc/sysctl.conf net.ipv4.ip_forward=1
,使用sysctl -p
命令使配置生效 - 查看路由信息:
route -n
Lvs主机
- 配置网卡信息如下
使用 ip a a 192.168.0.200/32 dev lo
命令添加一个VIP在主机的环回上,也可以重新添加网卡创建IP,这里为了简便操作就不再新添加网卡操作。此时也不需要修改本机的内核,因为环回通常用于本地进程之间的通信。地址IP添加后,所显示的信息如下。
添加策略
- 进入
/boot
目录 使用ipvsadm -C
命令清空策略,保证干净的实验环境
2.添加以下策略后使用 ipvsadm -Ln
查看策略
ipvsadm -A -t 192.168.0.200:80 -s wrr
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10 -g -w 2
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20 -g -w 1
- Server后端服务器配置
因为两台主机的配置相同,所以我在这里写了一个脚本用于完成实验。
#!/bin/bash
#下载http服务并开启
yum install httpd -y &> /dev/null
systemctl enable httpd --now &> /dev/null
echo "This is `hostname -I`" > /var/www/html/index.html
#修改主机名 / 添加配置信息在hosts文件中
hostnamectl hostname $2
cat > /etc/hosts <<EOF
127.8.8.1 localhost localhost.localdomain localhost4 localhost4.1ocaldomain4
::1 localhost localhost.localdomain localhost6 localhost6.1ocaldomain⁶
$1 $2
EOF
#关闭arp的回复功能
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#关闭防火墙和SELinux
systemctl stop firewalld
setenforce 0
测试阶段
- 测试之前需要关闭所有主机的防火墙和SELinux
- 确保任意两台主机都能ping通
- 在LVS上可以curl到10和20主机的网页内容
- 在客户机上使用
for i in {1..10};do curl 192.168.0.200;done
命令测试,出现下图说明实验成功
- 此时在wireshark中抓包可以看到该操作的流量数据
2.3 调度算法
- 静态调度算法
LVS(Linux Virtual Server)的静态调度算法主要包括以下几种:
轮询(Round Robin,RR) | 加权轮询(Weighted Round Robin,WRR) | 源地址哈希(Source Hash,SH) | |
---|---|---|---|
作用 | 将请求依次轮流分配给后端的真实服务器。 | 根据服务器的权重比例来分配请求。 | 根据请求的源 IP 地址进行哈希计算,将相同源 IP 的请求始终分配到同一台服务器。 |
优点 | 实现简单、公平地分配请求。 | 可以根据服务器的性能差异设置不同的权重,使性能好的服务器处理更多的请求。 | 保证来自相同源地址的请求被分配到同一台服务器,有利于会话保持。 |
缺点 | 不考虑服务器的实际负载和处理能力,可能导致某些服务器负载过高,而某些服务器负载过低。 | 权重设置可能不够灵活,不能实时根据服务器的负载动态调整。 | 当某台服务器故障时,可能会导致部分用户的请求无法得到处理。 |
- 动态调度算法
算法名称 | 作用 | 优点 | 缺点 |
---|---|---|---|
最少连接(Least Connections,LC) | 将新的连接请求分配给当前活动连接数最少的服务器。 | 能够根据服务器的实际负载情况进行分配,使负载更均衡。 | 需要实时统计服务器的连接数,增加了一定的计算开销。 |
加权最少连接(Weighted Least Connections,WLC) | 结合服务器的权重和当前的连接数来分配请求。 | 既考虑了服务器的性能差异,又能根据负载动态分配。 | 权重设置和连接数的统计都需要一定的资源。 |
最短预期延迟(Shortest Expected Delay,SED) | 作用:根据服务器的权重和当前连接数计算预期延迟,将请求分配给预期延迟最小的服务器。 | 综合考虑了服务器的性能和负载。 | 计算预期延迟的公式相对复杂,增加了调度的复杂性。 |
永不排队(Never Queue,NQ) | 在有空闲服务器时,直接将请求分配到空闲服务器,避免请求排队。 | 能够快速响应请求,减少等待时间。 | 可能导致某些服务器空闲,而某些服务器负载较高。 |
基于局部性的最少连接(Locality-Based Least Connections,LBLC) | 根据请求的目标 IP 地址的“局部性”来进行负载均衡决策。如果一个目标 IP 地址的请求最近被分配到某台服务器,后续来自相同目标 IP 地址的请求也会倾向于分配到同一台服务器。 | 一定程度上考虑了请求的相关性和局部性,有利于提高性能。 | 对于目标 IP 地址分布不均匀的情况,可能导致某些服务器负载过高。 |
带复制的基于局部性最少连接(Locality-Based Least Connections with Replication,LBLCR) | 在 LBLC 的基础上,增加了对“热门”内容的复制功能。对于经常被访问的内容,会在多台服务器上进行复制,以提高访问效率。 | 进一步提高了对热门内容的访问速度。 | 增加了系统的复杂性和存储开销,因为需要复制数据。 |
2.4 防火墙标记解决轮询调度问题
如果在 Linux 虚拟机中的 RS模式中同时开放 80 和 443 端口,并默认采用分开轮询的控制方式,可能有以下原因:
- 服务分离与优化:80 端口通常用于 HTTP 服务,443 端口用于 HTTPS 服务。分开轮询可以根据不同服务的特点和负载情况进行更精细的负载均衡,确保两种服务都能得到合理的资源分配。
- 安全性考虑:HTTPS 服务涉及加密通信,对服务器资源的消耗可能与 HTTP 服务有所不同。分开轮询有助于更好地管理和保障两种服务的安全性和稳定性。
- 业务需求差异:不同的业务可能对 HTTP 和 HTTPS 服务有不同的访问模式和负载特征。分开轮询可以根据这些差异进行针对性的调度,提高整体服务质量。
该实验在以上DR模式的配置环境下实验,以下只展示每台PC中需要修改的部分。
Server后端服务器配置
- 安装mod_ssl模块:
yum install mol_ssl -y
mod_ssl
软件包在 Linux 中的主要作用是为 Web 服务器(如 Apache)提供支持安全套接层(SSL)和传输层安全(TLS)协议的功能。
- 重启apache
systemctl restart httpd
lvs配置
-
使用
ipvsadm -C
命令清除所有的策略 -
使用
iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66
命令。-t mangle
:指定操作的表为 mangle 表。-A PREROUTING
:表示在 PREROUTING 链上添加一条规则。-d 192.168.0.200
:指定目标 IP 地址为 192.168.0.200 。-p tcp
:表示匹配 TCP 协议的数据包。-m multiport --dports 80,443
:使用 multiport模块匹配目标端口为80
和443
。-j MARK --set-mark 66
:表示对匹配的数据包执行MARK
操作,将标记值设置为66
。
-
使用
iptables -t mangle -nl
命令查看标签 -
在
/boot
下添加策略如下ipvsadm -a -f 66 -r 192.168.0.10 -g ipvsadm -a -f 66 -r 192.168.0.20 -g ipvsadm -Ln
测试
在客户机上测试 curl 192.168.0.200;curl -k https://192.168.0.200
出现结果如下
实验成功。