Nginx 运维(二): Keepalived 实现 Nginx 主从高可用

前言

为提供系统的 高可用,满足网络安全等级保护的热冗余的要求,平台需要对应用程序做高可用,本文主要针对 nginx 进行集群配置。

一、Nginx HA 概述

nginx 在系统中的作用是给系统提供一些负载均衡和动态代理的作用。通过不同轮询到不同服务,即使一台服务器挂掉,也能将请求转发到其他服务器上。

但如果 nginx 挂掉,那此时整个系统就没有入口了,所以,我们需要对 Nginx 做高可用配置。

这里准备两台 Nginx 服务器。

具体的思路是,将两台 Nginx 服务器都设置成一个 虚拟 IP,当 主 Nginx 服务器挂掉之后,当我们再次访问的时候,实际上就是访问我们的 从Nginx服务器来做负载均衡了,整个 IP 切换过程对于用户来说是没有感觉的,这种 工作 IP 地址变化的过程,被称为 IP漂移。

这个 虚拟IP 是由第三方软件提供的,它就是 keepalived 。

二、keepalived

Keepalived 提供了两种模式:

  • master->backup模式 : 一旦主库宕机,虚拟ip会自动漂移到从库,当主库修复后,keepalived启动后,还会把虚拟ip抢占过来, 即使设置了非抢占模式(nopreempt)抢占ip的动作也会发生。
  • backup->backup模式 p会自动漂移到从库上,当原主库恢复和keepalived服务启动后,并不会抢占新主的虚拟ip, 即使是优先级高于从库的优先级别,也不会发生抢占。为了减少ip漂移次数,通常是把修复好的主库当做新的备库。

1、首先,我们先确认下网卡及 IP

 ip addr show |grep inet
复制代码

image-20210926172322610

2、接着进行安装:

yum install keepalived –y
复制代码

3、接着配置 /etc/keepalived/keepalived.conf这个文件

主服务器配置:

! Configuration File for keepalived
​
global_defs {
   # 标识主机 id
   router_id NGINX_102
}
##检测脚本和权重参数
vrrp_script chk_http_port {
    script "/opt/software/nginx/sh/nginx_check.sh" ##配置脚本的路径
    interval 2 #(检测脚本执行的间隔)
    weight 2 ##权重
}
​
​
vrrp_instance VI_1 {
    # 标记为主服务器
    state MASTER
    interface ens33 
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.81.104
    }
    track_script {
       chk_http_port    
   }    
}
复制代码

从服务配置,只需把 state 改为 backup,和优先级降低即可。

vrrp_instance VI_1 {
    state BACKUP   # 备份服务器上将 MASTER 改为 BACKUP 
    interface eth0 ##网卡,可以从ipconfig这个命令查到
    virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
    priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小,一般来说,主100 备 80
    advert_int 1 ##心跳,秒,每隔一秒发送一个心态确认我们的Nginx服务器的存活情况
    authentication { ##密码验证
        auth_type PASS
        auth_pass 123456
}
​
virtual_ipaddress {
    192.168.81.104 ## VRRP H 虚拟地址
    } 
}
复制代码

脚本内容如下:

nginx_check.sh:脚本的路径与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 服务关闭。经过测试单独关闭 nginx,不关闭 keepalived 的话是不会转发到 nginx从服务器的。因此,脚本的目的是为了保证这两个要么全部存在,要么全部失败。

注意:有个坑,如果发现你的 nginx 关闭之后脚本不执行的原因。

  • 可用先看下路径

  • 可用看下脚本的准备性,当然我这个是可用执行的

  • 最后重要的一点是需要关闭selinux,然后重新启动

    setenforce 0
    复制代码
    • 永久关闭:

      sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
      复制代码

默认是抢占式执行的。

启动方式:

1、先启动nginx

2、再启动 keepalived

systemctl restart keepalived
复制代码

如果出错,记得查看日志:

tail -f /var/log/messages
复制代码

另外,如果依旧切换不过来,可以查看 防火墙或 ipotables 有无限制。

猜你喜欢

转载自juejin.im/post/7013625691690237982