LVS负载均衡

LVS:

  • Linux Virtual Server
  • LVS(ipvs)已被集成到linux内核中


LVS充当负载均衡调度器

  • 基于四层,工作效率高
  • 单个nginx承受不了压力,需要集群,LVS可以充当nginx集群的调度者
  • nginx接收请求来回,LVS可以只接收不响应,能支持更高并发
    image
    image

LVS模式

  • NAT 网络地址转换模式
    类似于nginx,承受的并发量不高。
    image

  • TUN 隧道模式
    承受的并发量高,但所有的计算机节点必须要有网卡,这样所有计算机就都暴露在公网了。
    image

  • DR 直接路由模式
    推荐使用,隐藏了真实的服务器
    image

LVS的负载均衡算法

静态算法

静态:根据LVS本身自由的固定的算法分发用户请求。

  1. 轮询(Round Robin 简写’rr’):轮询算法假设所有的服务器处理请求的能力都一样的,调度器会把所有的请求平均分配给每个真实服务器。(同Nginx的轮询)

  2. 加权轮询(Weight Round Robin 简写’wrr’):安装权重比例分配用户请求。权重越高,被分配到处理的请求越多。(同Nginx的权重)

  3. 源地址散列(Source Hash 简写’sh’):同一个用户ip的请求,会由同一个RS来处理。(同Nginx的ip_hash)

  4. 目标地址散列(Destination Hash 简写’dh’):根据url的不同,请求到不同的RS。(同Nginx的url_hash)

动态算法

动态:会根据流量的不同,或者服务器的压力不同来分配用户请求,这是动态计算的。

  1. 最小连接数(Least Connections 简写’lc’):把新的连接请求分配到当前连接数最小的服务器

  2. 加权最少连接数(Weight Least Connections 简写’wlc’):服务器的处理性能用数值来代表,权重越大处理的请求越多。Real Server 有可能会存在性能上的差异,wlc动态获取不同服务器的负载状况,把请求分发到性能好并且比较空闲的服务器

  3. 最短期望延迟(Shortest Expected Delay 简写’sed’):特殊的wlc算法。举例阐述,假设有ABC三台服务器,权重分别为1、2、3 。如果使用wlc算法的话,当一个新请求进来,它可能会分给ABC中的任意一个。使用sed算法后会进行如下运算:

    • A:(1+1)/1=2
    • B:(1+2)/2=3/2
    • C:(1+3)/3=4/3
      最终结果,会把这个请求交给得出运算结果最小的服务器。
  4. 最少队列调度(Never Queue 简写’nq’):永不使用队列。如果有Real Server的连接数等于0,则直接把这个请求分配过去,不需要在排队等待运算了(sed运算)。

总结

LVS在实际使用过程中,负载均衡算法用的较多的分别为wlc或wrr,简单易用。

参考文献:http://www.linuxvirtualserver.org/zh/lvs4.html

搭建LVS-DR模式

服务器与IP规划:

  • LVS-1台

    • VIP(虚拟IP):192.168.10.120
    • DIP(转发者IP/内网IP):192.168.10.125
  • Nginx-2台(RealServer)

    • RIP(真实IP/内网IP):192.168.10.126
    • RIP(真实IP/内网IP):192.168.10.127

一、为LVS节点配置虚拟IP

  • 1、先关闭网络配置管理器,防止设置时网络接口冲突

    systemctl stop NetworkManager
    systemctl disable NetworkManager
    
  • 2、找到网卡配置,并复制一份
    网卡目录 cd /etc/sysconfig/network-scripts/
    image
    复制一份 cp ifcfg-ens33 ifcfg-ens33:1,取名 ifcfg-ens33:1 ,并进入修改(覆盖原内容),如下设置了虚拟IP为192.168.10.120

    BOOTPROTO=static
    IPADDR=192.168.10.120
    NETMASK=255.255.255.0
    DEVICE=ens33:1
    ONBOOT=yes
    
  • 3、保存 ifcfg-ens33:1 后,重启网络 service network restart

  • 4、这样就设置完成了,通过命令 ip addr,会发现多了一个ip,也就是虚拟ip
    image

  • 注:以上操作都是在虚拟机里的操作,如果是云服务器

    • 阿里云不支持虚拟IP,需要购买他的负载均衡服务;
    • 腾讯云支持虚拟IP,但是需要额外购买,一台节点最大支持10个虚拟ip。

