LVS与Keepalived结合实现LVS+Keepalived+Nginx

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,简单易用。

直接上配置

global_defs { 
    # 路由id:当前安装keepalived的节点主机标识符,保证全局唯一 
    # 不同的节点不同
    router_id LVS_xxx
}
vrrp_instance VI_1 { 
    # 表示状态是MASTER主机还是备用机BACKUP 
    # 备用机 设置BACKUP
    state MASTER 
    # 该实例绑定的网卡 
    interface ens33 
    
    # 保证主备节点一致即可 
    virtual_router_id 51 
    
    # 权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选 
    # 备用节点 一般设置为50
    priority 100 
    
    # 主备之间同步检查时间间隔,单位秒 
    advert_int 2 
    
    # 认证权限密码,防止非法节点进入 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    }
    
    # 虚拟出来的ip,可以有多个(vip) 
    virtual_ipaddress { 
        192.168.31.150
    } 
    
}


# 配置集群地址访问的IP+端口,端口和nginx保持一致,都是80,
# 地址换成自己的(虚拟IP)
virtual_server 192.168.31.150 80 {
    # 健康检查的时间,单位:秒
    delay_loop 6
    
    # 配置负载均衡算法,默认是轮询
    lb_algo rr
    
    # 设置LVS的模式 NAT|TUN|DR
    lb_kind DR
    
    # 设置会话持久化的时间  在此时间内不会轮询到其他服务器上
    persistence_timeout 5
    
    # 协议 
    protocol TCP
    
    # 设置真实的Nginx地址
    real_server 192.168.31.235 80 {
        # 轮询的默认权重配比
        weight 1
        
        
        # 设置健康检查
        TCP_CHECK {
            # 检查的80 端口
            connect_port 80
            
            # 检查的超时时间(2秒)
            connect_timeout  2
            
            # 重试次数 2次
            nb_get_retry 2
            
            # 重试间隔时间 3秒
            delay_before_retry 3
            
        }
    }
    
     real_server 192.168.31.236 80 {
        # 轮询的默认权重配比
        weight 1
        
        
        # 设置健康检查
        TCP_CHECK{
            # 检查的80 端口
            connect_port 80
            
            # 检查的超时时间(2秒)
            connect_timeout  2
            
            # 重试次数 2次
            nb_get_retry 2
            
            # 重试间隔时间 3秒
            delay_before_retry 3
            
        }
    }
    
}

最重要的防火墙配置

# 224.0.0.18 写这个
# ens33 网卡换成自己的
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

firewall-cmd --reload

Nginx机器配置

配置虚拟网络子接口(回环接口)

# 进入到网卡配置目录,找到lo(本地环回接口,用户构建虚拟网络子接口),拷贝一份新的随后进行修改:
cd /etc/sysconfig/network-scripts

ls
ifcfg-ens33  ifdown-ipv6    ifdown-Team      ifup-eth    ifup-post      ifup-tunnel
ifcfg-lo     ifdown-isdn    ifdown-TeamPort  ifup-ippp   ifup-ppp       ifup-wireless
ifdown       ifdown-post    ifdown-tunnel    ifup-ipv6   ifup-routes    init.ipv6-global
ifdown-bnep  ifdown-ppp     ifup             ifup-isdn   ifup-sit       network-functions
ifdown-eth   ifdown-routes  ifup-aliases     ifup-plip   ifup-Team      network-functions-ipv6
ifdown-ippp  ifdown-sit     ifup-bnep        ifup-plusb  ifup-TeamPort


cp ifcfg-lo ifcfg-lo:1

vim ifcfg-lo:1

# 修改如下
DEVICE=lo:1
IPADDR=192.168.31.150
NETMASK=255.255.255.255
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback

重启网络服务

service network restart

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

  1. arp-ignore:ARP响应级别(处理请求)
    • 0:只要本机配置了ip,就能响应请求
    • 1:请求的目标地址到达对应的网络接口,才会响应请求
  2. arp-announce:ARP通告行为(返回响应)
    • 0:本机上任何网络接口都向外通告,所有的网卡都能接受到通告
    • 1:尽可能避免本网卡与不匹配的目标进行通告
    • 2:只在本网卡通告

打开sysctl.conf:

vim /etc/sysctl.conf

# 修改如下:
# 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

刷新配置文件:

sysctl -p

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

route add -host 192.168.31.150 dev lo:1

#查看
route -n
Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.31.1    0.0.0.0         UG    100    0        0 ens33
192.168.31.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.31.150  0.0.0.0         255.255.255.255 UH    0      0        0 lo

防止重启失效,加入开机自启动

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

你可能感兴趣的:(Keepalived,LVS,Nginx)