【Linux】LVS(Linux virual server)
集群和分布式简介
集群
概念
集群是指多台服务器集中在一起,实现同一业务,可以视为一台计算机。多台服务器组成的一组计算机,作为一个整体存在,向用户提供一组网络资源,这些单个的服务器就是集群的节点
特点
可扩展性:集群中的服务节点,可以动态的添加机器,从而增加集群的处理能力。
高可用性:如果集群某个节点发生故障,这台节点上面运行的服务,可以被其他服务节点接管,从而增强集群的高可用性。
常见的类型
负载均衡集群(Load Balance Cluster): 常用的有 Nginx 把请求分发给后端的不同web服务器,还有就是数据库集群,负载均衡就是,为了保证服务器的高可用,高并发
高可用集群(High Availability Cluster): 高可用集群,普通两节点双机热备,多节点HA集群
MTBF:Mean Time Between Failure 平均无故障时间,正常时间
MTTR:Mean Time To Restoration( repair)平均恢复前时间,故障时间 A=MTBF/(MTBF+MTTR)
科学计算集群(High Performance Computing Cluster): 简称HPC集群。这类集群致力于提供单个计算机所不能提供的强大的计算能力
分布式
一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式 中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起 来,才是完整的业务
分布式存储:Ceph,GlusterFs,FastDFS,MogileFs
分布式计算:hadoop,Spark
分布式常见应用
分布式应用-服务按照功能拆分,使用微服务
分布式静态资源--静态资源放在不同的存储集群上
分布式数据和存储--使用key-value缓存系统
分布式计算--对特殊业务使用分布式计算,比如Hadoop集群
LVS运行原理
LVS简介
LVS(Linux Virtual Server)即Linux虚拟服务器,是通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器集群,它具有良好可靠性、可扩展性和可操作性,从而以低廉的成本实现最优的服务性能。目前LVS已经被集成到Linux内核模块中。LVS在Linux内核中实现了基于IP的数据请求负载均衡调度方案,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的规则决定将该请求发送给后端的某台Web服务器。LVS工作模式分为NAT模式、DR模式、TUN模式以及fullnet模式
LVS结构
LVS集群工作方式
相关术语
VS:Virtual Server
RS:Real Server
CIP:Client IP
VIP: Virtual serve IP VS外网的IP
DIP: Director IP VS内网的IP
RIP: Real server IP
四种工作方式:
NAT模式
LVS NAT 模式通过负载均衡器(Director)对请求和响应的 IP 地址及端口进行转换,实现后端真实服务器(Real Server,RS)对客户端的透明服务。
请求阶段
客户端发送请求到负载均衡器的虚拟 IP(VIP),负载均衡器根据负载均衡算法(如轮询、加权轮询等)选择一台后端服务器,将请求的目标 IP(VIP)转换为后端服务器的私有 IP(RIP),并转发给该服务器
响应阶段
后端服务器处理请求后,将响应发送给负载均衡器(因默认网关指向负载均衡器),负载均衡器再将响应的源 IP(RIP)转换为 VIP,转发给客户端
优缺点
优点:
配置简单:后端服务器无需特殊配置,只需将网关指向负载均衡器即可
安全性高:后端服务器隐藏在私有网络中,不直接暴露公网,减少被攻击风险
支持多种协议:可对 TCP、UDP 等协议的请求进行负载均衡
缺点:
性能瓶颈:所有请求和响应都需经过负载均衡器转发,负载均衡器可能成为网络瓶颈,尤其在高并发场景下
扩展性有限:受负载均衡器带宽和处理能力限制,后端服务器数量不宜过多(一般最多10台)
DR模式
DR 模式通过修改数据包的 MAC 地址实现负载均衡,避免了 NAT 模式中负载均衡器对所有流量的转发,仅处理请求阶段的流量,响应阶段由后端服务器直接发送给客户端
请求阶段
客户端发送请求到负载均衡器的虚拟 IP(VIP),负载均衡器根据算法选择后端服务器(RS),将数据包的目标 MAC 地址修改为该后端服务器的 MAC 地址(源 MAC 仍为负载均衡器自身),然后转发给后端服务器(IP 层不变,仍为 VIP→RIP)
响应阶段
后端服务器处理请求后,直接将响应数据包发送给客户端(因后端服务器也配置了 VIP,源 IP 为 VIP,目标 IP 为客户端 IP),无需经过负载均衡器
优缺点
优点:
性能优异:负载均衡器仅处理请求流量,响应流量由后端服务器直接发送,大幅降低负载均衡器的压力,适合高并发场景
扩展性强:支持更多后端服务器(理论上可达数百台),受限于网段内的设备数量和带宽
无 IP 转换开销:无需修改 IP 地址,仅修改 MAC 地址,转发效率高
缺点:
网络限制:负载均衡器与后端服务器必须处于同一物理网段(二层可达),无法跨网段部署
VIP 暴露风险:后端服务器需配置 VIP,若未正确限制 ARP,可能导致 VIP 冲突
TUN模式
TUN 模式利用 IP 隧道(将原始数据包封装在新的 IP 数据包中)实现负载均衡,请求阶段由负载均衡器通过隧道转发流量,响应阶段由后端服务器直接回传给客户端,避免了负载均衡器成为流量瓶颈
FULLNAT模式
FULLNAT 模式同时转换请求和响应的源 IP / 目标 IP,允许负载均衡器与后端服务器跨网段部署,且无需后端服务器配置 VIP
LVS的调度算法
LVS调度算法类型
LVS的调度算法分为静态方法与动态方法
静态算法
1、RR:roundrobin 轮询 RS分别被调度,当RS配置有差别时不推荐
2、WRR:Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
3、SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往 第一次挑中的RS,从而实现会话绑定
4、DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请 求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
动态算法
1、LC:least connections(最少链接发) 适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活 动链接数)
适用场景:后端服务器性能基本一致(硬件配置、处理能力相同)的场景,如小规模 Web 集群。
2、WLC:Weighted LC(权重最少链接) 默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
适用场景:后端服务器性能不均(如部分服务器配置更高)的场景
3、SED:Shortest Expection Delay, 初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight “+1” 是为了避免活跃连接数为 0 时公式失效,但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接
4、NQ:Never Queue,第一轮均匀分配,后续SED
5、LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
6、LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制 到负载轻的RS
实验
LVS的Nat模式实验:
实验环境
主机 | IP |
客户端(nat) | 172.25.254.70/24 |
LVS服务器(双网卡,nat与仅主机) | 172.25.254.100/24 192.168.5.10/24 |
web服务器1(仅主机) | 192.168.5.100/24 |
web服务器2(仅主机) | 192.168.5.200/24 |
客户端:
只需配好IP即可
LVS服务器:
配置好IP和内核路由以及LVS规则
IP:
开启内核路由:
编写LVS规则:
查看LVS规则:
web服务器(两台web服务器类似):
安装httpd,开启服务、编写默认发布文件
开启服务:
编写默认发布文件:
关闭火墙(方便测试):
测试(用客户端连续访问172.25.254.100多次):
LVS的DR模式实验:
实验环境:
主机 | IP地址 |
客户端(nat) | 172.25.254.70/24 |
路由器(双网卡) | 172.25.254.100/24 192.168.5.10/24 |
调度器(仅主机) | 192.168.5.17 192.168.5.250(vip) |
服务器1(仅主机) | 192.168.5.100 192.168.5.250(vip) |
服务器2(仅主机) | 192.168.5.100 192.168.5.250(vip) |
客户端主机配置:
配置IP:
#编辑配置文件
vim /etc/NetworkManager/system-connections/eth0.nmconnection[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=172.25.254.70/24,172.25.254.100 #网关指定与服务端同网段的路由器IP#重载网络配置
[root@client ~]# nmcli connection reload
[root@client ~]# nmcli connection up eth0
路由器配置:
配置IP:
#配置与客户端同网段的IP
vim /etc/NetworkManager/system-connections/eth0.nmconnection[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=172.25.254.100/24#配置与LVS服务器同网段的IP
vim /etc/NetworkManager/system-connections/eth1.nmconnection[connection]
id=eth1
type=ethernet
interface-name=eth1[ipv4]
method=manual
address1=192.168.5.10/24
开启内核路由以及地址伪装
#开启内核路由
vim /etc/sysctl.confnet.ipv4.ip_forward = 1#开启地址伪装
firewall-cmd --permanent --add-masquerade#开启iptab地址转换亦可
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.5.10#地址伪装和iptable地址转换选一种即可
LVS主机配置:
配置ip:
vim /etc/NetworkManager/system-connections/eth0.nmconnection[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.5.17/24,192.168.5.10
address2=192.168.5.250/24 #vip
配置LVS规则:
ipvsadm -A -t 192.168.5.250:80 -s rr
ipvsadm -a -t 192.168.5.250:80 -r 192.168.5.100:80 -g
ipvsadm -a -t 192.168.5.250:80 -r 192.168.5.200:80 -g
查看LVS规则:
服务器(两台服务器类似)
配置ip:
#配置IP地址:
vim /etc/NetworkManager/system-connections/eth0.nmconnection[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.5.100/24,192.168.5.10
dns=8.8.8.8#配置vip:
vim /etc/NetworkManager/system-connections/lo.nmconnection[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
method=manual
address1=172.0.0.1/8
address2=192.168.5.250/32
下载、启用、配置httpd
开启服务:
编写默认发布文件:
关闭火墙(方便测试):
关闭服务器1与服务器2响应arp:
测试:
防火墙标记解决轮询调度问题实验:
实验环境与轮询调度类似
问题:以http与https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出 现了一个轮询错乱的问题
问题呈现:
两次调度都在服务器2上
解决问题:
iptables -t mangle -A PREROUTING -d 192.168.5.250 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 777ipvsadm -A -f 777 -s rr
ipvsadm -a -f 777 -r 192.168.5.100 -g
ipvsadm -a -f 777 -r 192.168.5.200 -g
配置LVS规则
测试:
当访问不同端口时RS轮询响应
LVS持久链接
持久连接的作用是让来自同一客户端的请求始终被转发到后端集群里的同一台真实服务器,这有助于处理那些需要保持会话状态的应用
配置持久链接
[root@LVS ~]# ipvsadm -E -f 777 -s rr -p 60