集群与LVS详解

集群

一、集群概览

集群指将多台计算机或服务器集成在一起,使它们像单一系统一样协同工作。其核心目标是提升系统的可用性和性能,并支持负载均衡和高可用性。

二、集群类型

集群可以分为三种主要类型:

  1. LB(Load Balancing):负载均衡集群,由多个主机组成,每个主机承担一部分访问任务。
  2. HA(High Availability):高可用集群,旨在避免单点故障(SPOF),通过冗余设计提高系统的可用性。
  3. HPC(High-performance Computing):高性能计算集群,专为处理复杂计算任务而设计,提供极高的计算性能。
三、关键技术与概念

3.1 负载均衡 (Load Balancing)

负载均衡技术将流量均匀分配到多个服务器,以避免任何单一服务器的过载。负载均衡器位于客户端请求的前端,接收请求并根据特定算法(如轮询、最少连接数等)将请求分发到后端服务器。这种机制能够提高系统的性能和可靠性。

3.2 高可用性 (High Availability)

高可用性是指系统或组件能够在预期的时间内持续运行。它通过冗余和故障转移机制来实现,目的是最小化停机时间并确保服务的连续性。高可用性通常涉及使用多个服务器、网络路径或数据存储系统,以确保在一个组件失败时,其他组件能够接管,避免显著的服务中断。

3.3 客户端 IP (Client IP)

客户端 IP 是指客户端设备在网络中的唯一 IP 地址。它用于标识发起请求的设备,并在负载均衡器或代理服务器中,帮助确定请求的源头,从而确保请求被正确地转发到相应的服务器。

3.4 虚拟服务器 IP (Virtual Server IP)

虚拟服务器 IP 指的是虚拟服务器的 IP 地址。在虚拟化环境中,每个虚拟服务器(虚拟机)都有一个独特的 IP 地址,用于网络通信。虚拟服务器 IP 在负载均衡和高可用性架构中,用于将请求分发到实际的物理服务器上。

四、分布式
  • 分布式存储:如Ceph, GlusterFS, FastDFS, MogileFS。
  • 分布式计算:如Hadoop, Spark。

常见应用:

  • 分布式应用:按功能拆分为多个微服务。
  • 分布式静态资源:将静态资源放在不同的存储集群上。
  • 分布式数据和存储:使用Key-Value缓存系统。
  • 分布式计算:对特殊业务使用分布式计算,比如Hadoop集群。
五、集群和分布式的区别
  • 集群:同一业务系统部署在多台服务器上,每台服务器功能相同,数据和代码一致。
  • 分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上,每台服务器功能不同,数据和代码也不同。分布式系统通过缩短单个任务的执行时间来提高效率,而集群通过增加单位时间内执行的任务数来提高效率。

例子:对于大型网站,使用负载均衡器将用户请求分配到多台后端服务器。如果一台服务器故障,其他服务器可以继续提供服务。而在分布式系统中,每个节点完成不同的业务,如果一个节点故障,该业务可能会失败。

六、LVS 及其局限性

LVS (Linux Virtual Server) 是一种基于 Linux 内核的负载均衡解决方案,主要支持四层协议(TCP 和 UDP)。这意味着 LVS 在网络模型的传输层(第四层)操作,而不是在应用层(第七层)进行数据包处理。

  • 性能:四层操作减少了数据包处理的延迟,因为不需要解析应用层协议(如 HTTP 或 HTTPS)。
  • 简单性:四层协议的数据包结构相对简单,使得 LVS 更容易实现高效和稳定的负载均衡。
  • 透明度:四层负载均衡器对客户端和服务端来说几乎是透明的,因为它们不会改变应用层的负载内容。

当需要根据 URL 进行路由决策时(例如,一台服务器提供静态内容而另一台提供动态内容),LVS 本身无法直接处理七层负载均衡的需求。为解决这一问题,可以采取以下几种方法:

  1. 结合七层负载均衡器:使用如 Nginx、HAProxy 等七层负载均衡器与 LVS 结合使用,以处理基于 URL 的负载均衡需求。
  2. 使用额外的软件模块:某些 LVS 实现可以通过加载额外的软件模块来支持七层功能,但这种方法可能会影响性能。
  3. 代理服务器:设置代理服务器作为 LVS 前端,由代理服务器负责 URL 分析并将请求转发给 LVS。