二、为两台RealServer配置虚拟IP

  • 1、先关闭网络配置管理器,防止设置时网络接口冲突

    systemctl stop NetworkManager
    systemctl disable NetworkManager
    
  • 2、进入到网卡配置目录,找到lo(本地环回接口,用户构建虚拟网络子接口),拷贝一份新的随后进行修改:
    image

  • 3、vim ifcfg-lo:1 进入修改
    image

  • 4、修改完后保存,刷新lo ifup lo,然后可以通过 ip addr命令查看
    image

  • 5、两台RealServer进行同样配置

三、为两台RS配置arp

ARP响应级别与通告行为 的概念

  • arg-ignore: ARP响应级别(处理请求)

    • 0:只要本机配置了ip,就能响应请求
    • 1:请求的目标地址到达对应的网络接口,才会响应请求
  • arp-announce: ARP通告行为(返回响应)

    • 0:本机上任何网络解耦都向外通告,所有的网卡都能接受到通告
    • 1:尽可能避免本网卡与不匹配的目标进行通告
    • 2:只在本网卡通告

配置ARP

  • 1、打开sysctl.conf文件

    vim /etc/sysctl.conf
    
  • 2、配置 所有网卡、默认网卡、虚拟网卡 的arp响应级别和通告行为,分别对应:all、default、lo

    # configration for lvs
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.default.arp_ignore = 1
    net.ipv4.conf.lo.arp_ignore = 1
    
    net.ipv4.conf.all.arp_announce = 2
    net.ipv4.conf.default.arp_announce = 2
    net.ipv4.conf.lo.arp_announce = 2
    
  • 3、保存sysctl.conf文件后,刷新 sysctl -p

  • 4、增加一个网关,用于接收数据报文,当有请求到本机后,会交给lo去处理:

    route add -host 192.168.10.120 dev lo:1
    

    使用 route -n命令,可以进行个检查:
    image

  • 5、防止重启失效,做如下处理,用于开机自启动:

    echo "route add -host 192.168.10.120 dev lo:1" >> /etc/rc.local
    

    就是将"route add -host 192.168.10.120 dev lo:1" 内容追加到/etc/rc.local文件末尾。

  • 6、两台RealServer进行同样配置

四、安装集群管理工具 ipvsadm

现如今的centos都是集成了LVS,所以ipvs是自带的,我们只需要安装ipvsadm即可(ipvsadm是管理集群的工具,通过ipvs可以管理集群,查看集群等操作),命令如下:

yum install ipvsadm

安装成功后检测下 ipvsadm -Ln
image
图中显示目前版本为1.2.1,此外是一个空列表。

五、使用ipvsadm配置集群规则

  • 1、创建lvs节点,用户访问的集群调度者

    ipvsadm -A -t 192.168.10.120:80 -s rr -p 5
    
    • -A:添加集群
    • -t:tcp协议
    • ip地址:设定集群的访问ip,也及时LVS的虚拟ip
    • -s:设置负载均衡的算法,rr表示轮询
    • -p:设置连接持久化时间,这里设置了5秒
  • 2、配置RS服务器到LVS节点下:

    ipvsadm -a -t 192.168.10.120:80 -r 192.168.10.126:80 -g
    ipvsadm -a -t 192.168.10.120:80 -r 192.168.10.127:80 -g
    
    • -a:添加真实服务器
    • -t:tcp协议
    • -r:真实服务器ip地址
    • -g:设定DR模式
  • 3、保存到规则库,否则重启失效

    ipvsadm -S
    

