Keepalived+LVS负载均衡实现

目录

    • 1 实验配置
    • 2 负载不均衡的原因
    • 3 LVS集群下代码发布方案

链接博文

LVS-DR配置

实验环境

Hostname IP 说明
lb01 10.0.0.5 Nginx主负载均衡器
lb02 10.0.0.6 Nginx辅负载均衡器
web01 10.0.0.8 web01服务器
web02 10.0.0.7 web02服务器

1 实验配置

# 在上一篇博文的基础之上进行下面操作
# 安装keepalived软件
yum install keepalived -y
rpm -qa keepalived 

# 编辑keepalived备配置文件
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL1
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3/24 dev eth0 label eth0:1
    }
}  

# 相当于ipvsadm -A -t 10.0.0.3:80 -s wrr
virtual_server 10.0.0.3 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    # 相当于ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
    real_server 10.0.0.7 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 5
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
    }
    }

    # 相当于ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
    real_server 10.0.0.8 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 5
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
    }
    }

}

# 删除ipvsadm的配置表
ipvsadm -C

# 删除手动配置的虚拟VIP
ip addr del 10.0.0.3/24 dev eth0

# 启动keepalived服务,可自动健康检查节点状态
/etc/init.d/keepalived start

# 主节点keepalived配置,只需要修改router_id、state为MASTER、优先级设置高一点即可
[root@lb01 keepalived]# cat keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3/24 dev eth0 label eth0:1
    }
}

# 相当于ipvsadm -A -t 10.0.0.3:80 -s wrr
virtual_server 10.0.0.3 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    # 相当于ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
    real_server 10.0.0.7 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 5
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

    # 相当于ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
    real_server 10.0.0.8 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 5
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

}

测试
Keepalived+LVS负载均衡实现_第1张图片

2 负载不均衡的原因

当我们第一次访问VIP的时候,负载均衡器会把请求随机分配到后端的RS服务器上,那么由于我们是在电脑上虚拟了整个过程,故电脑上会有arp缓存,即使再次访问VIP的时候也不会经过LB,而会直接访问后端RS。由于ARP缓存的存在,所以在一定的时间内不会出现负载均衡。
我么可以在每次访问后,清空arp缓存(arp -d)。就会出现1:1的负载均衡(仅适合单机测试)

Keepalived进行节点健康检查

# 随便停掉一台web节点,keepalived会自动检查节点状态。
[root@lb01 keepalived]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 rr persistent 50
  -> 10.0.0.7:80                  Route   1      0          0
  -> 10.0.0.8:80                  Route   1      0          2
[root@lb01 keepalived]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 rr persistent 50
  -> 10.0.0.7:80                  Route   1      0          0
  -> 10.0.0.8:80                  Route   1      0          2
[root@lb01 keepalived]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 rr persistent 50
  -> 10.0.0.8:80                  Route   1      0          2         

3 LVS集群下代码发布方案

LVS集群下的代码发布方案详解(代码一般会放在svn/git)

  • 开发人员本地测试+>办公室内部测试(开发个人,测试人员)–(配置管理员)–>IDC机房测试(测试人员)–>正式服务器。
  • 上传的代码可大致分为两类代码,一种是不用重启服务就可以实现的代码(如php、html等),还有一种就是必须要重启服务的代码(java、tomcat等)。

如php代码上传时不需要重启服务的,但为了不影响用户体验,所以有以下两种比较好的上传代码方案:

  • 1、需要在统一文件系统下,即在同一目录层级,创建一个别的目录,如正常的访问代码是在/application/nginx/html/目录下,那么我们会创建/application/nginx/tmp目录,然后用mv命令把代码移动到html目录下,这样延迟几乎可以忽略,用户体验还是很好的。

  • 2、或者是在同一层级目录下创建其它目录,然后创建软链接把html目录链接至创建的目录
    /application/nginx/html/ # 用户访问代码位置
    /application/nginx/html123 # 手动创建的目录
    ln -s /application/nginx/html/ /application/nginx/html123/

若是JAVA代码或者是tomcat resin之类的代码,需要服务重启才能生效。

  • 这样的代码上传需要分组上传,比如有6台服务器提供web服务,这样先把其中三台在LVS中踢掉,即下线,然后把代码上传至其中,上传完之后需要把这三台服务器挂到同环境下的内网测试机上,进行内部测试,无误后把这三台服务器正式上线,然后再把另外三台服务器下线,进行同样操作。

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