keepalived+Nginx实现高可用集群

该博客介绍了如何从单体架构过渡到使用Nginx和keepalived搭建高可用集群。首先,通过Nginx配置静态资源和Tomcat集群实现初步的负载均衡。接着,通过keepalived实现Nginx的高可用,采用双主热备模式,确保即使Nginx节点故障,服务仍能继续。最后,通过配置Nginx服务自动重启脚本,增强了系统的稳定性。
摘要由CSDN通过智能技术生成

从单体到集群系列目录

从单体到集群(1) - 使用Nginx配置静态资源并搭建Tomcat集群

从单体到集群(2) - keepalived+Nginx实现高可用集群

从单体到集群(3) - LVS+Keepalived+Nginx实现高可用集群负载均衡

--------------------------------------------------------------------------------------------------------------------------

1.素材与软件版本

软件版本:

       IDAE:2019.2.2

       VMware:12.5.2

       虚拟机镜像:CentOs7.3标准版

       Xshell:Xshell6

       Postman:7.33.1

       Tomcat:8.5.41

       Nginx:1.18.0稳定版

       keepalived:2.0.18

       项目素材链接放上,需要的朋友请自行下载。后台项目为foodie-dev,前端项目有两个,foodie-shop为前端商城主体项目,foodie-center为前端商城个人中心项目。具体项目配置的话可以看下我的上篇博文架构篇:从单体到高可用集群(1) - 使用Nginx配置静态资源并搭建Tomcat集群

2.架构演变目标

       在上篇博文中,我们项目的架构由单体Tomcat部署前后台三个项目,演变成了由Nginx为静态资源提供服务同时将请求转发到后面的两个Tomcat集群上。上篇博文中的项目架构:

       这样确实保证了后台服务不会因为单节点Tomcat宕机而导致整体服务崩溃,但这样也有一个问题,用单节点Nginx为tomcat集群作转发,万一Nginx挂了怎么办?所以我们今天的目标就是为单节点的Nginx搭建集群,确保Nginx的高可用。我们的目标架构如下:keepalived+Nginx高可用集群(双主热备模式)

3.keepalived+Nginx高可用集群(双机主备模式)

3.1 安装keepalived

       我们先来了解一下主备模式:

       可以明显的看到主备模式的缺点,假设主机永远不宕机的话,备机一直处在待机模式,无法响应客户的请求,造成资源的浪费。下面我们要说的双主热备模式就可以解决这个问题,主备是双主热备的前提,所以我们先来配置一下主备模式。配置之前我们首先要再去创建一台Nginx虚拟机配置静态资源服务和搭建两台Tomcat集群,创建的步骤省略,不懂的小伙伴可以参考我上篇博文架构篇:从单体到高可用集群(1) - 使用Nginx配置静态资源并搭建Tomcat集群。目前四台虚拟机是已经配置好了:

       接下来我们把keepalived安装包上传到/home/software路径下,用tar指令解压:

tar -zxvf keepalived-2.0.18.tar.gz

       进入刚解压出的目录,配置并生成Makefile

./configure --prefix=/usr/local/keepalived --sysconf=/etc

       然后执行make和make install

make && make install

       这样keepalived我们就安装好了

3.2 配置keepalived

       进入/etc/keepalived路径,打开配置文件,修改配置文件内容为:

global_defs {
   #路由id:当前安装keepalived节点主机全局唯一标识符
   router_id keepalived_150
}
vrrp_instance VI_1 {
    #表示当前主机为主节点
    state MASTER
    #绑定当前实例的网卡,这个需要用ip addr查询自己网卡配置,不一定都是ens33
    interface ens33
    #主备节点识别id,保证主备节点一致 1~255之间
    virtual_router_id 255
    #权值,因为是主节点设置的高一些
    priority 100
    #主备节点之间同步检查时间,单位为s
    advert_int 1
    #授权认证密码
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虚拟IP
    virtual_ipaddress {
        192.168.1.140
    }
}

       保存退出后,去/usr/local/keepalived/sbin路径下启动keepalived:

./keepalived

       之后用ip addr指令查看一下,可以看到ens33网卡下生成配置好的虚拟IP

       同理在151这台机器上也安装一个keepalived,只不过配置文件稍加修改:

global_defs {
   #路由id:当前安装keepalived节点主机全局唯一标识符
   router_id keepalived_151
}
vrrp_instance VI_1 {
    #表示当前主机为从节点
    state BACKUP
    #绑定当前实例的网卡,这个需要用ip addr查询自己网卡配置,不一定都是ens33
    interface ens33
    #主备节点识别id,保证主备节点一致
    virtual_router_id 255
    #权值,因为是备用节点设置的低一些
    priority 50
    #主备节点之间同步检查时间,单位为s
    advert_int 1
    #授权认证密码
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虚拟IP
    virtual_ipaddress {
        192.168.1.140
    }
}

      注:keepalived启动需要时间,别刚启动就去ip addr查看虚拟ip,我刚开始安装的时候就搞了半天,一直以为安装失败,汗-_-||。具体日志在/var/log/messages文件中,如果真的启动失败可以手动查看一下。

      现在两台Nginx就配置好了集群,我们把192.168.1.150这台电脑的keepalived进程Kill掉,再访问192.168.1.140会发现被转发到了192.168.1.151这台电脑上,实现了Nginx的高可用。如果不想每次改完配置文件都去kill进程的话,可以把keepalived配置成系统服务。我们再访问192.168.1.140:90,可以看到后台请求也被转发到了192.168.1.151:90上,页面数据展示正常:

      但这样的配置存在一个问题就是,如果挂的不是keepalived而是这台电脑上的Nginx的话,keepalived的转发就不会生效,因为它无法识别Nginx服务是否正常,解决方案是可以在keepalived.conf文件中配置对Nginx的定时检查,如果发现Nginx挂了,调用脚本重启Nginx。

3.3 配置Nginx服务自动重启

      增加Nginx重启检测脚本:

vim /etc/keepalived/check_nginx_alive_or_not.sh
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
# 判断nginx是否宕机,如果宕机了,尝试重启
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    # 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机
    sleep 3
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

      增加运行权限

chmod +x /etc/keepalived/check_nginx_alive_or_not.sh

      在keepalived配置文件中写入监听nginx脚本

vrrp_script check_nginx_alive {
    script "/etc/keepalived/check_nginx_alive_or_not.sh"
    interval 2 # 每隔两秒运行上一行脚本
    weight 10 # 如果脚本运行失败,则升级权重+10
}

      在 vrrp_instance 中新增监控的脚本

track_script {
    check_nginx_alive # 追踪 nginx 脚本
}

      最后重启keepalived即可,至此keepalived+Nginx高可用集群(双机主备模式)搭建完毕。

4.keepalived+Nginx高可用集群(双主热备模式)

      双主热备的原理也很简单,就是在双机主备的基础上再增加一对实例,使192.168.1.150和192.168.1.151这两台虚拟机变成互为主备的关系。这次我们先打开原来的备用机151上keepalived的配置文件,做如下修改:

vrrp_instance VI_2 {
    #实例2中将备机151修改成主节点
    state MASTER
    interface ens33
    #记得同步修改对配id
    virtual_router_id 1
    #因为是主节点,权值加大
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #将虚拟IP:19.168.1.141绑定到自己的网卡上
    virtual_ipaddress {
        192.168.1.141
    }
}

      同理192.168.1.150这台虚拟机也进行相似的配置:

vrrp_instance VI_2 {
    #这次改为从节点
    state BACKUP
    interface ens33
    #配对id保持一致
    virtual_router_id 1
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #增加虚拟IP:192.168.1.141
    virtual_ipaddress {
        192.168.1.141
    }
}

      之后进行保存重启服务,可以看到150这台电脑绑定的虚拟IP:192.168.1.140,151这台电脑绑定的虚拟IP:192.168.1.141

      至此keepalived+Nginx高可用集群(双主热备模式)搭建完毕。细心的小伙伴可能会问,现在相当于有了两个前端访问入口(192.168.1.140和192.168.1.141),浏览器到底应该写哪一个呢?再来看一下我们的目标架构:


      可以看到前端请求在访问到虚拟IP之前,挡了一层DNS轮训转发,这需要购买一个运营商的DNS服务,在服务中进行配置就可以实现此功能。DNS是基于域名的,因为我没有购买,所以就不能展示项目中这部分的配置了。但是不用急,接下来我会分享一篇“基于LVS+keepalived+Nginx实现高可用集群架构”的文章,欢迎大家来踩。

  • 2
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值