六、LVS 运行原理

LVS (Linux Virtual Server) 是一个由章文嵩博士发起的自由软件项目,作为负载调度器集成到 Linux 内核中。主要术语包括:

  • DR(Director Router):负载均衡器/分发器。
  • VS(Virtual Server):负载均衡集群对外提供的 IP + Port。
  • RS(Real Server):后端请求处理服务器。
  • CIP(Client IP):客户端访问的 IP。
  • VIP(Virtual Server IP):VS 外网的 IP,提供外网访问的虚拟 IP。
  • DIP(Director IP):VS 内网的 IP,负载均衡器 IP。
  • RIP(Real Server IP):后端请求处理服务器的 IP。

访问流程

  1. 用户请求:当用户发送请求时,这个请求首先会到达负载均衡器(Load Balancer)。

  2. 负载均衡器(调度器):负载均衡器将用户的请求分配到后端的多个Web服务器中。它会根据每台Web服务器的负载情况来决定将请求发送到哪一台服务器,以实现负载均衡。

  3. Web服务器:接收到请求的Web服务器处理用户请求,并可能需要访问数据库来获取或存储数据。由于Web服务器是集群部署的,所以它们有相同的配置和功能,任何一台服务器都可以处理相同类型的请求。

  4. 数据库服务器:数据库通常采用分布式存储技术,以应对大量数据的存储和访问需求。每个Web服务器可以访问数据库来处理数据请求。分布式数据库可以将数据分片存储在不同的节点上,提高数据访问的速度和系统的可扩展性。

LVS集群的类型及其特点

  • LVS-NAT (Network Address Translation)

    • 特点:在LVS-NAT模式下,调度器(VS)会修改请求报文的目标IP地址,将目标IP地址改为某个真实服务器(RS)的IP地址(RIP),实现多目标IP的DNAT(Destination Network Address Translation)。
    • 工作流程:客户端发送请求到虚拟服务器的VIP,调度器根据调度算法选择一个真实服务器并将请求的目标IP地址修改为该真实服务器的RIP,然后将请求转发给真实服务器。真实服务器处理完请求后,响应数据包返回到调度器,调度器再将响应数据包的目标IP地址修改为VIP,并转发给客户端。
    • 适用场景:适合于小型集群或网络环境,但可能会增加调度器的负载。
  • LVS-DR (Direct Routing)

    • 特点:在LVS-DR模式下,调度器会操纵请求报文,封装一个新的MAC地址,使请求直接发送到真实服务器上,而不必经过调度器的二次转发。
    • 工作流程:客户端发送请求到虚拟服务器的VIP,调度器根据调度算法选择一个真实服务器,并将请求报文的MAC地址修改为目标真实服务器的MAC地址,然后将请求直接广播或单播到真实服务器。真实服务器处理完请求后,直接将响应数据包发送给客户端。
    • 适用场景:适合于较大的集群,因为它减少了数据包在网络中的跳转次数,降低了延迟。
  • LVS-TUN (IP Tunneling)

    • 特点:在LVS-TUN模式下,调度器会在原始请求报文之外添加一个新的IP首部,形成一个IP隧道,将请求报文封装在里面,发送给真实服务器。

    • 工作流程:客户端发送请求到虚拟服务器的VIP,调度器根据调度算法选择一个真实服务器,并在原始请求报文之外添加一个新的IP首部,形成一个IP隧道,将请求报文封装在里面,然后将封装后的数据包发送给真实服务器。真实服务器解封装数据包,处理请求后,直接将响应数据包发送给客户端。

    • 适用场景:适合于跨不同物理位置的集群,因为可以通过现有的IP网络轻松实现数据包的传输。

  • LVS-FULLNAT (Full Network Address Translation)

    • 特点:在LVS-FULLNAT模式下,调度器会同时修改请求报文的源和目标IP地址,实现源和目的地址的转换。

    • 工作流程:客户端发送请求到虚拟服务器的VIP,调度器根据调度算法选择一个真实服务器,并修改请求报文的源IP地址为调度器的内部IP地址(DIP),目标IP地址为真实服务器的RIP,然后将请求转发给真实服务器。真实服务器处理完请求后,将响应数据包发送给调度器,调度器再将响应数据包的目标IP地址修改为客户端的IP地址(CIP),并转发给客户端。

    • 适用场景:适合于需要更多灵活性的场景,例如在NAT环境中,或者当真实服务器不在同一个子网内时。

