lvs--小白博客

lvs

1、负载均衡LVS基本介绍

LVS是 Linux Virtual Server 的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网站是 http://www.linuxvirtualserver.org 如今 LVS 已是 Linux 内核标准的一部分。使用 LVS 能够达到的技术目标是:经过 LVS 达到的负载均衡技术和 Linux 操做系统实现一个高性能高可用的 Linux 服务器集群,它具备良好的可靠性、可扩展性和可操做性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。html

 

LVS:
一、抗负载能力强。抗负载能力强、性能高,能达到F5硬件的60%;对内存和cpu资源消耗比较低
二、工做在网络4层,经过vrrp协议转发(仅做分发之用),具体的流量由linux内核处理,所以没有流量的产生。
二、稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived)
三、应用范围比较广,能够对全部应用作负载均衡;
四、不支持正则处理,不能作动静分离。
五、支持负载均衡算法:rr(轮循)、wrr(带权轮循)、lc(最小链接)、wlc(权重最小链接)
六、配置 复杂,对网络依赖比较大,稳定性很高。前端

 

Ngnix:
一、工做在网络的7层之上,能够针对http应用作一些分流的策略,好比针对域名、目录结构;
二、Nginx对网络的依赖比较小,理论上能ping通就就能进行负载功能;
三、Nginx安装和配置比较简单,测试起来比较方便;
四、也能够承担高的负载压力且稳定,通常能支撑超过1万次的并发;
五、对后端服务器的健康检查,只支持经过端口来检测,不支持经过url来检测。
六、Nginx对请求的异步处理能够帮助节点服务器减轻负载;
七、Nginx仅能支持http、https和Email协议,这样就在适用范围较小。
八、不支持Session的直接保持,但能经过ip_hash来解决。、对Big request header的支持不是很好,
九、支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、Ip-hash(Ip哈希)
十、Nginx还能作Web服务器即Cache功能。python

 

HAProxy的特色是:
一、支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
二、可以补充Nginx的一些缺点好比Session的保持,Cookie的引导等工做
三、支持url检测后端的服务器出问题的检测会有很好的帮助。
四、更多的负载均衡策略好比:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
五、单纯从效率上来说HAProxy更会比Nginx有更出色的负载均衡速度。
六、HAProxy能够对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
九、支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
十、不能作Web服务器即Cache。linux

 

2、LVS的组成

LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。nginx

1. ipvs(ip virtual server):一段代码工做在内核空间,叫ipvs,是真正生效实现调度的代码。
2. ipvsadm:另一段是工做在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
git

3、lvs的三种模式

 

VS/DR模式

 

 

 

①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。算法

 

②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将目标MAC改成了RIP的MAC地址,并将此包发送给RS。sql

 

③.RS发现请求报文中的目的MAC是本身,就会将次报文接收下来,处理完请求报文后,将响应报文经过lo接口送给eth0网卡直接发送给客户端。数据库

 

注意:vim

 

须要设置lo接口的VIP不能响应本地网络内的arp请求。

 

总结:

 

一、经过在调度器 LB 上修改数据包的目的 MAC 地址实现转发。注意源地址仍然是 CIP,目的地址仍然是 VIP 地址。

 

二、请求的报文通过调度器,而 RS 响应处理后的报文无需通过调度器 LB,所以并发访问量大时使用效率很高(和 NAT 模式比)

 

三、由于 DR 模式是经过 MAC 地址改写机制实现转发,所以全部 RS 节点和调度器 LB 只能在一个局域网里面

 

四、RS 主机须要绑定 VIP 地址在 LO 接口(掩码32 位)上,而且须要配置 ARP 抑制。

 

五、RS 节点的默认网关不须要配置成 LB,而是直接配置为上级路由的网关,能让 RS 直接出网就能够。

 

六、因为 DR 模式的调度器仅作 MAC 地址的改写,因此调度器 LB 就不能改写目标端口,那么 RS 服务器就得使用和 VIP 相同的端口提供服务。

 

七、直接对外的业务好比WEB等,RS 的IP最好是使用公网IP。对外的服务,好比数据库等最好使用内网IP。

 

优势

 

和TUN(隧道模式)同样,负载均衡器也只是分发请求,应答包经过单独的路由方法返回给客户端。与VS-TUN相比,VS-DR这种实现方式不须要隧道结构,所以可使用大多数操做系统作为物理服务器。

 

DR模式的效率很高,可是配置稍微复杂一点,所以对于访问量不是特别大的公司能够用haproxy/nginx取代。日1000-2000W PV或者并发请求1万一下均可以考虑用haproxy/nginx。

 

缺点

 

全部 RS 节点和调度器 LB 只能在一个局域网里面。

 

