CentOS7.7 部署 Keepalived+Nginx 高可用集群

一、环境介绍

[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-1062.4.3.el7.x86_64 #1 SMP Wed Nov 13 23:58:53 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# cat /etc/centos-release
CentOS Linux release 7.7.1908 (Core)
[root@localhost ~]# 
[root@localhost ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[root@localhost ~]# 

二、拓扑图

 

三、准备工作

  • 在nginx01、nginx02分别安装nginx和keepalived并设置开机启动
  • 在apache01、apache01分别安装apache、并设置开机启动

因为我们只是学习测试,所以所有的服务都是用yum安装的,安装过程就不显示了。大家自行解决,写出来太丢人了。

四、配置nginx负载均衡

vim /etc/nginx/nginx.conf 

在http标签中添加:

upstream myweb {
        server 192.168.1.3:80;
        server 192.168.1.4:80;
    }

在server标签中的添加 :

 location / {
         proxy_pass http://myweb;
        }

配置完重启nginx服务。

五、配置keepalived

在主nginx01服务器的配置

vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr

#   vrrp_strict    #此处如果不注释掉,则无法ping通VIP

   vrrp_garp_interval 0
   vrrp_gna_interval 0
}


vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 55	#此处和备用必须一致,但是和局域网中其他的keeplived集群不能相同
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }


    virtual_ipaddress {
        192.168.1.10
    }
}

注意:vrrp_strict    #此处如果不注释掉,则无法ping通VIP

以上是主nginx01服务器的配置,可以复制到nginx02

在nginx02上只需要修改以下几个地方即可:

state BACKUP
interface ens33
priority 80

修改完毕后记得重启keepalived服务 。

六、测试效果

1、效果1

  • nginx01服务器停止keepalived服务,5秒之后nginx02会接管。
  • nginx01服务器恢复keepalived服务,5秒之后nginx01会接管。
  • 中间有5-10秒的间隔。

2、效果2

  • 关闭nginx01服务器,5秒之后nginx02会接管。
  • 开启nginx01服务器,5秒之后nginx01会接管。

3、效果3

  • 关闭nginx01服务器的nginx服务,nginx02不会接管,整个集群宕机对外业务中断。

原因:是我没有添加检测nginx存活的脚本。

原理:这种部署方式,在不添加脚本的情况下只能默认检测keepalived服务,如果keepalived服务挂了,备用可以接管。但是心跳检测也仅仅只是检测keepalived服务,keepalived服务上面绑定了VIP地址,换句话说他仅仅检测的是VIP是否能ping通。

如果是nginx01主服务器的nginx服务死了,备用nginx02服务器是不会接管的。必须利用脚本才能实现。因为nginx服务虽然死了,但是keepalived服务没死,也就意味着VIP可以ping通,所以他是不会切换的。

总结

因此利用这种部署方式,必须添加检测nginx存活的脚本。

我这里有两个脚本,但是和本教程无关,大家可以参考。

这个是别人的脚本,执行了一下有错误。

#!/bin/bash

A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

当nginx进程不存在时,就干掉keepalived进程。

#!/bin/bash
#当nginx进程不存在时,就干掉keepalived

if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
 then
 killall keepalived
fi

 

注意问题:

keepalived.conf中vip配置好后,通过ip addr可以看到vip已经顺利挂载,但是无法ping通,并且防火墙都已关闭

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章