keepalived+Nginx实现高可用集群

    科技2025-09-14  9

    从单体到集群系列目录

    从单体到集群(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实现高可用集群架构”的文章,欢迎大家来踩。

    Processed: 0.010, SQL: 8