Nginx+keepalived实现高可用

一,拓扑结构

在这里插入图片描述

系统IPlocalhostServer
Centos7.6192.168.67.100VIP
Centos7.6192.168.67.130masternginx、keepalived-1.3.5
Centos7.6192.168.67.131backupnginx、keepalived-1.3.5

二,安装nginx

yum -y install  gcc-c++ gcc zlib pcre pcre-devel openssl openssl-devel
mkdir -p /home/apps
tar -zxvf nginx-1.18.0.tar.gz
cd /data/nginx/nginx-1.18.0.tar.gz
./configure --prefix=/usr/local/nginx
make && make install

 # 查看 Nginx 版本
 /usr/local/nginx/sbin/nginx -v
 # 查看 Nginx 安装时的配置参数
 /usr/local/nginx/sbin/nginx -V
 # 启动
 /usr/local/nginx/sbin/nginx

设置systemctl启动

[Unit]
Description=Nginx Server
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

systemctl start nginx

三,安装Keepalived

注:主/备调度器均能够实现正常调度
主/备调度器安装软件

  • master 节点
[ master ~]# yum install -y keepalived
[ master ~]#  cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

[ master ~]# vim /etc/keepalived/keepalived.conf

lobal_defs {
   router_id Nginx_02
}
vrrp_script check_nginx {
        script "/etc/keepalived/check_nginx_status.sh"
        interval 2
        weight -5
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     192.168.67.100
    }
    track_script {
        check_nginx
    }
}

chmod +x /etc/keepalived/check_nginx_status.sh

  • backup节点
[ slave ~]# yum install -y keepalived
[ slave ~]# cd /etc/nginx/conf.d/ 
[ slave conf.d]# mv default.conf default.conf.bak
[ slave ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

[ backup ~]# vim /etc/keepalived/keepalived.conf

global_defs {
   router_id Nginx_01
}
vrrp_script check_nginx {
        script "/etc/keepalived/check_nginx_status.sh"
        interval 2
        weight -5
}
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.67.100
    }
    track_script {
        check_nginx
    }
}

chmod +x /etc/keepalived/check_nginx_status.sh

启动keeplived(主备均启动)

[ master ~]# systemctl start keepalived
[ master ~]# systemctl enable keepalived
[ backup ~]# systemctl start keepalived
[backup ~]# systemctl enable keepalived

测试: 浏览器访问:http://192.168.67.100 如能正常访问,讲keepalived主节点关机,测试vip是否漂移
到此: 可以解决心跳故障keepalived.

不能解决Nginx服务故障

3.1添加nginx 健康检查脚本

扩展对调度器Nginx健康检查(可选)两台都设置

  • 思路: 让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Nginx失败,则关闭本机的Keepalived 。
 [ master ~]# vim /etc/keepalived/check_nginx_status.sh
 
 #!/bin/bash 
 /usr/bin/curl -I http://localhost &>/dev/null
if [ $? -ne 0 ];then
# /etc/init.d/keepalived stop 
systemctl stop keepalived
fi

生产其他脚本:

#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
    /opt/nginx/sbin/nginx #尝试重新启动nginx
    sleep 2  #睡眠2秒
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
        killall keepalived #启动失败,将keepalived服务杀死。将vip漂移到其它备份节点
    fi
fi

[backup ~]# chmod a+x /etc/keepalived/check_nginx_status.sh

注:必须先启动nginx,再启动keepalived
测试访问: 将keepalived集群的主节点的nginx服务关闭,查看vip是否漂移,如果漂移,即成功。

四, keepalived 配置文件详解

/etc/keepalived/keepalived.conf
基础三个模块,global_defs全局模块,vrrp_instance配置vip模块,vrrp_script 脚本模块,用来检测nginx服务。

global_defs模块参数
notification_email : keepalived在发生诸如切换操作时需要发送email通知地址,后面的 smtp_server 相比也都知道是邮件服务器地址。也可以通过其它方式报警,毕竟邮件不是实时通知的。
router_id : 机器标识,通常可设为hostname。故障发生时,邮件通知会用到。

vrrp_instance模块参数
state : 指定instance(Initial)的初始状态, MASTER 或者BACKUP,不是唯一性的,跟后面的优先级priority参数有关。
interface : 实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的,(注意自己系统,我的默认是ens33,有的是eth0)
mcast_src_ip : 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
virtual_router_id : 这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址
priority: 设置本节点的优先级,优先级高的为master(1-255)
advert_int : 检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常
authentication : 定义认证方式和密码,主从必须一样
virtual_ipaddress : 这里设置的就是VIP,也就是虚拟IP地址,他随着state的变化而增加删除,当state为master的时候就添加,当state为backup的时候删除,这里主要是有优先级来决定的,和state设置的值没有多大关系,这里可以设置多个IP地址
track_script: 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换

vrrp_script模块参数
script : 自己写的检测脚本。也可以是一行命令如killall -0 nginx
interval 2: 每2s检测一次
weight -5 : 检测失败(脚本返回非0)则优先级 -5
fall 2: 检测连续 2 次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 : 检测 1 次成功就算成功。但不修改优先级


global_defs {
   router_id nginx_01  #标识本节点的名称,通常为hostname
}

## keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
##如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。如果脚本执行结果非0,
##并且weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_nginx {
       script "/etc/keepalived/nginx_check.sh"
       interval 2  #每2秒检测一次nginx的运行状态
       weight -20  #失败一次,将自己的优先级-20
}

vrrp_instance VI_1 {
    state MASTER                  # 状态,主节点为MASTER,备份节点为BACKUP
    interface enp0s3              # 绑定VIP的网络接口,通过ifconfig查看自己的网络接口
    virtual_router_id 51          # 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,相同的VRID为一个组,他将决定多播的MAC地址
    mcast_src_ip 192.168.1.201    # 本机IP地址
    priority 100                  # 节点优先级,值范围0~254,MASTER要比BACKUP高
    advert_int 1                  # 组播信息发送时间间隔,两个节点必须设置一样,默认为1秒
    # 设置验证信息,两个节点必须一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟IP,两个节点设置必须一样。可以设置多个,一行写一个
    virtual_ipaddress {
        192.168.1.210
    }

    track_script {
       chk_nginx  # nginx存活状态检测脚本
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值