浅谈Linux Virtual Server服务

❎ 集群的概念

1️⃣ 系统性能扩展方式:

  • Scale UP:垂直扩展,向上扩展,增强,性能更强的计算机运行同样的服务
  • Scale Out:水平扩展,向外扩展,增加设备,并行地运行多个服务调度分配问题,
  • 集群(Cluster)即是向外扩展思路的体现
  • 垂直扩展不再提及:
    随着计算机性能的增长,其价格会成倍增长
    单台计算机的性能是有上限的,不可能无限制地垂直扩展

2️⃣ 集群的概念和分类

  • Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统

▶1 Linux Cluster类型

  • LB(Load Balancing):负载均衡

  • HA(High Availiablity):高可用

    • SPOF(Single Point Of Failure):单点失败,必须尽可能消灭出现单点失败的环节
    • MTBF(MeanTime Between Failure):平均无故障时间
    • MTTR(MeanTime To Restoration/Repair):平均恢复前时间,即故障修复时间
    • A=MTBF/(MTBF+MTTR)
      取值范围(0,1):99%, 99.5%, 99.9%, 99.99%, 99.999%, 99.9999%,生产环境要求99.999%以上,即一年内故障时间不超过0.001%(约5分钟)
  • HPC(High-performance computing):高性能,超级计算机

▶2 Cluster按照实现分类

  • 硬件
    F5 Big-IP
    Citrix Netscaler
    A10 A10

  • 软件
    lvs:Linux Virtual Server
    nginx:支持四层调度
    haproxy:支持四层调度

▶3 Cluster基于工作协议层次分类

  • 传输层(通用):基于IP地址与端口DPORT
    LVS:
    nginx:stream
    haproxy:mode tcp

  • 应用层(专用):针对特定协议,自定义的请求模型分类
    也称作代理服务器(proxy server)
    http:nginx, httpd, haproxy(mode http), …
    fastcgi:nginx, httpd, …
    mysql:mysql-proxy, …

3️⃣ 负载均衡下实现会话保持

  • http协议是无状态的,cookie和session机制实现会话保持

  • 在负载均衡模式下,相同客户端的前后连接可能被分配给不同的服务器提供服务,需要有相关技术解决会话保持问题

  • 三种解决技术:

    • session sticky:同一用户调度固定服务器
      Source IP:LVS sh算法(对某一特定服务而言)
      Cookie
    • session replication:每台服务器拥有全部session
      session multicast cluster
    • session server:专门的session服务器
      Memcached, Redis

❎ Linux Virtual Server简介

1️⃣ LVS介绍

  • LVS(Linux Virtual Server):负载调度器,集成内核

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

  • LVS集群类型中的术语

VS:Virtual Server,又称Director, Dispatcher(调度器), Load Balancer
RS:Real Server(lvs), upstream server(nginx), backend server(haproxy)
CIP:Client IP
VIP:Virtual server IP,LVS外网的IP
DIP:Director IP,LVS内网的IP
RIP:Real server IP
  • 访问流程:CIP <–> VIP == DIP <–> RIP
    在这里插入图片描述
  • LVS集群类型
    • lvs-nat:修改请求报文的目标IP,即多目标IP的DNAT
    • lvs-dr:操纵封装新的MAC地址
    • lvs-tun:在原请求IP报文之外新加一个IP首部
    • lvs-fullnat:修改请求报文的源和目标IP

2️⃣ LVS-NAT模式

实现原理
本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为VS调度的RS的RIP和PORT实现转发

特点

  • RIP和DIP建议在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP
  • 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
  • 支持端口映射,可修改请求报文的目标PORT
  • VS必须是Linux系统,RS可以是任意OS系统
    在这里插入图片描述
    在这里插入图片描述

3️⃣ LVS-DR(Direct Routing)模式

▶1 LVS-DR实现原理

  • 通过为请求报文重新封装一个MAC首部进行转发
  • 源MAC是DIP所在的接口的MAC,目标MAC是VS调度的RS的RIP所在接口的MAC地址
  • 源IP/PORT,以及目标IP/PORT均保持不变