VS/TUN模式

 

 

 

①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。

 

②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改成DIP,目标地址改成RIP,并将此包发送给RS。

 

③.RS收到请求报文后,会首先拆开第一层封装,而后发现里面还有一层IP首部的目标地址是本身lo接口上的VIP,因此会处理次请求报文,并将响应报文经过lo接口送给eth0网卡直接发送给客户端。

 

注意:

 

须要设置lo接口的VIP不能在公网上出现。

 

总结:

 

1.TUNNEL 模式必须在全部的 realserver 机器上面绑定 VIP 的 IP 地址

 

2.TUNNEL 模式的 vip ------>realserver 的包通讯经过 TUNNEL 模式,不论是内网和外网都能通讯,因此不须要 lvs vip 跟 realserver 在同一个网段内

 

3.TUNNEL 模式 realserver 会把 packet 直接发给 client 不会给 lvs 了

 

4.TUNNEL 模式走的隧道模式,因此运维起来比较难,因此通常不用。

 

优势

 

负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。因此,减小了负载均衡器的大量数据流动,负载均衡器再也不是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器可以为不少RS进行分发。并且跑在公网上就能进行不一样地域的分发。

 

缺点:

 

隧道模式的RS节点须要合法IP,这种方式须要全部的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。

 

VS/NAT模式

 

 

 

①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。

 

②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改成了后端服务器的RIP地址并将报文根据算法发送出去。

 

③.报文送到Real Server后,因为报文的目标地址是本身,因此会响应该请求,并将响应报文返还给LVS。

 

④.而后lvs将此报文的源地址修改成本机并发送给客户端。

 

注意:

 

在NAT模式中,Real Server的网关必须指向LVS,不然报文没法送达客户端

 

特色:

 

一、NAT 技术将请求的报文和响应的报文都须要经过 LB 进行地址改写,所以网站访问量比较大的时候 LB 负载均衡调度器有比较大的瓶颈,通常要求最多之能 10-20 台节点

 

二、只须要在 LB 上配置一个公网 IP 地址就能够了。

 

三、每台内部的 realserver 服务器的网关地址必须是调度器 LB 的内网地址。

 

四、NAT 模式支持对 IP 地址和端口进行转换。即用户请求的端口和真实服务器的端口能够不一致。

 

优势:

 

集群中的物理服务器可使用任何支持TCP/IP操做系统,只有负载均衡器须要一个合法的IP地址。

 

缺点

 

扩展性有限。当服务器节点(普通PC服务器)增加过多时,负载均衡器将成为整个系统的瓶颈,由于全部的请求包和应答包的流向都通过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!

 

7、LVS的八种调度算法

1. 轮叫调度 rr
这种算法是最简单的,就是按依次循环的方式将请求调度到不一样的服务器上,该算法最大的特色就是简单。轮询算法假设全部的服务器处理请求的能力都是同样的,调度器会将全部的请求平均分配给每一个真实服务器,无论后端 RS 配置和处理能力,很是均衡地分发下去。

2. 加权轮叫 wrr
这种算法比 rr 的算法多了一个权重的概念,能够给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,若是服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。

3. 最少连接 lc
这个算法会根据后端 RS 的链接数来决定把请求分发给谁,好比 RS1 链接数比 RS2 链接数少,那么请求就优先发给 RS1 

4. 加权最少连接 wlc
这个算法比 lc 多了一个权重的概念。

5. 基于局部性的最少链接调度算法 lblc
这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址全部使用的服务器,若是这台服务器依然可用,而且有能力处理该请求,调度器会尽可能选择相同的服务器,不然会继续选择其它可行的服务器

6. 复杂的基于局部性最少的链接算法 lblcr
记录的不是要给目标 IP 与一台服务器之间的链接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载太高。

7. 目标地址散列调度算法 dh
该算法是根据目标 IP 地址经过散列函数将目标 IP 与服务器创建映射关系,出现服务器不可用或负载太高的状况下,发往该目标 IP 的请求会固定发给该服务器。

 

8. 源地址散列调度算法 sh
与目标地址散列调度算法相似,但它是根据源地址散列算法进行静态分配固定的服务器资源。

复制代码
DR模式
    
    direct_server:192.168.254.17
    
    real_server:192.168.254.18
    real_server:192.168.254.19
    
    #vip为虚拟服务ip
    vip:192.168.254.250    
    
    
direct_server:
    yum install ipvsadm

