• lvs负载均衡集群


    集群的概念

    Cluster:一个计算集合,为解决某个特定问题组合起来

    Linux clustrt主要有三种类型:
    LB:load balancing,负载均衡
    HA:high availiablity,高可用
    HP:high performance,高性能

    负载均衡

    负载均衡(Load Balance)通过对服务请求的调度,以实现提高服务的并发处理能力。

    负载均衡集群的前端使用一个调度器,将客户端请求按照算法调度分配到后端的服务器中,同时调度器可能还具有后端服务器状态检测的功能,将故障的服务器自动下线,使得集群具有一定的容错能力。

    负载均衡实现的方法

    软件上的负载

    按照网络协议工作层的分类,可以分为两种

    1.四层负载:对工作在osi四层的请求进行调度,tcp/udp属于此类

    2.七层负载:对工作的osi七层的请求进行调度,也就是大家熟知的httpd请求调度

    硬件上的负载

    通常使用的就是F5,能对四七层进行调度。属于硬件方面的调度。

    软件调度的主要软件及对应使用场景

    1.lvs

    lvs由之前在淘宝工作的章文嵩所编写,其主要基于对tcp进行调度。基于vrrp协议转发,根据请求报文的目标ip和目标协议及端口将其调试转发至某RealServer,挑选RealServer将根据调试方法实现,一般用于千万级别pv的调度。

    lvs工作模式与iptables类似,工作在四层空间,通过对INPUT请求进行修改,以实现调度

    2.haproxy

    可以基于四层负载,也可以基于七层负载。相比lvs,能支持session的转发。

    3.nginx

    nginx相比于lvs与haproxy,只能基于七层的http进行调度(nginx 1.10版本之后已经支持四层负载),负载功能约为一万左右的并发调度。

    lvs集群

    LVS集群类型:主要有四种:

    lvs-nat
    lvs-dr
    lvs-tun
    lvs-fullnat
    

    同时依据其调度方法,可分为静态和动态:

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

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

    RR:roundrobin,轮询
    WRR:Weighted RR,加权轮询
    SH:Source Hashing,源地址哈希,实现会话绑定
    DH:Destination Hashing,目标地址哈希,经常用在正向代理中
    

    动态方法:主要根据每RS当前的负载状态进行调试,注重结果公平

    LC:least connetions,最少连接
    overhead=activeconns*256+inactiveconns
    WLC:Weighted LC,加权最少连接
    overhead=(activeconns*256+inactiveconns)/weight
    SED:shorstest expection delay,最短期望延迟;
    overhead=(activeconns+1)*256/weight
    NQ:never queue,改进的SED算法,请求进入时每个RS先分配一个再使用SED算法
    LBLC:locality-based least connections基于本地的最少连接;动态的DH算法	
    LBLCR:LBLC with replication
    
    lvs中常用术语
    CIP:Client IP
    VIP:Virtual Server IP
    DIP:Director IP
    RIP:Real Server IP
    
    lvs-nat:

    其结构模型如下:

    当CIP访问时VIP时,通过VIP的路由转发至DIP,再经过NAT调度,分配到后面的RIP上,RIP响应报文后,再经由DIP转发至VIP,最后响应CIP。

    在lvs-nat模型下,整个报文进出均需要通过director,所以director很容易成为瓶颈。

    lvs-nat特点:

    多目标IP的NDAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
    1)RIP和DIP必须要同一ip网段(要确保响应报文经由dirctor,同时完成nat序列包的转换),且应该使用私网地址;
    RS的网关指向DIP,VIP如果与DIP在同一主机,则必须不能在同一网段,否则无法通过路由转发进行request调度
    2)请求报文和响应报文都必须经由Dirctor转发;Director易成为系统瓶颈
    3)支持端口映射;VIP上的端口和RIP上的端口不必非得是同一个
    4)vs必须是linux系统,rs可以是任意系统
    

    实验过程如下:

    配置环境:

    VIP:172.16.45:31
    DIP:192.168.45.200
    RIP1:192.168.45.11:8080
    RIP2:192.168.45.22:80
    

    设置如下:

    在director主机(原ip地址为172.16.45.31)上新增加一块网卡,并设置ip地址

    ip addr add 192.168.45.200 dev eno33554984
    ifconfig eno33554984 up
    ifconfig –a
    

    打开director主机路由转发功能

    echo 1 > /proc/sys/net/ipv4/ip_forward

    在Real Server上面设置好ip及gateway指向,gateway指向必须为director主机

    Real Server IP必须与director主机在同一网段。

    同时director主机上面DIP与VIP必须不能在同一网段,否则director不能进行路由转发,同时也就无法实现crul request调度

    在生产环境中,VIP必须为公网IP

    设置结果:

    RIP1地址为192.168.45.11,端口为8080
    RIP2地址为192.168.45.22,端口为80
    

    在director主机上面增加集群服务

    ipvsadm -A -t 172.16.45.31:80 -s wrr  //设置调试方式为wrr,设置目标为VIP
    ipvsadm –Ln
    

    增加Real Server

    ipvsadm -a -t 172.16.45.31:80 -r 192.168.45.11:8080 -m -w 1

    增加格式为:ipvsadm –a –t VIP –r RIP –m –w 1

    ipvsadm -a -t 172.16.45.31:80 -r 192.168.45.22:80 -m -w 2

    CIP访问调试结果如下:可以看出request调度通过weighted roundrobin方式,同时支持端口映射,访问的端口为80,可以映射到Real Server1的8080上面

    [root@chunlanyy ~]# for i in {1..10};do curl http://172.16.45.31/;done
    <h1>Real Server 1 ,the ip is 172.16.45.22</h1>
    <h1>Real Server 2 ,the ip is 172.16.45.33</h1>
    <h1>Real Server 2 ,the ip is 172.16.45.33</h1>
    <h1>Real Server 1 ,the ip is 172.16.45.22</h1>
    <h1>Real Server 2 ,the ip is 172.16.45.33</h1>
    <h1>Real Server 2 ,the ip is 172.16.45.33</h1>
    <h1>Real Server 1 ,the ip is 172.16.45.22</h1>
    <h1>Real Server 2 ,the ip is 172.16.45.33</h1>
    <h1>Real Server 2 ,the ip is 172.16.45.33</h1>
    <h1>Real Server 1 ,the ip is 172.16.45.22</h1>
    
    Lvs-dr:

    其结构模型如下:

    lvs-dr解决了lvs-nat模型中director容易成为瓶颈的问题。在lvs-dr中,director与real server在同一网络,且两者配有相同的VIP地址,director只负责调度,real server负责直接响应CIP的请求报文,响应报文不再经同director,故能提高director的并发性。

    CIP请求到达directorr的VIP后(通过arp控制,不会送达到real server上),director将报文的源MAC地址和目标MAC地址进行重装封装,然后再调度分配给real server,此时报文的源ip和目标ip均未修改,故real server将通过自己的VIP地址直接响应给CIP,无需要再经由director

    Director与real server在同一网络,且有着相同的VIP地址,故为解决ip冲突的问题,可以使用三种方法

    1)确保前端路由器将目标IP为VIP的请求报文发往Director;
    a)在前端路由器绑定
    b)在RS使用arptables
    c)在RS上修改内核参数限制通知及应答级别
    arp_announce
    arp_ignore
    

    在此即通过在内核进行修改:

    [root@chunlanyy ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
    [root@chunlanyy ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
    [root@chunlanyy ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
    [root@chunlanyy ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    

    我们会在lo上进行设置VIP,故通过禁止lo的通知和应答,故可以勉强同一网络下的ip冲突问题

    arp_announce:定义了网卡在向外宣告自己的MAC-IP时候的限制级别

    arp_ignore:定义了网卡在响应外部ARP请求时候的响应级别

    对于ignore和announcer的各项值,相关官方说明:

    arp_annouce:Define different restriction levels for announcing the local source IP address from IP packets in ARP requests sent on interface;
    0 - (default) Use any local address, configured on any interface.
    //0:默认,把本机所有接口的信息向每个接口上的网络通知
    1 - Try to avoid local addresses that are not in the target's subnet for this interface. 
    // 1:尽量改名向非本网络通告
    2 - Always use the best local address for this target.
    // 2:必须避免向非本网络通告
    
    arp_ignore: Define different modes for sending replies in response to received ARP requests that resolve local target IP address.
    0 - (default): reply for any local target IP address, configured on any interface.
    //0:使用本地任意接口上配置的地址进行响应;
    1 - reply only if the target IP address is local address configured on the incoming interface.
    // 1:仅在请求的目标IP配置在本地主机的接收报文接口上时,才给予响应
    

    配置环境:

    DIP:172.16.45.31
    VIP:72.16.45.25
    RIP1:172.16.45.32
    RIP2:172.16.45.33
    

    配置director主机上面VIP与DIP地址。

    主机默认ip为172.16.45.31,然后再添加 VIP即可

    ifconfig eno16777736:0 172.16.45.25 netmask 255.255.255.255 broadcast 172.16.45.25 up 
    ifconfig即可查看新加入的地址
    

    同时在两台real server上设置VIP地址,两台real server原始地址分别172.16.45.32,172.16.45.33

    为方便执行,引用以下脚本,在两台real server上分别执行即可

    [root@chunlanyy ~]# cat lvs-dr.sh 
    #!/bin/bash
    #
    
    vip=172.16.45.25
    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
    	
    	ifconfig lo:0 $vip netmask $mask broadcast $vip up
    	;;
    stop)
    	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 "please input start|stop"
    	;;
    Esac
    

    运行脚本后即完成lvs-dr的配置

    在director主机上进行lvs-dr集群的设置

    ipvsadm -A -t 172.16.45.25:80 -s rr
    ipvsadm -a -t 172.16.45.25:80 -r 172.16.45.32 -g -w 2
    ipvsadm -a -t 172.16.45.25:80 -r 172.16.45.33 -g -w 1
    ipvsadm –Ln
    

    通过其它CIP访问集群VIP地址即可

    [root@localhost ~]# for i in {1..10};do curl http://172.16.45.25;done
    <h1>Real Server2,the ip is 172.16.45.33</h1>
    <h1>Real Server1,the ip is 172.16.45.32</h1>
    <h1>Real Server2,the ip is 172.16.45.33</h1>
    <h1>Real Server1,the ip is 172.16.45.32</h1>
    <h1>Real Server2,the ip is 172.16.45.33</h1>
    <h1>Real Server1,the ip is 172.16.45.32</h1>
    <h1>Real Server2,the ip is 172.16.45.33</h1>
    <h1>Real Server1,the ip is 172.16.45.32</h1>
    <h1>Real Server2,the ip is 172.16.45.33</h1>
    <h1>Real Server1,the ip is 172.16.45.32</h1>
    
    lvs-tun:

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

    1)DIP,VIP,RIP应该都是公网地址
    2)RS网关必须不可能指向DIP
    3)请求报文经由Director,但响应不能经由Director,而是直接发往CIP
    4)不支持端口映射
    5)RS必须支持隧道功能
    

    lvs-tun 的特性:

    集群节点和可以跨越 Internet
    RIP,DIP,VIP 都是公网地址
    Director 仅负责处理入站请求,响应报文由 Realserver 直接发往客户端
    Realserver 使用自己的网关而不是 Director
    Realserver 只能使用支持隧道功能的操作系统
    不支持端口映射
    
    lvs-fullnat

    系统默认不支持lvs-fullnat,使用这种模式需要单独对内核进行加补丁

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

    CIP-->DIP
    VIP-->RIP
    

    lvs-fullnat的特性

    1)VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;
    2)RS收到的请求报文源地址为DIP,因响应给DIP即可
    3)请求和响应报文都经由Directory
    4)支持端口映射
    
  • 相关阅读:
    存储过程的优缺点?
    springboot注解
    springboot处理事务
    索引面试问题
    剑指Offer编程题(Java实现)——替换空格
    剑指Offer编程题(Java实现)——二维数组中的查找
    Java集合概括总结及集合选用
    Java中获取大小:length、length()、size()
    解决MarkDown打开出现:awesomium web-brower framework This view has crashed
    Java集合:Collection、List、Set、Map、泛型
  • 原文地址:https://www.cnblogs.com/marility/p/7435900.html
Copyright © 2020-2023  润新知