▶2 LVS-DR模式特点

  • 直接路由,LVS默认模式,应用最广泛
  • Director和各RS都配置有VIP
  • 源IP/PORT以及目标IP/PORT均保持不变
  • RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director
  • RS和Director要在同一个物理网络
  • 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
  • 不支持端口映射(端口不能修改)
  • RS可使用大多数OS系统

▶3 LVS-DR调度条件

  • 通过RS目标MAC实现调度的条件:防止IP地址冲突

  • 有以下三种方法

    • Director上静态绑定VIP和RS的MAC地址
    • 在RS上使用arptables工具
      arptables -A IN -d $VIP -j DROP
      arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
    • 在RS上修改内核参数以限制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/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    
  • 流程原理图
    在这里插入图片描述
    在这里插入图片描述

4️⃣ LVS-TUN模式

▶ 实现原理

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

▶ LVS-TUN模式特点

  • DIP, VIP, RIP都应该是公网地址
  • RS的网关不能,也不可能指向DIP
  • 请求报文要经由Director,但响应不能经由Director
  • 不支持端口映射
  • RS的OS须支持隧道功能
  • 流程原理
    在这里插入图片描述

5️⃣ LVS-FULLNAT模式

▶ 实现原理

  • 通过同时修改请求报文的源IP地址和目标IP地址进行转发
    CIP --> DIP
    VIP --> RIP

▶ LVS-FULLNAT模式特点

  • VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
  • RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
  • 请求和响应报文都经由Director
  • 支持端口映射;
  • 注意:此类型kernel默认不支持
  • 流程原理图
    在这里插入图片描述

6️⃣ LVS四种模式异同

在这里插入图片描述

  • lvs-nat与lvs-fullnat:请求和响应报文都经由Director
    lvs-nat:RIP的网关要指向DIP
    lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信

  • lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
    lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
    lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信

7️⃣ LVS 调度算法

  • 根据调度时是否考虑各RS当前的负载状态,分为静态方法和动态方法

🌐 静态算法(四种)

只根据算法进行调度 而不考虑后端服务器的实际连接情况和负载情况

▶ RR:轮叫调度(Round Robin)

调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

▶ WRR:加权轮叫(Weight RR)

调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

▶ DH:目标地址散列调度(Destination Hash )

根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

▶ SH:源地址 hash(Source Hash)

源地址散列”调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

🌐 动态算法(六种)

前端的调度器会根据后端真实服务器的实际连接情况来分配请求

▶ LC:最少链接(Least Connections)

调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。

▶ WLC:加权最少连接(默认采用的就是这种)(Weighted Least Connections)

在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

▶ SED:最短延迟调度(Shortest Expected Delay )

在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。

▶ NQ永不排队/最少队列调度(Never Queue Scheduling NQ)

无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空间。在SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲着,不考虑非活动连接,才用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力。

▶ LBLC:基于局部性的最少链接(locality-Based Least Connections)

基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。

▶ LBLCR:带复制的基于局部性最少连接(Locality-Based Least Connections with Replication)

带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

❎ LVS 相关软件

1️⃣ 程序包:ipvsadm

  • ipvsadm:集群服务管理和集群服务的RS管理工具
  • Unit File: ipvsadm.service
    在这里插入图片描述
  • 主程序:/usr/sbin/ipvsadm
  • 规则保存工具:/usr/sbin/ipvsadm-save
  • 规则重载工具:/usr/sbin/ipvsadm-restore
  • 配置文件:/etc/sysconfig/ipvsadm-config

2️⃣ ipvsadm管理集群服务

ipvsadm命令

  • 增、改
    ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

  • 删除
    ipvsadm -D -t|u|f service-address

  • -t|u|f service-address

    • service-address:VIP:PORT
      -t:TCP协议的端口,VIP:TCP_PORT
      -u:UDP协议的端口,VIP:UDP_PORT
      -f:firewall MARK,标记,一个数字
      [-s scheduler]:指定集群的调度算法,默认为wlc
  • ipvsadm工具示例用法