老板
direct_server:
    ipvsadm -C    #清除配置信息
    
    
    #添加对外提供的服务ip
    ipvsadm -A -t 192.168.254.250:80 -s rr    #-A为ADD   -t为tcp   -s rr为设置算法为轮叫算法
    
    #添加2台real_server主机
    ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.18:80 -g #-a为add   -t为tcp   -r为realserver   -g为DR路由模式
    ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.19:80 -g #-a为add   -t为tcp   -r为realserver   -g为DR路由模式
    
    #配置网卡的子网口为vip,ip地址为192.168.254.250
    ifconfig ens33:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up
    
    #添加路由(访问192.168.254.250都走ens33:0这个网卡)
    route add -host 192.168.254.250 dev ens33:0

员工1 | 员工2
real_server:
    #在回环地址的子网口上配置服务ip(vip)
    ifconfig lo:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up 
    
    #添加路由
    route add -host 192.168.254.250 dev lo:0

    echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2">/proc/sys/net/ipv4/conf/all/arp_announce


    echo "0">/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "0">/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "0">/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "0">/proc/sys/net/ipv4/conf/all/arp_announce
    
    
    arp_ignore:定义接收到ARP请求时的响应级别      
        0:默认,只用本地配置的有响应地址都给予响应       
        1:仅仅在目标IP是本地地址,而且是配置在请求进来的接口上的时候才给予响应
            (仅在请求的目标地址配置请求到达的接口上的时候,才给予响应)

    arp_announce:定义将本身的地址向外通告时的级别       
        0:默认,表示使用配置在任何接口的任何地址向外通告       
        1:尽可能仅向目标网络通告与其网络匹配的地址       
        2:仅向与本地接口上地址匹配的网络进行通告       




tun隧道模式
    lvs-server
    ifconfig tunl0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.0 up
    route add -host 192.168.254.250 dev tunl0
    ipvsadm -A -t 192.168.254.250:80 -s rr
    ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.18 -i
    ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.19 -i


    real server
    ifconfig tunl0 192.168.254.250 netmask 255.255.255.255 broadcast 192.168.254.250 up
    route add -host 192.168.254.250 dev tunl0
    echo "1" >/proc/sys/net/ipv4/conf/tunl0/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/tunl0/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    echo "0" >/proc/sys/net/ipv4/conf/tunl0/rp_filter
    echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter

    0:不开启源地址校验。
    1:开启严格的反向路径校验。对每一个进来的数据包,校验其反向路径是不是最佳路径。
        若是反向路径不是最佳路径,则直接丢弃该数据包。
    2:开启松散的反向路径校验。对每一个进来的数据包,校验其源地址是否可达,即反向路径是否能通(经过任意网口),
        若是反向路径不一样,则直接丢弃该数据包。





keepalived:
    yum install keepalived
    vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
#全局配置
global_defs {
   notification_email {
        #收件人地址
   }
        #邮件服务器
}
VRRP配置DS1
vrrp_instance VI_1 {
    state MASTER                    #角色类型MASTER|BACKUP
    interface ens33                    #网卡名称
    virtual_router_id 51            #虚拟路由id(须要与BACKUP一致)
    priority 100                    #优先级
    advert_int 1                    #没1秒检查一次
    #nopreempt                        #非抢占模式

    authentication {
        auth_type PASS                #认证类型  主备之间必须同样
        auth_pass 1111                #认证密码  主备之间必须同样
    }
    virtual_ipaddress {
        192.168.254.250                #虚拟ip(vip)
    }
}

#LVS配置
virtual_server 192.168.254.250 80 {    
    delay_loop 3                    #健康检查时间间隔
    lb_algo rr                        #负载均衡调度算法  
    lb_kind DR                        #负载均衡转发规则 
    protocol TCP                    #协议

    real_server 192.168.254.18 80 {    #要监控的real_server的ip和端口号
            weight 1                 #权重
        TCP_CHECK {                    #基于tcp协议的检查
            connect_timeout 3          #链接时间超时
            retry 3                    #重连次数
            delay_before_retry 3    #重连间隔时间
        }
    }


    real_server 192.168.254.19 80 {
            weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }   
    }   
}



192.168.254.17    DS1
192.168.254.20      DS2
    ifconfig ens33:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up
    route add -host 192.168.254.250 dev ens33:0
    
    
192.168.254.18    RS1
    ifconfig lo:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up #loopback
    route add -host 192.168.254.250 dev lo:0

    echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
    
192.168.254.19      RS2
    ifconfig lo:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up #loopback
    route add -host 192.168.254.250 dev lo:0

    echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2">/proc/sys/net/ipv4/conf/all/arp_announce


tail -f /var/log/messages
复制代码

 

分类: 集群高可用
0
0
« 上一篇: python之面向对象3
» 下一篇: zabbix安装与配置

posted on 2018-11-30 23:08 疯子7314 阅读(668) 评论(0) 编辑 收藏

相关文章
相关标签/搜索