接下来让我们开始实验:

NAT集群实验

在这里插入图片描述

  1. 环境概述
    使用RED HAT9.4系统克隆4台机器
  • 客户端(Client): 发起请求的主机。
  • 负载均衡器(LVS): 实现负载均衡的主机。
  • 真实服务器1(RS1): 提供实际服务的服务器。
  • 真实服务器2(RS2): 也提供实际服务的服务器。

lvs配置

lvs网络环境配置

网卡配置eth0
在这里插入图片描述

网卡配置eth1  
[root@lvs ~]# vmset.sh eth1 192.168.0.100 lvs.timinglee.org

进入eth1.nmconnection 修改网络配置

root@lvs ~]# vim /etc/NetworkManager/system-connections/eth1.nmconnection


nmcli connection reload会重新读取和应用网络连接的相关设置。                                                                               
nmcli connection up eth1:此命令用于激活名为 eth1 的网络连接。这将使该网络接口处于可用状态,以便进行数据传输和通信。

在这里插入图片描述

# 查询当前系统是否开启了IP转发功能 
[root@lvs ~]# sysctl -a | grep ip_forward 
net.ipv4.ip_forward = 0  # 当前系统IP转发功能是关闭的 
net.ipv4.ip_forward_update_priority = 1 
net.ipv4.ip_forward_use_pmtu = 0 

# 打开/etc/sys目录,准备编辑IP转发相关的配置文件 
[root@lvs ~]# vim /etc/sys 
sysconfig/          sysctl.d/           system-release      

sysctl.conf         systemd/            system-release-cpe  




# 打开sysctl.conf文件进行编辑
[root@lvs ~]# vim /etc/sysctl.conf 