# 管理集群服务
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask]
[--pe persistence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address #删除
ipvsadm –C #清空
ipvsadm –R #重载
ipvsadm -S [-n] #保存

3️⃣ ipvsadm管理集群上的RS

ipvsadm命令

  • 增、改
    ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

  • 删除
    ipvsadm -d -t|u|f service-address -r server-address

  • -t| u | f VIP:PORT -r RIP:PORT,省略PORT则为不做端口映射

  • lvs类型:
    -g:gateway,dr类型,默认
    -i:ipip,tun类型
    -m:masquerade,nat类型

  • -w weight:权重

4️⃣ FWM(FireWall Mark)

  • FWM的功能:分类报文并基于标记定义集群服务;实现多个不同的应用使用同一个集群服务进行调度
    • 基于iptables的mangle表来实现
    • MARK target 可用于给特定的报文打标记
      --set-mark value
    • 其中:value 可为0xffff格式,表示十六进制数
  • 实现方法:
    • 在Director主机打标记
      iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports $port1,$port2,… -j MARK --set-mark NUMBER
    • 在Director主机基于标记定义集群服务
      ipvsadm -A -f NUMBER [options]
    • –set-mark NUMBER:NUMBER为16进制数
  • 示例
[root@lvs ~]#ipvsadm -A -f 10
[root@lvs ~]#ipvsadm -a -f 10 -r 192.168.39.17 -g
[root@lvs ~]#ipvsadm -a -f 10 -r 192.168.39.7 -g
[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 10 wlc
-> 192.168.39.7:0 Route 1 0 0
-> 192.168.39.17:0 Route 1 0 0

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

5️⃣ LVS 持久连接

  • session 绑定:对共享同一组RS的多个集群服务,需要统一进行绑定,lvs sh算法无法实现

  • 持久连接(lvs persistence)模板:实现无论使用任何调度算法,在一段时间内(默认360s),能够实现将来自同一个地址的请求始终发往同一个RS
    ipvsadm -A|E -t|u|f service-address [-s scheduler] -p [timeout]

  • 持久连接实现方式:

    • 每端口持久(PPC):每个端口对应定义为一个集群服务,每集群服务单独调度
    • 每防火墙标记持久(PFWMC):基于防火墙标记定义集群服务;可实现将多个端口上的应用统一调度,即所谓的port Affinity
    • 每客户端持久(PCC):基于0端口(表示所有服务)定义集群服务,即将客户端对所有应用的请求都调度至后端主机,必须定义为持久模式(基本不用,会开放主机全部端口)
  • 示例

[root@lvs ~]#ipvsadm -E -f 10 -p
[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 10 wlc persistent 360
-> 192.168.39.7:0 Route 1 0 15
-> 192.168.39.17:0 Route 1 0 7
[root@lvs ~]#ipvsadm -E -f 10 -p 3600
[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 10 wlc persistent 3600
-> 192.168.39.7:0 Route 1 0 79
-> 192.168.39.17:0 Route 1 0 7

6️⃣ 其他ipvsadm命令

清空定义的所有内容:ipvsadm -C
清空计数器:ipvsadm -Z [-t|u|f service-address]
查看:ipvsadm -L|l [options]
--numeric, -n:以数字形式输出地址和端口号
--exact:扩展信息,精确值
--connection,-c:当前IPVS连接输出
--stats:统计信息
--rate :输出速率信息
查看当前内存中ipvs规则:/proc/net/ip_vs
查看当前内存中ipvs连接:/proc/net/ip_vs_conn

7️⃣ 保存及重载规则

  • 保存:建议保存至/etc/sysconfig/ipvsadm
ipvsadm-save > /PATH/TO/IPVSADM_FILE
ipvsadm -S > /PATH/TO/IPVSADM_FILE
systemctl stop ipvsadm.service
  • 重载:
ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
ipvsadm -R < /PATH/FROM/IPVSADM_FILE      
/ 上述两条命令一个意思
systemctl restart ipvsadm.service

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值