六、ipvsadm相关的命令

# 查看集群列表
ipvsadm -Ln

# 查看集群状态
ipvsadm -Ln --stats

# 重启ipvsadm,重启后需要重新配置
service ipvsadm restart

# 查看持久化连接
ipvsadm -Ln --persistent-conn

# 查看连接请求过期时间以及请求源ip和目标ip
ipvsadm -Lnc

# 设置tcp tcpfin udp 的过期时间(一般保持默认)
ipvsadm --set 1 1 1

# 查看过期时间
ipvsadm -Ln --timeout

# 查看帮助文档
ipvsadm -h

# 查看详细帮助文档
man ipvsadm

搭建Keepalived+Lvs+Nginx高可用集群负载均衡

image

服务器与IP规划:

  • keepalived-LVS-2台主备

    • VIP(虚拟IP):192.168.10.120 / DIP(转发者IP/内网IP):192.168.10.124
    • VIP(虚拟IP):192.168.10.120 / DIP(转发者IP/内网IP):192.168.10.125
  • Nginx-2台(RealServer)

    • RIP(真实IP/内网IP):192.168.10.126
    • RIP(真实IP/内网IP):192.168.10.127
  • MASTER keepalived配置

global_defs {
   router_id LVS_124
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.120
    }
}

# 配置集群地址访问的IP+端口
virtual_server 192.168.10.120 80 {
    # 健康检查的时间,单位:秒
    delay_loop 6
    # 配置负载均衡的算法,默认是轮询
    lb_algo rr
    # 设置lvs的模式:NAT|GUN|DR
    lb_kind DR
    # 设置会话持久化时间
    persistence_timeout 5
    # 协议
    protocol TCP

    # 负载均衡的真实服务器,也就是nginx节点的具体真实ip地址
    real_server 192.168.10.126 80 {
        # 轮询的默认权重配置比
        weight 1
        # 设置健康检查
        TCP_CHECK {
            # 检查的80端口
            connect_port 80
            # 超时时间
            connect_timeout 2
            # 重试次数
            nb_get_retry 2
            # 间隔时间
            delay_before_retry 3
        }
    }

    real_server 192.168.10.127 80 {
        weight 1
        # 设置健康检查
        TCP_CHECK {
            # 检查的80端口
            connect_port 80
            # 超时时间
            connect_timeout 2
            # 重试次数
            nb_get_retry 2
            # 间隔时间
            delay_before_retry 3
        }
    }
}
  • BACKUP keepalived配置
global_defs {
   router_id LVS_125
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.120
    }
}

# 配置集群地址访问的IP+端口
virtual_server 192.168.10.120 80 {
    # 健康检查的时间,单位:秒
    delay_loop 6
    # 配置负载均衡的算法,默认是轮询
    lb_algo rr
    # 设置lvs的模式:NAT|GUN|DR
    lb_kind DR
    # 设置会话持久化时间
    persistence_timeout 5
    # 协议
    protocol TCP

    # 负载均衡的真实服务器,也就是nginx节点的具体真实ip地址
    real_server 192.168.10.126 80 {
        # 轮询的默认权重配置比
        weight 1
        # 设置健康检查
        TCP_CHECK {
            # 检查的80端口
            connect_port 80
            # 超时时间
            connect_timeout 2
            # 重试次数
            nb_get_retry 2
            # 间隔时间
            delay_before_retry 3
        }
    }

    real_server 192.168.10.127 80 {
        weight 1
        # 设置健康检查
        TCP_CHECK {
            # 检查的80端口
            connect_port 80
            # 超时时间
            connect_timeout 2
            # 重试次数
            nb_get_retry 2
            # 间隔时间
            delay_before_retry 3
        }
    }
}
posted @ 2021-08-29 21:16  金盛年华  阅读(164)  评论(0编辑  收藏  举报