当前位置:   article > 正文

linux高性能集群之--LVS_linux lvs

linux lvs

1 LVS,linux virtual server, 负载调度器

LVS,全称 Linux Virtual Server,即Linux虚拟服务器。是一个虚拟的服务器集群系统,使用负载均衡技术将多台服务器组成一个虚拟的服务器集群。

LVS是基于IP和基于请求内容分发的负载平衡调度方法,将一组服务器构成一个可以实现高可伸缩、高可用的虚拟服务器。一组服务器通过高速的局域网或者地理分布的广域网相互连接,在它们的前端有一个负载调度器(Load Balancer,简称LB)。

系统扩展方式
Scale UP:向上扩展(垂直扩展),增强、提高cpu性能
Scale Out:向外扩展(水平扩展),增加设备,调度分配问题,Cluster

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

Linux Cluster类型

  • LB:Load Balancing,负载均衡
  • HA:High Availiablity,高可用,SPOF(single Point Of failure)

MTBF:Mean Time Between Failure 平均无故障时间
MTTR:Mean Time To Restoration( repair)平均恢复前时间(平均故障时间)
HA集群,5个9:MTBF/(MTBF+MTTR)>= 99.999%

  • HPC:High-performance computing,高性能 www.top500.org

分布式系统
分布式存储:云盘
分布式计算:hadoop,Spark


1.1 LB Cluster的实现

lvs:Linux Virtual Server,内核级,效率高。
nginx:支持四层调度,性能不及lvs
haproxy:支持四层调度

1.2 LVS集群类型中的术语

  • VS:Virtual Server,Director Server(DS), Dispatcher(调度器),Load Balancer,负载调度器,用户请求首先到达VS,VS根据请求调度后端实际处理请求的web服务器。
  • RS:Real Server(lvs), upstream server(nginx),backend server(haproxy)。实际响应请求的后端web服务器
  • CIP:Client IP,客户端IP
  • VIP: Virtual serve IP ,VS外网的IP
  • DIP: Director IP ,VS内网的IP,与后端web服务器连接的网卡IP
  • RIP: Real server IP,后端服务器的IP

工作原理:VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS(类似NAT网关,收到请求报文后,将IP、mac地址、端口号进行替换后,转发给后端web服务器),挑选RS服务器则由调度算法实现。

VS在链路中的工作位置:

  • 涉及到的概念:iptables四表五链
  • iptables/netfilter:iptables是一个应用软件,是linux防火墙在用户空间的管理工具;netfilter:是linux的防火墙框架,工作在内核空间

数据流入:PREROUTING --> INPUT
数据流出:OUTPUT --> POSTROUTING
数据转发:PREROUTING --> FORWARD --> POSTROUTING DNAT:目标地址转换; PREROUTING
如下图所示,请求数据,正常经过PREROUTING,INPUT到web服务器时;lvs工作在PREROUTING和INPUT之间,由lvs来判断和调度请求最终转发到后端具体的web服务器。

在这里插入图片描述
LVS工作位置

1.3 LVS集群的四种模式

1、lvs-nat:nat模式修改请求报文的目标IP,本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发.

  1. RIP和DIP建议在同一个IP网络,且使用私网地址;RS的网关要指向DIP,保证响应报文原路返回
  2. 请求报文和响应报文都必须经由Director转发。所以nat模式的缺点是,Director易于成为系统瓶颈
  3. 支持端口映射,可修改请求报文的目标PORT,一个RS一个PORT。
  4. VS必须是Linux系统,RS可以是任意OS系统

在这里插入图片描述
vs_nat模式
在这里插入图片描述
vs_nat模式IP包调度过程

2、lvs-dr:Direct Routing,直接路由,LVS默认模式,应用最广泛。通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
6. lvs-dr模式要求Director和各RS都配置有VIP,确保前端路由器将目标IP为VIP的请求报文发往Director。这个时候VS和RS都配有VIP会有IP冲突问题,常用的策略是在RS上修改arb内核参数。

在RS上修改内核参数以限制arp通告及应答级别。
arp_announce:限制通告级别,0、1两种模式,对应两种不同级别。0:默认值,表示可使用本地任意接口上配置的任意地址进行响应;1: 仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应;
arp_ignore:限制响应级别,0、1、2三种级别。0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告。2:必须避免将接口信息向非本网络进行通告。
IP是工作在内核空间的,所以一张网卡上,如果多个端口配置不同IP,如果一个请求报文的目的地址IP与网卡端口直接,通过配置内核参数,判断到有一个端口配置了这个目的IP,也可以转发这个报文。

  1. RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director
  2. RS和Director要在同一个物理网络

