zoukankan      html  css  js  c++  java
  • LVS

    一、LVS概念
    LVS( Linux Virtual Server)是一种负载均衡(LB,Laod Balance)技术,采用IP负载均衡技术和基于内容请求分发技术。具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行。LVS是一套组件(ipvs与ipvsadm),类似与iptables,ipvs相当于netfilter,是能将用户请求转发的框架,需要依赖以规则完成转发,工作于内核中的INPUT链上,并依赖于规则进行转发,而ipvsadm是用来定义规则的工具。LVS工作在TCP/UDP协议的四层,能根据用户请求的IP与PROT进行转发,即LVS能实现四层交换、四层路由。

    ipvsadm:用户空间的命令行工具,规则管理器,用于管理集群服务及RealServer
    ipvs:工作于内核空间的netfilter的INPUT钩子之上的框架

    LVS集群类型中的术语

    Director:负载均衡器,也称VS(Virtual Server)
    RS:真实服务器(RealServer)
    CIP:客户端IP(Client IP)
    VIP: Client所请求的,提供虚拟服务的IP,可以用Keepalive做高可用
    DIP:在Director实现与RS通信的IP
    RIP:RealServer IP

    二、LVS集群的类型

    LVS转发模式有四种:
    lvs-nat: 修改请求报文的目标IP
    lvs-dr: 操纵封闭新的MAC地址
    lvs-tun: 在原请求IP报文之外新加一个IP首部
    lvs-fullnat: 修改请求报文的源和目标IP

    2.1 LVS-NAT(Network Address Translation)
    多目标IP的DNAT,通过将请求报文中的目标地址和目标端口改为某挑出的RS的RIP和PORT实现转发(NAT模式修改的是dst IP,直接走switch或pub不需要修改MAC,所以不需要VIP和realserver同在一个网段内)

    模型:

    image

    image

    如上图,NAT模式对请求报文做了DNAT,即将报文的目的地址改为RS的地址,但源地址不变;RS上配置路由策略(如网关),应答报文到了LVS设备上后做SNAT,即将报文的源地址改为LVS设备上的地址,目的地址不变。

    lvs-nat的特性

    1.RS应该使用私有地址
    2.RS的网关必须指向DIP
    3.RIP和DIP必须在同一网段内
    4.请求和响应的报文都得经过Director,在高负载场景中,Director很可能成为性能瓶颈(因为既要处理请求报文也要处理响应服方的转发,请求报文一般很小,但响应报文一般都比较大)
    .支持端口映射,即可修改请求报文的目标端口
    6.Director必须是Linux系统(必须支持nat),RS可以是任意支持集群服务的操作系统

    2.2 LVS/DR(Direct Routing直接路由) 
    通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变,请求报文经过Dirctor但响应报文不再经过Dirctor

    模型:

    image

    image

    DR类型工作流程
    如上图所示:当客户端请求VIP时,通过互联网到达前端路由Route1,再通过交换机到达Dirctor上;而Dirctor在收到请求报文后,通过定义在ipvs规则中的各rip去获得各RS的MAC地址,并在此报文外再封装一个MAC地址,源MAC为Dirctor的DIP端口的MAC而目标MAC改为其中被调度算法选中一个RS的MAC,但该报文的目标ip(VIP)不变,最后通过DIP接口发送给RS;为了RS能接收Dirctor发来的报文,需要在各RS上也配置VIP,但RS上的VIP是需要隔离前端arp广播的,所以需要将各RS上的VIP隐藏(RS上的VIP通常配置到lo网卡接口的别名上,并配合修改Linux内核参数来实现隔离arp广播);而RS封装响应报文时,源IP为VIP,目标ip为CIP,并通过RIP的网络接口直接向外发送响应,不再经过Dirctor。


    需要注意的是:因为Route1的A点的IP和Dirctor的VIP在同一网段内,VIP通常是公网IP;而DIP、RIP通常是私有IP,且这两个IP通常也应在同一物理网络内;假设RIP与Route1的A接口(同Director 的VIP DIP)在同一网段,则这时可将RS的网关指向Route1,否则,Route2只能其它路由器(如Route2)接口访问互联网,且Route2的C点的IP需要与RIP在同一网段内,此时RIP响应的报文就通过Route2发送。

    上文黑色斜体部分的实现及确保前端路由器将目标IP为VIP的请求报文发往Director后的各RS,方法c是最佳的选择:
    (a) 在前端网关即Dirctor做静态绑定:不利于高可用
    (b) 在RS上使用arptables:需要额外配置,复杂且学习成本高昂
    (c) 在RS上修改内核参数以限制arp通告及应答级别:

    arp_announce 定义arp通告级别 默认0,应设为2 --> echo 2 > /proc/sys/net/ipv4/conf/enoXXX/arp_announce
    arp_ignore 定义arp应答级别 默认0,应设为1 --> echo 1 > /proc/sys/net/ipv4/conf/enoXXX/arp_ignore

    复制代码
    Linux kernel从2.4.26与2.6.4以后引入了两个设备标识,即上面提到的arp_announce arp_ignore来调整arp模式
    arp_announce: 向外通告 0:默认的,通告时告之本机所使用的所有地址、配置、接口 1: 尽量只通告接入的网络一端的接口地址(不绝对保证) 2: 必需避免向非本机网络通告 # DR模式需要 内核地址/proc/sys/net/ipv4/conf/all/arp_announce
    arp_ignore: 应答请求 0: 默认的,响应本机接口上配置的所有的目标IP地址 1: 只响应入栈报文的那个接口 # DR模式需要 地址同上
    复制代码

    详细arp_ignore与arp_announce说明查看 http://www.cnblogs.com/zyd112/p/8797188.html

    LVS DR模型的特性

    复制代码

    1.LVS的VIP和realserver必须在同一个网段,不然广播后所有的包都会丢掉(提前确认LVS/硬件LB 是什么模式,是否需要在同一个网段中)
    2.所有的realserver 都必须绑定VIP的IP地址,否则realserver 收到package后发现dst不是自己的ip,所有包都会丢掉
    3.RS的网关一定不能指向DIP
    4.请求报文必须经过Director,但响应报文不能经过Director而是由RS直接发往Client以释放Directory的压力
    5.不支持端口映射(因为响应报文不经过Director)
    6.Director的VIP对外可见,RS的VIP对外不可见
    7.RS可以使用大多数的操作系统

    复制代码

    2.3 LVS/TUN

    模型:在原请求IP报文之外新加一个IP首部(这个新添加的IP首部其源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS.

    image

    TUN类型工作流程(主要是为了容灾,因为Director与各RS是在不同网段中,所以可以存在于不同的物理空间)

    LVS TUN类型特性

    1.RIP,DIP,VIP都得是公网地址
    2.RS的网关不会指向也不可能指向DIP
    3.请求报文经过Directory,但响应报文一定不经过Director
    .不支持端口映射
    5.RS的OS必须得支持隧道功能 ??

    2.4 LVS/FULLNAT (LVS默认不支持此类型)

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

    原理介绍1

    FULLNAT模式是在NAT模式的基础上做一次源地址转换(即SNAT),做SNAT的好处是可以让应答流量经过正常的三层路由回到负载均衡上,这样负载均衡就不需要以网关的形式存在于网络中了,对网络环境要求比较低,缺点是由于做了SNAT,应用服务器会丢失客户端的真实IP地址。

    image

    首先负载均衡上需要存在一个localip池,在做SNAT时的源IP就是从localip池中选择的。当客户端流量到达负载均衡设备以后,负载均衡会根据调度策略在应用服务器池中选择一个应用服务器,然后将数据包的目的IP改为应用服务器的IP。同时从localip池中选择一个localip将数据包的源IP改为localip,这样应用服务器在应答时,目的IP是localip,而localip是真实存在于负载均衡上的IP地址,因此可以经过正常的三层路由到达负载均衡。由于FULLNAT比NAT模式多做了一次SNAT,并且SNAT中有选端口的操作,因此其性能要逊色于NAT模式,但是对网络环境具备较强的适应性。

    原理介绍2

    image

    如上图。FULLNAT模式对入报文做了DNAT+SNAT,即将报文的目的地址改为RS的地址,源地址改为LVS设备地址;RS上不需要配置路由策略,出报文到了LVS设备上后做SNAT+DNAT,即将报文的源地址改为LVS设备上的地址,目的地址改为真实的用户地址。

    LVS FULLNAT类型特性

    1.VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络,因此,RIP的网关一般不会指向DIP
    2.RS收到的请求报文源地址是DIP,因此只需响应给DIP, Dirctor收到RS的回复报文后将其发往Client
    3.请求和响应报文都经由Dirctor
    4.支持端口映射

    美团点评高性能四层负载均衡-MGW选择了FULLNAT作为MGW的转发模式,MGW介绍地址:https://tech.meituan.com/MGW.html

    如果要让你的服务器支持fullnat,可以查看以下连接方法:https://ieevee.com/tech/2015/12/09/fullnat-2.html

    三、LVS调度方法(Scheduler)

    LVS的调度方法分为两类(静态算法、动态算法),共10种。
    在转发方式选定的情况下,采用哪种调度算法将决定整个负载均衡的性能表现。不同的算法适用于不同的生产环境,有时可能需要针对特殊需求自行设计调度算法。

    静态方法:仅根据算法本身进行调度(注重起点公平)

    复制代码
    ① rr:Round Robin 轮询或轮叫,算法将外部请求按顺序轮流分配到集群中的RS(真实)服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。不支持权重。
    ② wrr:Weighted RR 权重轮询或加权轮叫,此算法根据RS(真实)服务器的不同处理能力来调度访问请求。这样可保证处理能力强的服务器能处理更多的访问请求。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
    ③ sh:source hashing 源地址hash,对请求的客户端IP进行hash计算,可实现session绑定,但可能会破坏负载均衡。Director在本地维护一张hash表,此表保存有每一个源IP地址及其第一次调度哪一个Server,每一条记录都有默认时长。
    ④ dh:destination hashing 目标地址hash,请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。Director在本地维护一张散列表,此表保存有每一次请求的目标IP及其对应调度的目标服务器(RS) 。将发往同一个目标地址的请求始终转发至第一次挑中的RS服务器。使用场景多数为缓存服务器代理。
    复制代码

    动态方法:根据算法及RS当前的负载状态(注重结果公平)

    复制代码
    ⑤ lc:Least Connection 最少连接,此算法动态地将网络请求调度到已建立的连接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接“算法可以较好地均衡负载。Overhead=Active*256+Inactive来实现,采用计算值最小的RS,不支持权重。
    **⑥ wlc: ** Weighted LC 权重最少连接,在集群系统中服务器性能差异较大的情况下,调度器采用”加权最少连接“优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。是LVS默认的调度算法。权重公式:Overhead=(Active*256+Inactive)/weight
    ⑦ sed:Shortest Expect Delay 最短期望延迟,wlc的改进算法,简单地说就是调度器会选择响应速度快的RS(真实)服务器,先选择权重(weight)较大的服务器计算方法:Overhead=(Active+1)*256/weight 这种方式可能会连接多个请求都发送给一台性能较强(即weight值较大)的RS,而别的RS却连一个请求都不会接收到。
    ⑧ nq:Nerver Queus: sed算法的改进,永不排队,每个RS至少先处理一个请求,然后再按sed算法来。
    ⑨ lblc:Locality-based least connection 基于局部性的最少连接,可以理解为动态的dh算法。目前主要用于cache集群系统,该算法根据请求的目标ip地址找出该目标ip地址最近使用的服务器,若该服务器是可用的且没有超载,则将请求发送的该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少连接”的原则选出一个可用的服务器,将请求发送到该服务器。
    ⑩ lblcr:Replicated and Locality-based least connection带复制的基于 的最少连接。各缓存RS各自匀一匀缓存项,及达到负载均衡)。上面说了dh不利于负载均衡,这个算法算是弥补了这个缺陷。
    复制代码

    四、ipvsadm命令(yum -y install ipvsadm)
    grep -i -C 10 "ipvs" grep -i -C 10 "ipvs" /boot/config-2.6.32-504.el6.x86_64 查看ipvs支持的协议与调度方法
    支持的协议有:TCP UDP AH ESP AH_ESP SCTP

    ① 对集群的操作

    首先要确定好需要使用哪种拓扑类型(NAT DR TUN)的集群

    复制代码
    ipvsadm -A|E|D -t|u|f  director_addr:port [-s scheduler] [-p [timeout]]   #director_addr指的就是VIP
         -A:添加一个集群服务      # Add
         -E:修改一个集群服务      # Edit
         -D:删除集群服务         # Delete   示例: ipvsadm -D -t 10.1.0.5:80
    
        -t:tcp协议服务
         -u:udp协议服务
         -f:firewall make通常应用于将两个或以上的服务绑定为一个服务进行处理时使用,它是一个数字。
             示例:ipvsadm -A -f 11 -s wrr     
             # 这个11为通过iptables xxxx -j MARK --set-mark 11 得到.又例如将80与443打包成一块用ipvsadm进行统一调度.
      
         service-address   # 即LVS服务器的IP地址加之前选项指明的协议类型端口
             -t IP:port    # tcp协议
             -u ip:port    # udp协议
             -f firewall_mark  # 后接一个标记数字,将多个端口组织成一个集群进行统一调度
                 firewall_mark示例:`iptables -t mangle -A PREROUTING -d 10.1.0.5 -p tcp -m multiport --dports 80,3306 -j MARK --set-mark 11`
                 `ipvsadm -A -f 11 -s wrr` 
         -s 调度算法,这项没有声明时默认为wlc [rr wrr sh dh lc wlc sed nq lblc lblcr]
         -p: persistence     # LVS的持久连接功能,没有接数字则默认为300秒
    复制代码

    ② 对RS的操作(LVS的类型是在对RS的操作时定义的)

    复制代码
    ipvsadm -a -t|u|f director_addr:port -r RS_addr -[g|i|m] [-w weight]  # LVS的类型在这里定义
         -a:添加RS
         -e:修改
         -d:删除
         -r: 后接 RS的ip[:port]
         -g:gateway,    DR,没有声明时默认为DR模型
         -m:masquerade, NAT模型
         -i:ipip,       TUN模型
         -w: 定义权重,仅使用在支持权重的算法上。如rr lc等不支持权重的算法加上-w选项则没有意义。
    复制代码

    ③ 查看、清空、保存、导入规则

    复制代码
    -L|l:显示规则
         -n, --numeric: 不反解析IP地址和端口,数值格式显示主机地址和端口号
         --exact: 显示精确值
         --stats: 统计数据
         --rate: 速率
         --timeout: 显示tcp、tcpfin和udp的会话超时时长
         --sort: 显示当前的ipvs连接状况
         -c, --connection: 查看连接数
    清空规则
         ipvsadm -C     # Clear
    保存规则(一般都保存在/etc/sysconfig/ipvsadm)
         * ipvsadm -S 默认标准输出,可重定向至指定文件 
         * ipvsadm-save 默认标准输出,可重定向到指定文件
         * systemctl stop ipvsadm.service   # 停止时会自动保存
    导入规则(2种)
         1.ipvsadm -R < /saved_file
         2.ipvsadm-restore < /saved_file
    复制代码

         

    五、LVS实际配置

    5.1 配置一个NAT类型(2台RS)的集群
    LVS: if1=172.16.53.128/24(VIP) if2=10.1.1.77/16(DIP)
    RS1: 10.1.1.78/16(RIP1)
    RS2: 10.1.1.79/16(RIP2)

    RS配置:
    将RS1 RS2的默认网关指向Director的DIP
    route add default gw 10.1.1.77/16

    LVS配置:
    ipvsadm -A -t 10.1.1.77:80 -s rr                    # 添加LVS集群与调度算法
    ipvsadm -a -t 10.1.1.77:80 -r 10.1.1.78 -m -w 1   # 添加LVS集群主机与LVS调度模式及RS权重
    ipvsadm -a -t 10.1.1.77:80 -r 10.1.1.79 -m -w 1   # 同上

    echo 1 > /proc/sys/net/ipv4/ip_forward # 打开Director的转发功能

    iptables -t nat -A POSTROUTINT -o if1 -j SNAT --to-source 172.16.53.128 #对Director if1网卡发出的源地址进行nat装换

    至此,一个简单的根据LVS rr算法调度的负载均衡集群完成了

    5.2 配置一个DR类型(2台RS)的集群
    Directory: VIP: 192.168.31.100/24 调度主机只需要一个网卡接口 VIP用DIP的别名生成
    RS1: 192.168.31.194/24
    RS2: 192.168.31.220/24

    编写以下脚本文件并分别在各RS上执行.(setparam.sh)

    复制代码
    #!/bin/bash
    #
    vip=192.168.31.100
    mask='255.255.255.255'
    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
         /sbin/ifconfig lo:0 $vip netmask $mask  broadcast $vip up
         route add -host $vip dev lo:0
         ;;
    stop)
         /sbin/ifconfig lo:0  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
         route del -host $vip dev lo:0
         ;;
    status)
         # Status of LVS-DR real server.
         islothere=`/sbin/ifconfig lo:0 | grep $vip`
         isrothere=`netstat -rn | grep "lo:0" | grep $vip`
         if [ ! "$islothere" -o ! "isrothere" ]; then
             # Either the route or the lo:0 device
             # not found.
             echo "LVS-DR real server Stopped."
         else
             echo "LVS-DR real server Running."
         fi
    ;;
    *)
         echo "Usage $(basename $0) start|stop"
         exit 1
         ;;
    esac
    复制代码

    编写以下脚本在Director(调度器)上添加VIP 添加LVS规则等操作 (ipvs.sh)

    复制代码
    #!/bin/bash
    #
    vip=192.168.31.100
    iface='eno16777736:0'
    mask='255.255.255.255'
    port='80'
    rs1='192.168.31.194'
    rs2='192.168.31.220'
    scheduler='wrr'
    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 -g -w 1
         ipvsadm -a -t ${vip}:${port} -r $rs2 -g -w 2
         ;;
    stop)
         ifvsadm -C
         ifconfig $iface down
         ;;
    *)
         echo ''Usage: $(basename $0) {start|stop|status}"
         exit 1
         ;;
    esac
    复制代码

    至此,一个简单的根据LVS dr算法调度的负载均衡集群完成了.


    5.3 FWM(FireWall Mark)借助于防火墙标记来分类报文,而后基于标记定义集群服务,可将多个不同的应用使用同一个集群服务进行调度。
    配置示例:

    iptables -t mangle -A PREROUTING -d 10.1.0.5 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 11
    ipvsadm -A -f 11 -s rr
    ipvsadm -a -t 192.168.31.100 -r 192.168.31.194 -g -w 1
    ipvsadm -a -t 192.168.31.100 -r 192.168.31.220 -g -w 1

    基本翻译
    abbr. 超文本传输协议安全(Hyper Text Transfer Protocol)
    网络释义
    HTTPS: HTTP Secure
    android https: 通信安全
    有什么问题尽管说,反正我也不会帮你的~
  • 相关阅读:
    django中间件和常用模块
    django之forms组件
    django和ajax、分页器、批量插入数据
    django之模型层ORM操作
    (专题三)02-1 程序和程序设计流程-选择结构
    (专题三)01 程序和程序设计流程-顺序结构
    (专题二)05 矩阵的存储方式
    (专题二)04 矩阵的处理-矩阵的特征值
    [代码片段]YEAH!连通域标记和计数
    TTL和CMOS
  • 原文地址:https://www.cnblogs.com/xiexun/p/10655197.html
Copyright © 2011-2022 走看看