文章目录

  • LVS
  • 1、基础
  • 2、调度模式
  • 3、调用算法
  • 4、keepalived


LVS

1、基础
  1. LVS。Linux虚拟服务器(Linux Virtual Server)是一个基于四层、具有强大性能的反向代理服务器。

LVS通过工作于内核的ipvs模块来实现功能,其主要工作于netfilter 的INPUT链上。
而用户需要对ipvs进行操作配置则需要使用ipvsadm这个工具。
ipvsadm主要用于设置lvs模型、调度方式以及指定后端主机。

  1. 常用集群软硬件
    软件:lvs,keepalived,haproxy,nginx,apache,heartbeat
    硬件:F5,Netscaler,Radware,A10等
  2. LVS的优点和缺点
LVS的优点是:
1、抗负载能力强、4层分发之用,不握手。
2、配置性比较低,错误率少
3、工作稳定,自身有完整的双机热备方案,最多的还是LVS/DR+Keepalived。

LVS的缺点是:
1、软件本身不支持正则表达式处理,不能做动静分离;
2、如果是网站应用比较庞大的话,LVS/DR+Keepalived实施起来就比较复杂了
  1. ipvs工作于内核空间的INPUT链上,当收到用户请求某集群服务时,经过PREROUTING链,经检查本机路由表,送往INPUT链;在进入netfilter的INPUT链时,ipvs强行将请求报文通过ipvsadm定义的集群服务策略的路径改为FORWORD链,将报文转发至后端真实提供服务的主机。
  2. 学习网址
https://www.jianshu.com/p/8a61de3f8be9
2、调度模式

工作模式

  1. LVS-NAT
    网络地址转换,Network Address Transform。
    关键点是:1、真实服务器的默认网关配置为LVS均衡负载服务器。
    过程:CIP-VIP,CIP-RIP,RIP-CIP,VIP-CIP
  2. lvs keepalived区别 lvs与keepalived_lvs负载均衡

  3. LVS-DR
    直接路由,Director Routing
    关键点是:1、mac欺骗,mac设置为某真实服务器。2、真实服务器配置VIP,对外不可见,对内可见。
    过程:CIP-VIP、CIP-VIP(mac为某真实服务器的),VIP-CIP
  4. lvs keepalived区别 lvs与keepalived_服务器_02

  5. TUN模式
    隧道模式,Tunnel。
    关键点:1、IP背着IP,外层包含内层真实的ip。2、真实服务器设置vip。
    过程:cip-vip,dip-rip(cip-vip),真实服务器解开外层ip,再返回vip-cip
  6. lvs keepalived区别 lvs与keepalived_lvs负载均衡_03

  7. LVS-FULLNAT
    FULLNAT原理: FULLNAT转发数据包是类似NAT模式,IN和OUT数据包都是经过LVS;唯一的区别:后端RealServer 或者交换机不需要做任何配置。
    关键点是:后端RealServer 或者交换机不需要做任何配置。
    过程:cip-vip,lip-rip,rip-lip,vip-cip
  8. lvs keepalived区别 lvs与keepalived_lvs_04

  9. 四种模式的优缺点
LVS-NAT:
	优点:支持端口映射,适合流量较小的场景。
	缺点,请求和响应报文都经过负载均衡服务器LB,lb性能瓶颈。
LVS-DR:
	优点:响应报文不经由Director。性能最高。
	缺点:不能端口映射,必须统一局域网,下一跳mac地址限制。
LVS-TUN:
	优点:公网地址
	缺点:不能端口映射,隧道技术会额外花费性能,加解密等,增大开销。
FULLNAT:
	优点:真实服务器可以不用配置默认网关为LB
	缺点,RealServer无法获得用户IP;
3、调用算法

一共有10种,默认是加权最少链接 wlc,它可以知道数据包的数据,记录有多少正在连接等。

还有其他,只需要记住轮询,加权轮询,最少连接,加权最少连接,还有目标地址、源地址散列算法。

4种静态的

  1. 轮循调度 rr
    均等地对待每一台服务器,不管服务器上的实际连接数和系统负载
  2. 加权轮调 wrr
    调度器可以自动问询真实服务器的负载情况,并动态调整权值
  3. 目标地址散列调度算法 dh
    该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器
  4. 源地址散列调度算法 sh
    与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。

6种静态的

  1. 最少链接 lc
    动态地将网络请求调度到已建立的连接数最少的服务器上。如果集群真实的服务器具有相近的系统性能,采用该算法可以较好的实现负载均衡
  2. 加权最少链接 wlc
    调度器可以自动问询真实服务器的负载情况,并动态调整权值带权重的谁不干活就给谁分配,机器配置好的权重高
  3. 最少期望延迟 sed
    不考虑非活动链接,谁的权重大,优先选择权重大的服务器来接收请求,但权重大的机器会比较忙
  4. 永不排队 nq
    无需队列,如果有realserver的连接数为0就直接分配过去
  5. 基于局部性的最少连接调度算法 lblc
    这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
  6. 复杂的基于局部性最少的连接算法 lblcr
    记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
4、keepalived
  1. Keepalived是Linux下一个轻量级别的高可用解决方案,高可用(High Avalilability,HA)
  2. VRRP协议,虚拟路由冗余协议,工作方式如下:

Master角色的服务器(虚拟路由器),通过IP多播方式发送一直发送心跳包(VRRP数据包),

处于BACKUP角色的路由器只会接受Master角色发送过来的报文信息,用来监控Master运行状态

BACKUP服务器会对比优先级priority,根据是否为抢占策略判断是否自己切换为Master。