只是数据链路层替换,因此必须在同一个物理网络。不涉及IP层

  1. 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
  2. 不支持端口映射(端口不能修败)
  3. RS可使用大多数OS系统

在这里插入图片描述
vs_dr模式
在这里插入图片描述
vs_dr模式IP包调度过程

3、lvs-tun:在原请求IP报文之外新加一个IP首部。不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)
12. DIP, VIP, RIP都应该是公网地址

应用与跨区域的大型web服务器。DIP和RIP之间可以是广域网通信,因此为了稳定需要搭专线。

  1. RS的网关不能,也不可能指向DIP
  2. 请求报文要经由Director,但响应不能经由Director
  3. 不支持端口映射
  4. RS的OS须支持隧道功能

在这里插入图片描述
vs_tun模式
在这里插入图片描述

vs_tun模式IP包调用过程

4、lvs-fullnat:修改请求报文的源和目标IP(这种模式kernel默认不支持,阿里内部使用)

小结

在这里插入图片描述
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头实现转发,支持远距离通信

1.4 ipvs scheduler,LVS调度算法

LVS调度算法分为静态算法和动态算法两类。所谓静态算法,就是仅考虑算法本身,不考虑rs的性能、负载。动态方法,主要根据每个RS当前的负载状态及调度算法进行调度Overhead=value 较小的RS将被调度

1、静态方法:

  • RR:roundrobin,轮询
  • WRR:Weighted RR,加权轮询
  • SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
  • DH:Destination Hashing;目标地址哈希,将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商

2、动态方法:

  • WLC:Weighted LC,默认调度方法。Overhead=(activeconns*256+inactiveconns)/weight

1.5 ipvsadm命令

ipvs和LVS是一个东西,linux内核看到的安装包是ipvs。LVS集成在linux内核。VS调度器要使用ipvs能力,只需安装LVS管理工具:ipvsadm即可,yum install ipvsadm

RS配置示例

#!/bin/bash
vip=192.168.0.100
mask='255.255.255.255'
dev=lo:1
case $1 in
start)
    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
    ifconfig $dev $vip netmask $mask broadcast $vip up
    route add -host $vip dev $dev
    ;;
stop)
    ifconfig $dev down
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    ;;
*)
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;
esac
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

VS配置示例

#!/bin/bash
vip='192.168.0.100'
iface='eth0:1'
mask='255.255.255.255'
port='80'
rs1='192.168.0.101'
rs2='192.168.0.102'
scheduler='wrr'
type='-g'
case $1 in
start)
    ifconfig $iface $vip netmask $mask broadcast $vip up
    iptables -F
    ipvsadm -A -t ${vip}:${port} -s $scheduler
    ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
    ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
    ;;
stop)
    ipvsadm -C
    ifconfig $iface down
    ;;
*)
  echo "Usage $(basename $0) start|stop";exit 1
  ;;
esac
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

从示例脚本中可以看出,http服务-80端口和https-443端口,如果一个web服务器实现了两个,vs调度器要根据端口配置80和443分别调度。如何实现把http和https当成一类请求调度呢:借助于防火墙标记来分类报文。

MARK target 可用于给特定的报文打标记:--set-mark value,其中:value 为十六进制数字。
例如:

  • iptables -t mangle -A PREROUTING -d $vip -p $proto –m multiport --dports $port1,$port2 -j MARK --set-mark NUMBER

这里的NUMBER就是标签号。然后在Director主机基于标记定义集群服务:

  • ipvsadm -A -f NUMBER [options]

NUMBER同iptables规则里的NUMBER。

最后

LVS本身不支持RS的状态检查,即使后端服务器挂掉了,还是会调度到挂掉的服务器上;而且LVS工作在网络传输层,不支持应用层调度。LVS最大的优势是高性能,支持百万级的调度。基于LVS的缺点,日常业务中,Nginx、haproxy应用更为广泛。尤其是Nginx,在国内应该更多。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/820419
推荐阅读
相关标签
  

闽ICP备14008679号