LVS

作者: 麟之趾a | 来源:发表于2020-05-03 16:54 被阅读0次

    LVS简介

    lvs工作在linux内核,OSI的4层。由于是内核转发,不需要监听socket,所以没有最大打开文件数的限制。nginx/haproxy 工作在7层,其4层代理,也是由模块实现工作在4层。都是监听socket,再由本地进行反代,向服务端发起请求。此时会有最大打开文件数的限制,65536个文件
    由于LVS工作在4层,会有很多高级功能实现不了。比如ssl卸载

    lvs工作模式

    iptables的工作模式

    image.png

    lvs的工作模式

    image.png

    ipvsadm是ipvs的管理工具

    lvs的各种模式

    VS:调度器
    CIP:客户端IP
    DIP:调度器的内网IP
    VIP:调度器的外网IP
    RS:后端真实服务器

    ipvs NAT模式

    ipvs NAT是修改目标IP和PORT,对其进行转发


    image.png
    • RS和VS必须在同一IP网络内,RS必须指向VS的网关,可以转发后端多DIP
    • 请求和响应都经过VS,VS容易成为瓶颈
    • 支持端口映射
    • 后端的RS可以为任意主机

    lvs DR 模式

    重新封装包的MAC地址,进行转发


    image.png
    • RS和VS必须在同一物理网络,即RS和VS必须在同一组交换机下
    • RS不用指向VS的网关,以确保包能过从RS直接发出去
    • RS的VIP必须抑制通告和响应
      1 .通过内核参数arp_ignore和arp_announce
      2 .通过arptables
      3 .前端路由器,绑定VS的MAC地址,后端RS的VIP,只对自己广播
    • 不支持端口映射

    lvs tun模式

    在原报文中封装IP地址


    image.png
    • RIP,VIP,CIP均为公网地址
    • 后端的RS必须支持隧道协议
    • 不支持端口映射

    lvs full NAT模式

    改变请求报文的源IP地址和目标IP,源port和目标port


    image.png
    • 使其后端的RS不用指向VS的网关,其后端的RS可以为不同的网络
    • 请求和响应报文都经过VS,VS易成为瓶颈
    • 支持端口映射
    • 非标准模式,必须重新编译内核才行

    总结

    ipvs NAT 和 ipvs full NAT

    NAT:改变目标的IP和PORT,RS必须指向VS的网关
    full NAT:改变源IP和PORT,目标IP和PORT

    ipvs DR和TUN

    DR:重新对请求报文的MAC地址进行封装(VS和RS在同一物理网络,同一组交换机下)
    TUN:再原有的请求报文头部,再次封装一个IP包头(公网)

    ipvs 算法

    静态

    根据算法

    RR: 轮询算法
    WRR:加权轮询
    SH:根据源IP进行hash算法绑定,用于粘性session 绑定,相当于nginx的ip_hash。
    DH:根据目标IP进行hash绑定,进行hash算法绑定,用于正向代理的负载均衡

    image.png

    用户通过正向代理上网,正向代理将用户请求的网站内容,缓存到本地。下一次用户访问相同站点,直接从代理缓存中获取站点内容即可。如果有两台正向代理,可以配置LVS的DH算法,让其相同的目标站点,都访问同一台正向代理服务器,加大缓存命中率

    动态

    根据后端服务器的负载情况
    LC: 权重=(activeconnection256+inactiveconnection)
    WLC: 权重=(activeconnection
    256+inactiveconnection)/w
    SED: 权重=(actionconnection*256+1)/w
    假设,后端RS,A(1),B(10),都没有连接。会使B(10)优先获得连接。而WLC,如果都没有连接,会按照次序,依次分配连接,可能会导致A(1),优先获得连接
    NQ : 加强的SED
    当A(1),B(10)一开始获得连接,当发现B(10)的连接数为10个,但A(1)才有1一个,会不公平。所以在一开始,分配连接时,先给B(10),A(1)都分配一个连接。随后按照权重,进行分配连接

    虽然SED,和NQ比WLC更加公平,但其算法复杂,消耗的资源也多,所以WLC依然是最优算法

    LBLC: 在DH,进行权重代理

    正向代理,两台服务器,负载不一样时,有新目标的连接请求,会分配到负载比较小的那台机器

    LBLCR: 把DH,进行权重代理,把缓存进行迁移共享

    当A和B两台负载均衡,都负载了50%。但A有90%的活跃连接,B有10%的活跃连接。此时A的负载高于B的。VS的算法,会把A的缓存,迁移到B一份,B有A的缓存。再次有访问时,访问B即可。减轻A的负载

    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]
      ipvsadm -a|e -t|u|f service-address -r server-address [options]
      ipvsadm -d -t|u|f service-address -r server-address
      ipvsadm -L|l [options]
      ipvsadm -Z [-t|u|f service-address]
    
    options
     --gatewaying   -g                   gatewaying (direct routing) (default)
      --ipip         -i                   ipip encapsulation (tunneling)
      --masquerading -m                   masquerading (NAT)
      --weight       -w weight            capacity of real server
      --stats                             output of statistics information
      --rate                              output of rate information
      --exact                             expand numbers (display exact values)
    --connection   -c                   output of current IPVS connections
    
    
    -A 添加服务
    -E 修改服务
    -t tcp协议
    -u udp协议
    -f  iptables flag标识
    -s  调度算法
    -p 是否持久连接 默认360s
    -Z 清空计数器
    -C 清空规则
    -S 保存
    -R 从文件中恢复规则
    -a 添加后端RS节点
    -g DR模式
    -i TUN模式
    -m NAT模式
    -w 权重
    --stats 显示所有连接的状态
    --rate 显示速率
    --connection 显示连接数
    

    配置NAT

    vs

    外网IP 10.0.0.11
    内网IP 172.16.1.11
    # VS开启路由转发(此次试验没有开启,但马哥视频上说开启)
    ipvsadm -A -t 10.0.0.11:80 -s rr
    ipvsadm -a -t 10.0.0.11:80 -r 172.16.1.12 -m
    ipvsadm -a -t 10.0.0.11:80 -r 172.16.1.13 -m
    [root@mysql network-scripts]# ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
    TCP  10.0.0.11:80 rr
      -> 172.16.1.12:80               Masq    1      0          3         
      -> 172.16.1.13:80               Masq    1      0          3         
    

    RS

    RS的网卡指向vs内网网卡的IP,注意VS只配置内网网段。

    测试

    root@mysql network-scripts]# curl 10.0.0.11
    172.16.1.11
    [root@mysql network-scripts]# curl 10.0.0.11
    172.16.1.12
    [root@mysql network-scripts]# curl 10.0.0.11
    172.16.1.11
    [root@mysql network-scripts]# curl 10.0.0.11
    172.16.1.12
    

    配置 DR模式

    VS

    #开启路由转发
    ifconfig ens33:0 10.0.0.0.14 netmask 255.255.255.255 boradcost 10.0.0.14
    ipvsadm -A -t 10.0.0.14:80 -s rr
    ipvsadm -a -t 10.0.0.0.14:80 -r 10.0.0.12 -g
    ipvsadm -a -t 10.0.0.0.14:80 -r 10.0.0.13 -g
    

    RS

    echo 1  > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 1  > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    ifconfig lo:0 10.0.0.14 netmask 255.255.255.255 boradcost 10.0.0.14
    route add -host 10.0.0.14 dev lo:0
    

    测试

    注:curl 要全路径进行curl命令

    image.png image.png
    • RS抑制arp应答

    arp_ignore=1
    0:只要跟eth0沟通,从eth1过来也可以
    1:对eth0沟通,只能从eth0过来,从eth1过啦沟通不了

    • 抑制ARP通告
      arp_announce=2
      0: C会刚给Aeth0和eth1的地址
      1:C 尽量给A eth0的地址
      2:C只会给Aeth0的地址
    • 给RS添加路由
      route add -host 10.0.0.14 dev lo
      确保响应报文会从vip出去,因为报文从哪进来就从哪出去。(从VS到RS是重新封装MAC地址包,只解开第二层,第三层的目标IP包还是没有解开)
    • 配置RS的VIP的lo上
      因为只有把VIP和CIP配置不在不同

    LVS绑定服务

    当用户请求80或443端口时,只需要VS后端负载一个集群。对用户,来说请求这两个端口,相当于请求的是一样的内容,包括算法

    iptables -t mangle -A PREROUTING -d 10.0.0.14 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 3 
    ipvsadm -A -f 3 -s sh
    ipvsadm -a -f 3 -r 10.0.0.12 -g
    ipvsadm -a -f 3 -r 10.0.0.13 -g
    # 后端RS和配置DR模式一样
    

    lvs 会话绑定

    [root@mysql ~]# ipvsadm -E -f 3 -s rr -p
    [root@mysql ~]# ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    FWM  3 rr persistent 360
      -> 10.0.0.12:0                  Route   1      0          0         
      -> 10.0.0.13:0                  Route   1      0          0 
    
    # -p支持会话绑定默认360秒
    如果后端服务为serice_ip:0的话,必须使用-p选项
    
    image.png

    相关文章

      网友评论

          本文标题:LVS

          本文链接:https://www.haomeiwen.com/subject/uhgrghtx.html