当前位置: 首页 > news >正文

LVS(Linux virual server)

1.集群和分布式简介

1.1.系统性能扩展方式
  • Scale UP :向上扩展,增强,有极限

  • Scale Out:向外扩展,增加设备,调度分配问题,cluster

1.2.集群

Cluster: 集群是为了解决某个特定问题将堕胎计算机组合起来形成的单个系统

Cluster常见的三种类型:

  • LB: LoadBalancing (负载均衡)由多个主机组成,每个主机只承担一部分访问 解决访问的压力问题

  • HA: High Availiablity(高可用)解决故障问题 SPOF(single Point Of failure)

    • MTBF : Mean Time Between Failure 平均无故障时间,正常时间

    • MTTR : Mean Time To Restoration( repair)平均恢复前时间,故障时间 故障恢复时间

    • A= MTBF /( MTBF+MTTR) (0,1) :99%, 99.5%, 99.9%, 99.99%, 99.999%值越小故障时间越长

  • SLA:Service level agreement (服务等级协议)是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定。通常这个开销是驱动提供服务质量的主要因素。在常规的领域中,总是设定所谓的三个9,四个9来进行表示,当没有达到这种水平的时候,就会有一 些列的惩罚措施,而运维最主要的目标就是达成这种服务水平。停机时间又分为两种, 一种是计划内停机时间, 一种是计划外停机时间,而运维则主要关注计划外停机时间

  • HPC: High-performance computing (高性能计算,国家战略资源)

1.3分布式

a+b+c+d 主机A计算a+b 主机B计算c+d 主机C计算主机A+主机B

分布式存储:Ceph ,GlusterFs , FastDFS , MogileFs

分布式计算:hadoop ,Spark

分布式常见应用

  • 分布式应用-服务按照功能拆分,使用微服务

  • 分布式静态资源--静态资源放在不同的存储集群上

  • 分布式数据和存储--使用key-value缓存系统

  • 分布式计算--对特殊业务使用分布式计算,比如Hadoop集群

1.4集群和分布式
  • 集群:一个业务系统部署在多台服务器上,集群中,每台服务器实现的功能没有差别

  • 分布式: 将一个业务拆分成多个子业务,或者是不同的业务部署在多台服务器上。在分布式中,每台服务器实现的功能是有差别的,分布式每台服务器的功能加起来,才是完整的业务

  • 分布式是缩短单个任务的执行时间来提升效率,而集群则是通过提高单位时间内执行的任务数来提升效率

2.LVS运行原理

2.1简介

LVS:Linux Virtual Server,Linux 虚拟服务器,是一个基于 Linux 内核的高性能负载均衡器,由章文嵩博士主导开发,主要用于在集群环境中实现对多台服务器的流量分发,提高服务的可用性和扩展性。

2.2lvs集群结构

工作原理:VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS

2.3lvs概念
  • VS:Virtual Server

  • RS: Real Server

  • CIP :Client IP

  • VIP: Virtual serve IP VS外网的IP

  • DIP: Director IP VS内网的IP

  • RIP: Real server IP

  • 访问流程: CIP <--> VIP == DIP <--> RIP

2.4lvs集群的类型

lvs-nat:修改请求报文的目标IP,多目标IP的DNAT

lvs-dr:操纵封装新的MAC地址

lvs-tun:在原请求IP报文之外新加一个IP首部

lvs-fullnat:修改请求报文的源和目标IP

2.4.1nat模式
  • 本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为被挑出的RS的RIP和 PORT实现转发

  • RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP

  • 请求报文和响应报文都必须经由Director转发, Director易于成为系统瓶颈

  • 支持端口映射,可修改请求报文的目标PORT

  • LVS必须是Linux系统, 而RS可以是任意OS系统

传输过程:
  1. 客户端向lvs发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(vip)访问目标端口 (9000port)

  2. lvs服务器接收到访问请求做DNAT把请求数据包中的目的地由vip换成RS的rip和相应端口

  3. RS1响应请求,发送响应数据包,包中的响应报文为数据来源(rip1)响应目标(cip)和响应端口 (9000port)

  4. lvs服务器接收到响应数据包,改变包中的数据来源(rip1-->vip),响应目标端口(9000-->80)

  5. lvs服务器将修改过的报文的响应数据包回传给客户端

  6. lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞

客户请求到达vip后进入prerouting,在没有ipvs的时候该进入本机INPUT,当ipvs存在后访问请求在通 过prerouting后被ipvs结果并作nat转发

因为ipvs的作用点是在prerouting和INPUT链之间,所以如果在prerouting中设定规则会干扰ipvs的工作。所以在做lvs时要把iptables的火墙策略全清理掉

2.4.2dr模式

DR: Direct Routing,直接路由,lvs的默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变

dr模式数逻辑:

在DR模式中, RS接收到访问请求后不需要回传给VS调度器,直接把回传数据发送给client,所以RS和vs 上都要有vip

传输过程:
  1. 客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC

  2. lvs调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端IP+客户端 的MAC+VIP+RS1的MAC

  3. RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的 MAC

特点
  1. Director和RS都配置有VIP

  2. 确保前端路由器将目标IP为VIP的请求报文发往Director

  3. 在前端网关做静态绑定VIP和Director的MAC地址

  4. RS的RIP可以使用私网地址,也可以是公网地址; RIP与DIP在同一IP网络;

  5. RIP的网关不能指向DIP,以确保响应报文不会经由Director

  6. RS和Director要在同一个物理网络

  7. 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client

  8. 不支持端口映射(端口不能修改)

2.4.3tun模式

转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部 (源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP 是CIP)

传输过程:
  1. 客户端发送请求数据包,包内有源IP+vip+dport

  2. 到达vs调度器后对客户端发送过来的数据包重新封装添加IP报文头,新添加的IP报文头中包含 TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到RS1

  3. RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含SRCIP(VIP)+DSTIP(CIP) +port,响应数据包通过网络直接回传给client

特点:
  1. DIP, VIP, RIP都应该是公网地址

  2. RS的网关一般不能指向DIP

  3. 请求报文要经由Director,但响应不能经由Director

  4. 不支持端口映射 

  5. RS的OS须支持隧道功能

2.4.4fullnet模式

ullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发

CIP --> DIP

VIP --> RIP

特点:
  1. VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP

  2. RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client

  3. 请求和响应报文都经由Director

  4. 支持端口映射

2.5lvs调度算法
2.5.1lvs调度算法类型

静态方法:仅根据算法本身进行调度,不考虑RS的负载情况

动态方法:根据每台RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度

2.5.2lvs静态调度算法
  1. RR:roundrobin 轮询 RS轮流被调度

  2. WRR :Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少

  3. SH :Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次选择的RS,从而实现会话绑定

  4. DH: Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS

2.5.3lvs动态调度算法

主要根据RS当前的负载状态及调度算法进行调度,Overhead=value较小的RS会被调度

  1. LC: least connections(最少链接发)

    适用于长连接应用Overhead(负载值)=activeconns(活动链接数)x 256+inactiveconns(非活动链接数)

  2. WLC:Weighted LC(权重最少链接)

    默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight

  3. SED :Shortest Expection Delay,/初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight

    但是,当node1的权重为1 , node2的权重为10,经过运算前几次的调度都会被node2承接

  4. NQ: Never Queue,第一轮均匀分配,后续SED

  5. LBLC: Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理

  6. LBLCR: LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制 到负载轻的RS

3.部署命令介绍

3.1lvs软件相关信息

程序包: ipvsadm

Unit File: ipvsadm.service

主程序:/usr/sbin/ipvsadm

规则保存工具: /usr/sbin/ipvsadm-save

规则重载工具: /usr/sbin/ipvsadm-restore

配置文件: /etc/sysconfig/ipvsadm-config

ipvs调度规则文件: /etc/sysconfig/ipvsadm

3.2ipvsadm命令

核心功能:

  • 集群服务管理:增、删、改

  • 集群服务的RS管理:增、删、改 查看

参数

命令解释
-A|E增加|修改
-D删除
-R重载
-S保存
-ttcp服务
-uudp服务
-s指定调度算法
-p设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver
-ffirewall mask 火墙标记
-a|e添加|更改realserver
-t|utcp|udp协议
-g直连路由模式
-iipip隧道模式
-mnat模式
-w设定权重
-Z清空计数器
-C|-L清空|查看lvs策略
--rate输出速率信息

pvs规则:/proc/net/ip_vs

ipvs连接:/proc/net/ip_vs_conn

4.LVS实战

