LVS 809

一、基本概念

  1. LVS定义
    • LVS是一个开源的负载均衡解决方案,它将一个真实服务器集群虚拟成一台服务器来对外提供服务,同时在真实服务器集群中实现了负载均衡。
  2. 核心组件
    • VS(Virtual Server):虚拟服务器,也称为分发器或调度器,负责接收客户端的请求,并根据负载均衡算法将请求分发给后端真实服务器。
    • DS(Director Server):前端负载均衡器节点,即VS的实体化。
    • RS(Real Server):后端真实的工作服务器,负责处理VS分发的请求并返回响应。
  3. 关键术语
    • VIP(Virtual IP):LVS实例的IP地址,通常是暴露在公网中的地址,作为用户请求的目标IP。
    • DIP(Director IP):DS的IP地址,主要用于和内部主机通讯。
    • RIP(Real IP):RS的真实IP地址。

二、工作原理

LVS工作在网络层(OSI模型的第四层——传输层),通过修改IP地址(NAT模式)或修改目标MAC地址(DR模式)来实现请求的转发和响应的返回。LVS支持TCP/UDP协议的负载均衡,可以根据不同的调度算法将请求分发给后端服务器。

三、调度算法

LVS提供了多种调度算法,以适应不同的应用场景和负载需求。常见的调度算法包括

  • 静态调度
  • rr(Round Robin):轮询算法,按顺序依次将请求分发给后端服务器。
  • wrr(Weighted Round Robin):加权轮询算法,根据后端服务器的权重来分配请求。
  • sh(Source Hashing):源地址散列算法,根据请求的源IP地址进行散列,将相同源IP的请求分发给同一台后端服务器。
  • dh(Destination Hashing):目标地址散列算法,根据请求的目标IP地址进行散列,将相同目标IP的请求分发给同一台后端服务器。
  • 动态调度
  • lc(Least-Connection):最少连接算法,将请求分发给当前连接数最少的后端服务器。
  • wlc(Weighted Least-Connection):加权最少连接算法,根据后端服务器的权重和当前连接数来分配请求。
  • sed(Shortest Expected Delay):最短期望延迟算法,考虑连接数和服务器性能等因素,将请求分发给期望延迟最小的后端服务器。
  • nq(Never Queue):永不排队算法,如果RS的连接数等于其权重,则不进行分配。
  • LBLC(Locality-Based Least Connection):基于本地的最少连接算法,将目标IP地址与同一子网内的RS进行映射,以实现更好的本地性。
  • LBLCR(Locality-Based Least Connections with Replication):基于本地的带复制功能的最少连接算法,是LBLC算法的改进版,可以处理请求量超过后端服务器处理能力的情况。

优势与特点

高性能:LVS基于内核网络层面工作,具有超强的承载能力和并发处理能力,单台LVS负载均衡器可支持上万并发连接。

低成本:LVS是开源软件,无需购买昂贵的硬件设备,可以以低廉的成本实现最优的服务性能。

高可靠性:LVS支持多种负载均衡算法和多种工作模式(如NAT模式、DR模式等),可以根据实际需求进行灵活配置,确保服务的可靠性和稳定性。可扩展性:LVS理论上能够无限水平扩展,使得服务能够应对海量数据的冲击。

管理集群服务中的增删改
-A #添加

-E #修改

-t #tcp服务

-u #udp服务

-s #指定调度算法,默认为WLC

-p #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver

-f #firewall mask 火墙标记 一个数

管理集群中RealServer的增删改
-a #添加realserver

-e #更改realserver

-t #tcp协议

-u #udp协议

-f #火墙 标签

-r #realserver地址

-g #直连路由模式

-i #ipip隧道模式

-m #nat模式

-w #设定权重

-Z #清空计数器

-D #删除某条lvs策略

-C #清空lvs策略

-L #查看lvs策略

-n #不做解析

--rate :输出速率信息

lvs-nat模式原理及部署方法

准备三台虚拟机,一台为LVS另外两台是webser1,webserver2

[root@netmask ~]# vmset.sh eth0 172.25.254.100 netmask 255.255.255.0
[root@apache ~]# vim /etc/NetworkManager//system-connections/eth1.nmconnection
[root@apache ~]# cat /etc/NetworkManager//system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.25.254.100/24,172.25.254.2
method=manual
dns=114.114.114.114;
[root@lvs ~]# nmcli connection reload
[root@lvs ~]# nmcli connection up eth1
[root@lvs ~]#  systemctl stop firewalld   
[root@lvs ~]# curl 192.168.0.10
webserver1 - 192.168.0.10
[root@lvs ~]# curl 192.168.0.20
webserver2 - 192.168.0.20
[root@lvs yum.repos.d]# dnf install ipvsadm -y  
[root@lvs yum.repos.d]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@lvs yum.repos.d]# ipvsadm -A -t 172.25.254.100 -s rr
Zero port specified for non-persistent service
[root@lvs yum.repos.d]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@lvs yum.repos.d]# 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
[root@lvs yum.repos.d]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@lvs yum.repos.d]# 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