# 查看sysctl.conf文件内容
[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  # 将IP转发功能设置为开启

# 应用sysctl.conf文件中的配置
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1  # 确认IP转发功能已经开启

配置两个webserver
1.两个webserver网卡都是仅主机模式

在这里插入图片描述

web1 网卡配置
在这里插入图片描述

web2 网卡配置

在这里插入图片描述

web1修改网络配置
在这里插入图片描述
web2修改网络配置
在这里插入图片描述

测试网络
在这里插入图片描述

web1网络配置

# 安装Apache HTTP服务器
[root@webserver1 ~]# yum install httpd -y
# 将webserver1写入Apache的默认网页
[root@webserver1 ~]# echo webserver1 - 192.168.0.10 > /var/www/html/index.html
立即启动服务
[root@webserver1 ~]# systemctl enable --now httpd

web2网络配置

# 安装Apache HTTP服务器 
[root@webserver2 ~]# yum install httpd -y  
# 将webserver2写入Apache的默认网页 
[root@webserver1 ~]# echo webserver2- 192.168.0.20 > /var/www/html/index.html


立即启动服务 
[root@webserver1 ~]# systemctl enable --now httpd



在lvs检查到webserver
在这里插入图片描述

lvs配置ipvsadm

# 安装ipvsadm工具
[root@lvs ~]# dnf install ipvsadm

# 查看当前IP虚拟服务器的配置
[root@lvs ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

# 添加一个新的虚拟服务,使用轮询(rr)调度算法,但未指定端口,导致错误
[root@lvs ~]# ipvsadm -A -t 172.25.254.100 -s rr 
Zero port specified for non-persistent service

# 正确添加一个新的虚拟服务,指定端口80
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr 

# 再次查看当前IP虚拟服务器的配置,确认虚拟服务已添加
[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.254.100:80 rr

# 将192.168.0.10:80作为真实服务器添加到虚拟服务中,使用MASQUERADE模式 
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m


# 再次查看当前IP虚拟服务器的配置,确认真实服务器已添加 
[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.254.100:80 rr 
  -> 192.168.0.10:80              Masq    1      0          0 

测试
在这里插入图片描述

# 添加一个虚拟服务器,使用轮询(rr)调度算法,将流量转发到真实服务器
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m

# 查看当前IP虚拟服务器的配置
[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.254.100:80 rr
  -> 192.168.0.10:80              Masq    1      0          3         
  -> 192.168.0.20:80              Masq    1      0          3

测试
在这里插入图片描述



nmcli connection reload 
nmcli connection up eth1 

LVS(Linux Virtual Server)部署命令介绍

1 LVS软件相关信息
  1. 程序包

    • ipvsadm:这是管理LVS的工具包,用于配置和管理虚拟服务器。
  2. Unit File

    • ipvsadm.service:系统服务文件,用于控制ipvsadm服务的启动和停止。
  3. 主程序

    • /usr/sbin/ipvsadm:主程序,用于执行LVS的配置和管理操作。
  4. 规则保存工具

    • /usr/sbin/ipvsadm-save:用于保存当前的LVS规则。
  5. 规则重载工具

    • /usr/sbin/ipvsadm-restore:用于重载保存的LVS规则。
  6. 配置文件

    • /etc/sysconfig/ipvsadm-config:存储ipvsadm的配置信息。
  7. ipvs调度规则文件

    • /etc/sysconfig/ipvsadm:存储LVS的调度规则。
2 ipvsadm命令

核心功能

  • 管理集群服务:添加、删除、修改
  • 管理集群中的真实服务器(RS):添加、删除、修改
  • 查看当前配置和状态

命令参数

  1. 管理集群服务

    ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pepersistence_engine] [-b sched-flags]
    
    • -A:添加服务
    • -E:修改服务
    • -t:TCP服务
    • -u:UDP服务
    • -f:防火墙标签
    • -s:指定调度算法(默认为WLC
    • -p:设置持久连接超时(使得同一来源的请求被调度到同一真实服务器)
    • -M:指定网络掩码
    • --pepersistence_engine:持久连接引擎
    • -b:调度标志
    ipvsadm -D -t|u|f service-address  # 删除服务
    ipvsadm -C  # 清空所有LVS规则
    ipvsadm -R  # 重载规则
    ipvsadm -S [-n]  # 保存规则,`-n`表示不解析
    
    
    
3 LVS集群中的增删改
  1. 管理集群服务中的增删改

    • 增加服务
      ipvsadm -A -t 172.25.254.100:80 -s rr
      ipvsadm -A -f 66 -p 3000
      
    • 修改服务
      ipvsadm -E -t 172.25.254.100:80 -s wrr -p 3000
      
    • 删除服务
      ipvsadm -D -t 172.25.254.100:80
      ipvsadm -D -f 66
      
  2. 管理集群中真实服务器的增删改

    • 增加真实服务器
      ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.30 -m
      ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.40 -m -w 2
      
    • 修改真实服务器
      ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -m -w 1
      ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -i -w 1
      
    • 删除真实服务器
      ipvsadm -d -t 172.25.254.100:80 -r 192.168.0.30
      
  3. 查看配置和状态

    • 查看LVS策略
      ipvsadm -Ln  
      ipvsadm -Ln --rate  
      
    • 清空配置
      ipvsadm -C  
      ipvsadm -Z -t 172.25.254.20:80  
      
      
      
      

实验2 DR模式部署

拓扑图
在这里插入图片描述

实验环境
在这里插入图片描述

lvs网络配置

在这里插入图片描述

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e80fa4d72f064034b0f540b4e52b29e4.png)

router 网络配置
在这里插入图片描述

# 显示eth0网络连接配置 
[root@router ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 

[connection] 
id=eth0
type=ethernet
interface-name=eth0

[ipv4]
# 配置eth0的IPv4地址和网关
address1=172.25.254.100/24,172.25.254.2
method=manual
# 配置DNS服务器
dns=114.114.114.114;

# 显示eth1网络连接配置
[root@router ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection 


[connection]  
id=eth1  
type=ethernet  
interface-name=eth1  

[ipv4]  
# 配置eth1的IPv4地址  
address1=192.168.0.100/24  
method=manual  

# 编辑sysctl.conf文件以启用IP转发  
[root@router ~]# vim /etc/sysctl.conf   

# 应用sysctl配置  
[root@router ~]# sysctl -p  
net.ipv4.ip_forward = 1  
# 启用IPv4转发,允许路由器转发网络包  



client网络配置

在这里插入图片描述

# 编辑eth0网络连接配置
[root@client ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection 

# 重新加载NetworkManager配置
[root@client ~]# nmcli connection reload 

# 激活eth0网络连接
[root@client ~]# nmcli connection up eth0
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)

# 显示更新后的eth0网络连接配置
[root@client ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0 

[ipv4] 
# 配置eth0的IPv4地址和网关 
address1=172.25.254.200/24,172.25.254.100 
method=manual 

# 显示当前路由表 
[root@client ~]# route -n 
Kernel IP routing table 
# 默认网关 
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

0.0.0.0         172.25.254.100  0.0.0.0         UG    100    0        0 eth0 
# eth0接口的直连网络 
172.25.254.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0 

web1 网络配置

[root@webserver1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0

[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual

[root@webserver1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.100   0.0.0.0         UG    100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
[root@webserver1 ~]# 

web2网络配置


[root@webserver2 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0

[ipv4]
address1=192.168.0.20/24,192.168.0.100
method=manual
dns=114.114.114.114;
[root@webserver2 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.100   0.0.0.0         UG    100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0

webserver1webserver2上,通过以下命令设置了ARP协议的行为,以解决响应问题:
webserver1上:

[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

webserver2上:

[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

以下是每个参数的作用:

  • arp_ignore 设置为1:这表示系统只响应那些目标IP地址属于本地接口的ARP请求。这有助于防止系统对不应该由它响应的ARP请求做出响应。

  • arp_announce 设置为2:这表示系统在发送ARP请求时,会尽量避免将非本地地址广播到本地网络之外。这样可以减少不必要的网络流量,并提高网络安全性。

在LVS、webserver1和webserver2上配置回环IP地址以及LVS策略的步骤,并测试其负载均衡功能:
在LVS上添加回环IP地址:

[root@lvs ~]# ip a a 192.168.0.200/32 dev lo

在webserver1和webserver2上分别添加相同的回环IP地址:

[root@webserver1 ~]# ip a a 192.168.0.200/32 dev lo
[root@webserver2 ~]# ip a a 192.168.0.200/32 dev lo

在LVS上添加IPVS规则,以实现负载均衡:

[root@lvs ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20/:80 -g -w 2

这里,-A 添加一个新的虚拟服务,-t 指定虚拟服务地址和端口,-s 指定调度算法(这里是加权轮询wrr)。-a 添加一个新的真实服务器,-r 指定真实服务器的地址和端口,-g 指定使用直接路由模式,-w 指定权重。
测试负载均衡,使用curl命令连续访问虚拟IP地址:

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

根据测试结果,webserver1(192.168.0.10)和webserver2(192.168.0.20)被依次访问,且webserver2由于权重更高(权重为2),被访问的次数更多。这是符合加权轮询(WRR)调度算法的行为。

LVS(Linux Virtual Server)是基于Linux内核开发的一款高可用性负载均衡软件,其主要功能是将客户端的请求均匀地分配至后端的多个真实服务器(Real Server),以此提升系统的整体性能和可靠性。LVS提供了多种调度算法,这些算法决定了请求的分配方式,从而实现有效的负载均衡。以下是LVS调度算法的重新概述:

LVS调度算法概览

1 静态调度算法
  1. 轮询调度(Round Robin, RR)
    • 操作原理: 按顺序轮流将请求分配至集群中的各个Real Server。
    • 优势: 简洁明了,无需跟踪所有连接状态,属于无状态调度。
  2. 加权轮询调度(Weighted Round Robin, WRR)
    • 操作原理: 根据Real Server的处理能力赋予不同权重,性能更强的服务器分配更多请求。
    • 优势: 按照服务器实际处理能力分配请求,提高资源的使用效率。
  3. 目标地址散列调度(Destination Hashing, DH)
    • 操作原理: 以请求的目标IP地址为哈希键,从预分配的哈希表中查找对应的服务器。
    • 优势: 同一目标地址的请求始终转发至首次调度的Real Server,适用于正向代理缓存场景。
  4. 源地址散列调度(Source Hashing, SH)
    • 操作原理: 以请求的源IP地址为哈希键,从预分配的哈希表中查找对应的服务器。
    • 优势: 同一源IP地址的请求始终发往首次调度的Real Server,实现会话保持。
2 动态调度算法
  1. 最少连接调度(Least-Connection, LC)
    • 操作原理: 动态地将请求调度至连接数最少的Real Server。
    • 优势: 在服务器性能相近的情况下,能较好地均衡负载。
  2. 加权最少连接调度(Weighted Least-Connection Scheduling, WLC)
    • 操作原理: 针对服务器性能差异,权重高的服务器承担更多连接负载。
    • 优势: 根据服务器性能和负载动态调整请求分配。
  3. 最短期望延迟调度(Shortest Expected Delay Scheduling, SED)
    • 操作原理: 在WLC算法基础上,若服务器连接数与权重比例相同,优先选择权重高的服务器。
    • 优势: 确保性能最佳的服务器优先处理请求。
  4. 永不排队调度(Never Queue Scheduling, NQ)
    • 操作原理: 如果有Real Server的连接数为0,直接分配请求,无需进行SED计算。
    • 优势: 减少等待时间,提升响应速度。
  5. 基于局部性的最少连接调度(Locality-Based Least Connections, LBLC)
    • 操作原理: 根据请求的目标IP,找出最近使用的服务器,若该服务器可用且未超载,则分配请求。
    • 优势: 提高缓存命中率,优化集群处理能力。
  6. 带复制的基于局部性的最少连接调度(LBLC with Replication, LBLCR)
    • 操作原理: 维护目标IP地址到一组服务器的映射,按最少连接原则从组内选出未超载的服务器。
    • 优势: 解决LBLC负载不均的问题,提升系统稳定性和性能。
3 其他调度算法

LVS还支持其他调度算法,如Overflow-connection(OVF)等,这些算法在不同的应用场景下展现出独特的优势和适用性。

LVS-mark标记解决调度问题

1轮询规则中可能会遇到的错误

在处理轮询时,特别是对HTTP和HTTPS端口的流量进行负载均衡时,可能会遇到轮询混乱的问题。例如,当RS(Real Servers)同时开放80和443端口时,可能会出现以下问题:

  • 轮询错乱:当第一次访问80端口时,流量可能会被分配到RS1,但下一次访问443端口时,流量仍可能被分配到RS1上。
2 防火墙标记解决轮询调度问题

FWM: FireWall Mark 可以用来给特定的报文打标记,通过标记来解决轮询调度中的问题。

实验三 实现方法:
  1. 在webserver1和webserver中安装mod_ssl并重启Apache
    # yum install mod_ssl -y  
    # systemctl restart httpd  
    
轮询规则中可能会遇到的错误

# 以下命令序列是设置LVS(Linux Virtual Server)的轮询规则
# 添加一个新的虚拟服务,使用轮询(rr)调度算法
[root@lvs ~]# ipvsadm -A -t 192.168.0.200:443 -s rr
# 将192.168.0.10:443作为真实服务器添加到虚拟服务中,使用-g(gatewaying)模式
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:443 -g
# 将192.168.0.20:443作为真实服务器添加到虚拟服务中,使用-g(gatewaying)模式
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g

# 列出LVS的虚拟服务器表 
[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  192.168.0.200:80 wrr yu 
  -> 192.168.0.10:80              Route   1      0          0          

  -> 192.168.0.20:80              Route   2      0          0            

TCP  192.168.0.200:443 rr    
  -> 192.168.0.10:443             Route   1      0          0            

  -> 192.168.0.20:443             Route   1      0          0     
以下命令是测试轮询规则
 
# 使用curl命令访问192.168.0.200的HTTP和HTTPS服务  
# 注意:-k 参数是允许curl执行“不安全”的SSL连接和传输  
# 第一次测试,预期结果是轮询到192.168.0.20 
[root@router ~]# curl 192.168.0.200;curl -k https://192.168.0.200

webserver2 -192.168.0.20
webserver2 -192.168.0.20
# 第二次测试,预期结果是轮询到192.168.0.10
[root@router ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver1 -192.168.0.10
webserver1```-192.168.0.10
# 第三次测试,预期结果是轮询到192.168.0.20
[root@router ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2 -192.168.0.20
webserver2 -192.168.0.20

防火墙标记解决轮询调度问题



# 使用iptables设置防火墙标记
[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66
# 查看iptables规则
[root@lvs ~]# iptables -t mangle -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
MARK       tcp  --  0.0.0.0/0            192.168.0.200        multiport dports 80,443 MARK set 0x42
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination   
# 清除现有的IPVS规则
[root@lvs ~]# ipvsadm -C
# 查看IPVS规则(无规则)
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
# 添加IPVS规则,使用轮询调度算法
[root@lvs ~]# ipvsadm -A -f 66 -s rr
# 添加真实服务器到IPVS规则
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.10 -g
# 查看添加后的IPVS规则
[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  66 rr
  -> 192.168.0.10:0               Route   1      0          0         
# 添加第二个真实服务器到IPVS规则
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.20 -g
# 再次查看IPVS规则
[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  66 rr
  -> 192.168.0.10:0               Route   1      0          0         
  -> 192.168.0.20:0               Route   1      0          0   

测试轮询调度

# 测试第一次请求       
[root@router ~]# curl 192.168.0.200;curl -k https://192.168.0.200

webserver2 -192.168.0.20       
webserver1 -192.168.0.10       
# 测试第二次请求       
[root@router ~]# curl 192.168.0.200;curl -k https://192.168.0.200

webserver1 -192.168.0.10   
webserver2 -192.168.0.20  
# 测试第三次请求  
[root@router ~]# curl 192.168.0.200;curl -k https://192.168.0.200

webserver2 -192.168.0.20
webserver1 -192.168.0.10
# 测试第四次请求
[root@router ~]# curl 192.168.0.200;curl -k https://192.168.0.200

LVS会话持久化问题解决

LVS(Linux Virtual Server)是一个高度可用的负载均衡解决方案,但在默认配置下,它不提供会话持久化功能,这可能导致用户在交互过程中会话被分配到不同的后端服务器。

一、环境准备

延续前期实验的环境

二、清除现有规则

首先,清除LVS当前的规则,确保从干净的状态开始。

[root@lvs ~]# ipvsadm -C

三、配置LVS规则

  1. 创建一个防火墙标记(Firewall Mark)为66的虚拟服务。
[root@lvs ~]# ipvsadm -A -f 66 -s rr
  1. 将后端服务器添加到虚拟服务中,这里使用-g(gatewaying)模式。
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.10 -g
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.20 -g
  1. 查看当前规则,确认无误。
[root@lvs ~]# ipvsadm -Ln

四、实现会话持久化

  1. 尝试添加持久化参数,如果服务已存在,将提示错误。
[root@lvs ~]# ipvsadm -A -f 66 -s rr -p
Service already exists
  1. 使用-E参数修改现有服务,添加持久化参数。
[root@lvs ~]# ipvsadm -E -f 66 -s rr -p
  1. 再次确认规则,此时应该看到持久化标记。
[root@lvs ~]# ipvsadm -Ln

输出中应该包含persistent 360,表示会话将在360秒内保持持久化。

五、测试会话持久化

在另一台机器上(例如路由器),使用curl测试访问LVS的VIP(192.168.0.200),重复多次请求。

[root@router ~]# for i in {1..10}; do curl 192.168.0.200; done

如果配置正确,应该看到所有请求都被定向到同一个后端服务器,如:

webserver2 -192.168.0.20
webserver2 -192.168.0.20
webserver2 -192.168.0.20
webserver2 -192.168.0.20
webserver2 -192.168.0.20
webserver2 -192.168.0.20
webserver2 -192.168.0.20
webserver2 -192.168.0.20

...

重复测试,如果请求仍然定向到同一服务器,说明会话持久化配置成功。

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值