或者BACKUP服务器在约定时间内就无法收到Master发过来的信息,于 就认定Master出现故障,优先级最高的BACKUP将称为新的MASTER,切换速度极快。

  1. 配置
    主要有2点需要注意:
    配置实例的时候,确定本服务器是主服务器(master)还是从服务器(BACKUP),同时配置自己的优先级(priority)。最后配置VIP和VMCA。
    配置VIP对应的真实服务器集群时,可以配置调用模式和调用算法,然后设置真实地址和健康检查方法。



# 全局配置
global_defs {
   # 邮件通知信息
   notification_email {
     # 定义收件人
     acassen@firewall.loc
   }
   # 定义发件人
   notification_email_from Alexandre.Cassen@firewall.loc
   # SMTP服务器地址
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   # 路由器标识,一般不用改,也可以写成每个主机自己的主机名
   router_id LVS_DEVEL
   # VRRP的ipv4和ipv6的广播地址,配置了VIP的网卡向这个地址广播来宣告自己的配置信息,下面是默认值
   vrrp_mcast_group4 224.0.0.18
   vrrp_mcast_group6 ff02::12
}

# 定义用于实例执行的脚本内容,比如可以在线降低优先级,用于强制切换
vrrp_script SCRIPT_NAME {

}

# 一个vrrp_instance就是定义一个虚拟路由器的,实例名称
vrrp_instance VI_1 {
    # 定义初始状态,可以是MASTER或者BACKUP
    state MASTER
    # 工作接口,通告选举使用哪个接口进行
    interface ens33
    # 虚拟路由ID,如果是一组虚拟路由就定义一个ID,如果是多组就要定义多个,而且这个虚拟
    # ID还是虚拟MAC最后一段地址的信息,取值范围0-255
    virtual_router_id 51
    # 使用哪个虚拟MAC地址
    use_vmac XX:XX:XX:XX:XX
    # 监控本机上的哪个网卡,网卡一旦故障则需要把VIP转移出去
    track_interface {
        eth0
        ens33
    }
    # 如果你上面定义了MASTER,这里的优先级就需要定义的比其他的高
    priority 100
    # 通告频率,单位为秒
    advert_int 1
    # 通信认证机制,这里是明文认证还有一种是加密认证
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 设置虚拟VIP地址,一般就设置一个,在LVS中这个就是为LVS主机设置VIP的,这样你就不用自己手动设置了
    virtual_ipaddress {
        # IP/掩码 dev 配置在哪个网卡
        10.10.10.2/24 dev eth1
        # IP/掩码 dev 配置在哪个网卡的哪个别名上
        192.168.200.17/24 dev label eth1:1
    }
    # 虚拟路由,在需要的情况下可以设置lvs主机 数据包在哪个网卡进来从哪个网卡出去
    virtual_routes {
        192.168.110.0/24 dev eth2
    }
    # 工作模式,nopreempt表示工作在非抢占模式,默认是抢占模式 preempt
    nopreempt|preempt
    # 如果是抢占默认则可以设置等多久再抢占,默认5分钟
    preempt delay 300
    # 追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容
    track_script {

    }
    # 三个指令,如果主机状态变成Master|Backup|Fault之后会去执行的通知脚本,脚本要自己写
    notify_master ""
    notify_backup ""
    notify_fault ""
}

# 定义LVS集群服务,可以是IP+PORT;也可以是fwmark 数字,也就是防火墙规则
# 所以通过这里就可以看出来keepalive天生就是为ipvs而设计的
virtual_server 10.10.10.2 1358 {
    delay_loop 6
    # 算法
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh 
    # LVS的模式
    lb_kind NAT|DR|TUN
    # 子网掩码,这个掩码是VIP的掩码
    nat_mask 255.255.255.0
    # 持久连接超时时间
    persistence_timeout 50
    # 定义协议
    protocol TCP
    # 如果后端应用服务器都不可用,就会定向到那个服务器上
    sorry_server 192.168.200.200 1358

    # 后端应用服务器 IP PORT
    real_server 192.168.200.2 1358 {
        # 权重
        weight 1
        # MSIC_CHECK|SMTP_CHEKC|TCP_CHECK|SSL_GET|HTTP_GET这些都是
        # 针对应用服务器做健康检查的方法
        MISC_CHECK {}
        # 用于检查SMTP服务器的
        SMTP_CHEKC {}

        # 如果应用服务器不是WEB服务器,就用TCP_CHECK检查
        TCP_CHECK {
          # 向哪一个端口检查,如果不指定默认使用上面定义的端口
          connect_port <PORT>
          # 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
          bindto <IP>
          # 连接超时时间
          connect_timeout 3
        }

        # 如果对方是HTTPS服务器就用SSL_GET方法去检查,里面配置的内容和HTTP_GET一样
        SSL_GET {}

        # 应用服务器UP或者DOWN,就执行那个脚本
        notify_up "这里写的是路径,如果脚本后有参数,整体路径+参数引起来"
        notify_down "/PATH/SCRIPTS.sh 参数"

        # 使用HTTP_GET方法去检查
        HTTP_GET {
            # 检测URL
            url { 
              # 具体检测哪一个URL
              path /testurl/test.jsp
              # 检测内容的哈希值
              digest 640205b7b0fc66c1ea91c463fac6334d
              # 除了检测哈希值还可以检测状态码,比如HTTP的200 表示正常,两种方法二选一即可
              status_code 200
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            # 向哪一个端口检查,如果不指定默认使用上面定义的端口
            connect_port <PORT>
            # 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
            bindto <IP>
            # 连接超时时间
            connect_timeout 3
            # 尝试次数
            nb_get_retry 3
            # 每次尝试之间间隔几秒
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}