[root@netmask ~]# vmset.sh eth0 192.168.0.10  netmask 255.255.255.0
[root@netmask ~]#  vim /etc/NetworkManager/system-connections/eth0.nmconnection
[root@netmask ~]#  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
dns=114.114.114.114;
[root@lvs ~]# nmcli connection reload
[root@lvs ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
 
[root@netmask ~]# 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@netmask ~]# dnf install httpd -y
[root@netmask ~]# echo webserver1 - 192.168.0.10 > /var/www/html/index.html

[root@netmask ~]# vmset.sh eth0 192.168.0.20  netmask 255.255.255.0
[root@netmask ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[root@netmask ~]# 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@lvs ~]# nmcli connection reload
[root@lvs ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
 
[root@netmask ~]# 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@netmask ~]# yum install httpd -y   
[root@netmask ~]# echo webserver2 - 192.168.0.20 > /var/www/html/index.html
[root@netmask ~]# systemctl enable --now httpd

[root@client ~]#  vim /etc/NetworkManager/system-connections/eth0.nmconnection
[root@client ~]#  cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
 
[ipv4]
address1=172.25.254.200/24,172.25.254.100
method=manual
dns=114.114.114.114;

[root@router ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[root@router ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
 
[ipv4]
address1=172.25.254.100/24,172.25.254.2
method=manual
dns=114.114.114.114;
[root@router ~]# vim /etc/NetworkManager/system-connections/eth1.nmconnection
[root@router ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1

[ipv4]
address1=192.168.0.100/24
method=manual
dns=114.114.114.114;
[root@router ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1      
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0

[root@router ~]# vim /etc/sysctl.conf
[root@router ~]# 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

[root@router ~]# vim /etc/sysctl.conf
[root@router ~]# sysctl -p


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

[ipv4]
address1=192.168.0.50/24,192.168.0.100
method=manual
dns=114.114.114.114;
[root@lvs ~]# route -n
[root@lvs ~]# ip a a 192.168.0.200/32 dev lo
[root@lvs ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 192.168.0.200/32 scope global lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever

[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[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 -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
  -> 192.168.0.10:80              Route   1      0          0
  -> 192.168.0.20:80              Route   2      0          0

webserver1:使VIP不对外响应给环回添加ip设vip

[root@netmask ~]# nmcli connection reload
[root@netmask ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
 
[root@netmask ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@netmask ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@netmask ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@netmask ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@netmask ~]# ip a a 192.168.0.200/32 dev lo   

LVS(Linux Virtual Server)算法是Linux虚拟服务器集群系统中的负载均衡调度算法,用于决定如何将客户端的请求分发到后端真实服务器(Real Server)上。LVS算法主要分为静态算法和动态算法两大类,每种算法都有其特定的应用场景和优缺点。以下是对LVS算法的详细解析:

静态算法

静态算法只根据算法本身进行调度,而不考虑后端服务器的实际连接情况和负载情况。常见的静态算法包括:

  1. 轮询(Round Robin, RR)
    • 原理:调度器通过“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器。
    • 适用场景:适用于服务器性能相近且负载均衡需求较为简单的场景。
    • 优点:实现简单,请求分配均匀。
    • 缺点:无法考虑服务器的实际性能和负载情况。
  2. 目标地址散列(Destination Hash, DH)
    • 原理:根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器。
    • 适用场景:适用于需要将特定目标IP的请求发送到同一服务器的场景。
  3. 源地址散列(Source Hash, SH)
    • 原理:根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器。
    • 适用场景:适用于需要保持会话一致性的场景,如缓存服务或数据库查询。

      动态算法

      动态算法会根据后端真实服务器的实际连接情况来分配请求。常见的动态算法包括:

    • 最少连接(Least Connections, LC)
      • 原理:动态地将网络请求调度到已建立的连接数最少的服务器上。
      • 适用场景:适用于服务器性能相近且需要均衡负载的场景。
      • 优点:能更好地实现负载均衡。
    • 加权最少连接(Weighted Least Connections, WLC)
      • 原理:在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。
      • 适用场景:服务器性能差异较大的场景。
    • 最短延迟(Shortest Expected Delay, SED)
      • 原理:在WLC基础上改进,通过计算服务器的期望延迟来选择延迟最短的服务器。
      • 适用场景:需要优化响应时间的场景。
    • 永不排队/最少队列(Never Queue Scheduling, NQ)
      • 原理:无需队列,如果有服务器的连接数为0就直接分配请求,不考虑其他因素。
      • 适用场景:对响应时间要求极高且服务器性能差异不大的场景。
    • 基于局部性的最少连接(Locality-Based Least Connections, LBLC)
      • 原理:基于局部性的最少连接调度算法是针对目标IP地址的负载均衡,它根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,则将请求发送到该服务器。
      • 适用场景:主要用于Cache集群系统。
防火墙标签解决轮询错误

安装mod_ssl并重启apache

[root@netmask ~]# yum install mod_ssl -y
正在更新 Subscription Management 软件仓库。
[root@netmask ~]# systemctl restart  httpd  重启httpd服务

[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -Ln
[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports                                        80,443 -j MARK  --set-mark 66
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@lvs ~]# ipvsadm -A -t 192.168.0.200:443 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:443 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g
[root@lvs ~]# ipvsadm -A -t 192.168.0.200:80 -s rr
[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 -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 rr
  -> 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

为端口做标记:

[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK  --set-mark 666

client客户端测试


[root@client ~]# curl 192.168.0.200;curl -k  https://192.168.0.200
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
[root@client ~]# curl 192.168.0.200;curl -k  https://192.168.0.200
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10

本项目是一个基于SSM(Spring+SpringMVC+MyBatis)后端框架与Vue.js前端框架开发的疫情居家办公系统。该系统旨在为居家办公的员工提供一个高效、便捷的工作环境,同时帮助企业更好地管理远程工作流程。项目包含了完整的数据库设计、前后端代码实现以及详细的文档说明,非常适合计算机相关专业的毕设学生和需要进行项目实战练习的Java学习者。 系统的核心功能包括用户管理、任务分配、进度跟踪、文件共享和在线沟通等。用户管理模块允许管理员创建和管理用户账户,分配不同的权限。任务分配模块使项目经理能够轻松地分配任务给团队成员,并设置截止日期。进度跟踪模块允许员工实时更新他们的工作状态,确保项目按计划进行。文件共享模块提供了一个安全的平台,让团队成员可以共享和协作处理文档。在线沟通模块则支持即时消息和视频会议,以增强团队之间的沟通效率。 技术栈方面,后端采用了Spring框架来管理业务逻辑,SpringMVC用于构建Web应用程序,MyBatis作为ORM框架简化数据库操作。前端则使用Vue.js来实现动态用户界面,搭配Vue Router进行页面导航,以及Vuex进行状态管理。数据库选用MySQL,确保数据的安全性和可靠性。 该项目不仅提供了一个完整的技术实现示例,还为开发者留下了扩展和改进的空间,可以根据实际需求添加新功能或优化现有功能。
本项目是一个基于SSM(Spring+SpringMVC+MyBatis)后端框架与Vue.js前端框架开发的网上球鞋竞拍系统。该项目旨在为球鞋爱好者提供一个便捷、高效的在线竞拍平台,用户可以在此平台上浏览、搜索、竞拍心仪的球鞋,并参与到各种有趣的竞拍活动中。 系统的主要功能包括用户注册登录、球鞋信息展示、竞拍活动创建与管理、实时竞拍以及交易安全保障等。用户可以通过注册账号后,浏览平台上发布的各类球鞋信息,包括品牌、型号、颜色、尺码以及当前竞拍状态等。系统支持用户创建和管理自己的竞拍活动,设定竞拍规则和时间,同时提供实时竞拍功能,确保公平、透明的交易过程。 在技术实现上,后端采用SSM框架进行开发,Spring负责业务逻辑层,SpringMVC处理Web请求,MyBatis进行数据库操作,保证了系统的稳定性和扩展性。前端则使用Vue.js框架,结合Axios进行数据请求,实现了前后端分离,提高了开发效率和用户体验。 数据库设计方面,系统采用了MySQL数据库,存储用户信息、球鞋信息、竞拍活动等数据,确保数据的安全性和完整性。此外,项目还包含了详细的文档资料,包括需求分析、系统设计、数据库设计以及测试报告等,为项目的实施和维护提供了有力的支持。 该项目不仅适合作为计算机相关专业学生的毕业设计题目,也适合Java学习者进行实战练习,通过在此基础上进行功能扩展和改进,可以进一步提升编程技能和项目管理能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值