4.1部署NAT模式集群
  • 克隆四台rhel9.4

  • client:nat模式

  • lvs:双网卡 nat连接外网,仅主机网卡与web服务器相连

  • web服务器采用仅主机网卡与lvs相连

  • web服务器网关为192.168.0.100

  1. 实验环境
    主机名IPVIP角色
    clientnat:172.25.254.111null测试机
    lvsnat:172.25.254.100仅主机:192.168.0.100调度器(vs)
    RS1仅主机:192.168.0.20null真实服务器(RS)
    RS2仅主机:192.168.0.20null真实服务器(RS)
  2. 配置命令
    1. 在RS1,RS2中安装并启用httpd服务

      RS1:
      [root@RS1 ~]#dnf install httpd -y
      [root@RS1 ~]#firewall-cmd --permanent --add-service=http
      [root@RS1 ~]#firewall-cmd --permanent --add-service=https
      [root@RS1 ~]#echo RS1 - 192.168.0.10 > /var/www/html/index.html
      [root@RS1 ~]#systemctl enable --now httpd
      [root@RS1 ~]#vim /etc/NetworkManager/system-connections/eth0.nmconnection
      address1=192.168.0.10/24,192.168.0.100
      [root@RS1 ~]#nmcli connection reload
      [root@RS1 ~]#nmcli connection up eth0RS2:
      [root@RS2 ~]dnf install httpd -y
      [root@RS2 ~]#systemctl disable --now firewalld
      [root@RS2 ~]#echo RS2 - 192.168.0.20 > /var/www/html/index.html
      [root@RS2 ~]#systemctl enable --now httpd
      [root@RS2 ~]#vim /etc/NetworkManager/system-connections/eth0.nmconnection
      address1=192.168.0.20/24,192.168.0.100
      [root@RS2 ~]#nmcli connection reload
      [root@RS2 ~]#nmcli connection up eth0
    2. 在lvs中测试

    3. 在lvs中启用内核路由功能

      [root@LVS ~]# echo net.ipv4.ip_forward = 1> /etc/sysctl.d/ip_forward.conf

    4. 在lvs中安装ipvsadm

      [root@lvs ~]# yum install ipvsadm -y #安装
      [root@lvs ~]# systemctl enable --now ipvsadm  #启用ipvsadm服务
      Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.
    5. 在lvs中添加调度策略

      [root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr   #添加虚拟服务172.25.254.100:80 使用轮询
      [root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m #添加RS1
      [root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m #添加RS2
      [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-> 192.168.0.20:80              Masq    1      0          0
    6. 测试

      [root@client ~]# for i in {1..10}; do curl 172.25.254.100;done
      RS2 - 192.168.0.20
      RS1 - 192.168.0.10
      RS2 - 192.168.0.20
      RS1 - 192.168.0.10
      RS2 - 192.168.0.20
      RS1 - 192.168.0.10
      RS2 - 192.168.0.20
      RS1 - 192.168.0.10
      RS2 - 192.168.0.20
      RS1 - 192.168.0.10
      [root@client ~]#
4.2部署DR模式集群
  1. 实验环境
    主机名ipvip角色
    clientnat:172.25.254.111null测试机
    routernat:172.25.254.100,仅主机:192.168.0.100null路由器
    DR-LVS仅主机192.168.0.200,GW:192.168.0.100192.168.0.210调度器
    RS1仅主机192.168.0.10,GW:192.168.0.100lo:192.168.0.210真实服务器(RS)
    RS2仅主机192.168.0.20,GW:192.168.0.100lo:192.168.0.210真实服务器(RS)

    配置实验环境

    1. client:

    2. router

    3. DR-LVS

    4. RS1

    5. RS2

    6. 测试:确保每台主机都可以互相通信

  2. 解决vip响应问题

    #在RS1和RS2中解决响应问题:
    RS1:
    [root@RS1 ~]# echo net.ipv4.conf.all.arp_ignore = 1 >> /etc/sysctl.conf
    [root@RS1 ~]# echo net.ipv4.conf.all.arp_announce = 2 >> /etc/sysctl.conf
    [root@RS1 ~]# echo net.ipv4.conf.lo.arp_ignore = 1 >> /etc/sysctl.conf
    [root@RS1 ~]# echo net.ipv4.conf.lo.arp_announce = 2 >> /etc/sysctl.conf
    [root@RS1 ~]# sysctl -p
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.all.arp_announce = 2
    net.ipv4.conf.lo.arp_ignore = 1
    net.ipv4.conf.lo.arp_announce = 2RS2:
    [root@RS2 ~]# echo net.ipv4.conf.all.arp_ignore = 1 >> /etc/sysctl.conf
    [root@RS2 ~]# echo net.ipv4.conf.all.arp_announce = 2 >> /etc/sysctl.conf
    [root@RS2 ~]# echo net.ipv4.conf.lo.arp_ignore = 1 >> /etc/sysctl.conf
    [root@RS2 ~]# echo net.ipv4.conf.lo.arp_announce = 2 >> /etc/sysctl.conf
    [root@RS2 ~]# sysctl -p
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.all.arp_announce = 2
    net.ipv4.conf.lo.arp_ignore = 1
    net.ipv4.conf.lo.arp_announce = 2
  3. 配置详情

    1. 配置内容如下:

      #在lvs中配置策略
      [root@DR-LVS ~]# ipvsadm -A -t 192.168.0.210:80 -s rr
      [root@DR-LVS ~]# ipvsadm -a -t 192.168.0.210:80 -r 192.168.0.10:80 -g
      [root@DR-LVS ~]# ipvsadm -a -t 192.168.0.210:80 -r 192.168.0.20:80 -g
      [root@DR-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.210:80 rr-> 192.168.0.10:80              Route   1      0          0-> 192.168.0.20:80              Route   1      0          0
      
    2. 测试:

4.3防火墙标签解决轮询错误
  1. 轮询规则中可能会遇到的错误
    在RS中同时开放80和443端口时,默认控制是分开轮询的,这样就出现了一个轮询错乱的问题
    #在RS1,RS2中开启443端口#RS1
    [root@rs1 ~]# dnf install mod_ssl -y
    [root@rs1 ~]# systemctl restart httpd#RS2
    [root@rs2 ~]# dnf install mod_ssl -y
    [root@rs2 ~]# systemctl restart httpd#在lvs中设置两组调度
    [root@DR-LVS ~]# ipvsadm -A -t 192.168.0.210:443 -s rr
    [root@DR-LVS ~]# ipvsadm -a -t 192.168.0.210:443 -r 192.168.0.10:443 -g
    [root@DR-LVS ~]# ipvsadm -a -t 192.168.0.210:443 -r 192.168.0.20:443 -g
    [root@DR-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.210:80 rr-> 192.168.0.10:80              Route   1      0          1-> 192.168.0.20:80              Route   1      0          1
    TCP  192.168.0.210:443 rr-> 192.168.0.10:443             Route   1      0          0-> 192.168.0.20:443             Route   1      0          0#测试问题
    [root@router ~]# curl -k  http://192.168.0.210;curl -k https://192.168.0.210
    RS2 - 192.168.0.20
    RS2 - 192.168.0.20

  2. 防火墙标记解决轮询调度问题
    示例:
    #在lvs调度器中设定端口标签,使80和443为一个整体
    [root@DR-LVS ~]# iptables -t mangle -A PREROUTING -d 192.168.0.210 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666
    [root@DR-LVS ~]# ipvsadm -A -f 6666 -s rr
    [root@DR-LVS ~]# ipvsadm -a -f 6666 -r 192.168.0.10 -g
    [root@DR-LVS ~]# ipvsadm -a -f 6666 -r 192.168.0.20 -g
    [root@DR-LVS ~]# ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    FWM  6666 rr-> 192.168.0.10:0               Route   1      0          0-> 192.168.0.20:0               Route   1      0          0
    

测试:

[root@router ~]# curl -k  http://192.168.0.210;curl -k https://192.168.0.210
RS2 - 192.168.0.20
RS1 - 192.168.0.10
[root@router ~]# curl -k  http://192.168.0.210;curl -k https://192.168.0.210
RS2 - 192.168.0.20
RS1 - 192.168.0.10
[root@router ~]# curl -k  http://192.168.0.210;curl -k https://192.168.0.210
RS2 - 192.168.0.20
RS1 - 192.168.0.10
[root@router ~]# curl -k  http://192.168.0.210;curl -k https://192.168.0.210
RS2 - 192.168.0.20
RS1 - 192.168.0.10

http://www.dtcms.com/a/286351.html

相关文章:

  • 【Git专栏】git如何切换到某个commit(超详细)
  • Java基础篇
  • Triton Inference Server 使用详解与常见问题汇总
  • 数据库模型异常问题深度解析:冗余与操作异常
  • 《在亚马逊平台运营:从专利困境到功能利用全指南》
  • 【数据结构】堆(下)+ 二叉树
  • 深度学习笔记002-引言--日常生活总的机器学习、训练模型的过程、关键组件、各种机器学习问题
  • 如何在服务器上获取Linux目录大小
  • 使用python读取json数据,简单的处理成元组数组
  • 验证大语言模型不会算数但可以编写算数的程序
  • 【数据结构初阶】--双向链表(一)
  • 机器学习17-Mamba
  • C语言—如何生成随机数+原理详细分析
  • Linux服务器端口被占用?
  • 无刷电机控制 - 基于STM32F405+CubeMX+HAL库+SimpleFOC04,完成霍尔传感器的驱动代码
  • @Scheduled的作用分析
  • 赛道观察:AI智能自习室哪家强?深挖深度逻辑与价值锚点
  • 链表算法之【链表的中间节点】
  • 【CMake】CMake 项目打包与 find_package 使用流程:从 A 到 B 的完整范例
  • 基于MATLAB的朴素贝叶斯NB的数据分类预测方法应用
  • 一种新颖的可解释人工智能框架,用于整合统计、视觉和基于规则的方法进行医学图像分类|文献速递-医学影像算法文献分享
  • Flutter ScaffoldMessenger 详细介绍
  • P1205 [USACO1.2] 方块转换 Transformations
  • 《通信原理》学习笔记——第四章
  • 【论文阅读】BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework
  • Redis——BigKey
  • Radix-4 Booth乘法器计算步骤
  • 【AI论文】CLiFT:面向计算高效与自适应神经渲染的压缩光场标记
  • vue2 面试题及详细答案150道(41 - 60)
  • Node.js链接MySql