Nginx + Keepalived高可用搭建

2019-06-21  本文已影响0人  热心肠的徐同学

1.1 说明

keepalived主要通过VRRP(虚拟路由冗余协议)协议实现高可用,在keepalived服务工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用来告诉备Backup节点自己还活着。当主节点发生故障时,就无法发送心跳的消息了,备节点也因此无法继续检测到来自主节点的心跳了。于是就会调用自身的接管程序,接管主节点的IP资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源和服务,恢复到原来的备用角色。在这里我用的两台搭建的Keepalived,一台master,一台backup.保证nginx的高可用

nginx保证web服务器的高可用,在nginx的upstream里配置两台服务器的地址和端口.

1.1.1 准备

名称 IP 虚拟IP 操作系统
虚拟机1 (lb02) 192.168.92.132 192.168.92.100 centos7
虚拟机2(lb03) 192.168.92.133 192.168.92.100 centos7

1.2 整体架构图

nginx+kepalived高可用.png

客户端访问vip(虚拟ip),虚拟ip由keepalived(master)所在的主机接收,映射真正的ip,把请求交给nginx处理,nginx反向代理两台web服务器通过iphash的方式选择一台web服务器处理请求.

1.3 实现步骤

1.3.1 搭建nginx

rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum -y install nginx

设置Nginx开机启动

systemctl enable nginx.service

启动nginx并检查状态

systemctl nginx start
ps -ef | grep nginx
# nginx已成功启动
root      8220     1  0 09:52 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx     8221  8220  0 09:52 ?        00:00:00 nginx: worker process
root      8223  7657  0 09:52 pts/0    00:00:00 grep --color=auto nginx

以下是Nginx的默认路径:

为了测试方便先关闭防火墙

systemctl stop firewalld.service #临时关闭,重启失效
systemctl disable firewalld.service  #禁止开机启动

两台服务器都要启动tomcat服务,具体安装启动这里不再简述了.请参考: https://blog.51cto.com/1197822/2166795

1.3.2 修改nginx.conf

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    # 转发到tomcat服务器
    upstream tomcat_pool
    {
        # iphash; 
        server 192.168.92.132:8080;
        server 192.168.92.133:8080;
    }
    
    server {
        listen       80;
        server_name  192.168.92.133; #修改为本机的ip地址,另一台主机这里要修改为192.168.92.132
        location / {
             proxy_pass http://tomcat_pool; #代理到哪个upstream
        }
    }
}

修改后启动nginx,访问192.168.92.133,192.168.92.132发现都可以进行反向代理,为了测试能代理两台服务器,这里把iphash给注释掉了,iphash代表同一个客户端的请求只会转发到同一台服务器.

1.3.3 安装并启用keepalived

keepalived有两种安装方式,源码安装和yum安装,yum安装会相当简单

yum -y install keepalived

1.3.4 修改keepalived.conf

vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# 全局配置
global_defs {
    # 当出错了给哪些邮件发提醒
   notification_email {
     #sysadmin@firewall.loc
   }
    # 邮件发送者信息
   router_id LVS_lb01
}

#配置vrrp_script,主要用于健康检查,以及检查失败后执行的动作。
vrrp_script chk_nginx {
#健康检查脚本,当脚本返回值不为0时认为失败
    script "/etc/keepalived/nginx_check.sh"
#检查频率,以下配置每2秒检查1次
    interval 2
#当检查失败后,将vrrp_instance的priority减小5
    weight -5
#连续监测失败3次,才认为真的健康检查失败。并调整优先级
    fall 3
#连续监测2次成功,就认为成功。但不调整优先级
    rise 2
}

#定义对外提供服务的VIP vrrp_instance配置
vrrp_instance VI_1 {
    #指定vrrp_instance的初始状态,是MASTER还是BackUP主要还是看优先级
    state MASTER
    #指定vrrp_instance绑定的网卡,最终会通过指定的网卡宣告VIP
    interface ens33
    #相当于VRID,用于在一个网内区分组播,需要组播域内内唯一。
    virtual_router_id 55
    #本机的优先级,VRID相同的机器中,优先级最高的会被选举为MASTER
    priority 150
    #心跳间隔,下面配置,MASTER会每隔1秒发送一个报文高职组内其他机器,自己还活着。
    advert_int 1
    #定义主从的验证方式以及密码,一般使用PASS(最长8位,超过了只会识别前8位作为密码)
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    #VIP
    virtual_ipaddress {
        192.168.92.100/24 dev ens33 label ens33:1
    }
    #本vrrp_instance所引用的脚本配置,名称就是vrrp_script 定义的容器名
    track_script {
       chk_nginx
    }
}

BACKUP服务器的配置

! Configuration File for keepalived

global_defs {
   notification_email {
    #sysadmin@firewall.loc
   }
   router_id LVS_lb02
}

#配置vrrp_script,主要用于健康检查,以及检查失败后执行的动作。
vrrp_script chk_nginx {
#健康检查脚本,当脚本返回值不为0时认为失败
    script "/etc/keepalived/nginx_check.sh"
#检查频率,以下配置每2秒检查1次
    interval 2
#当检查失败后,将vrrp_instance的priority减小5
    weight -5
#连续监测失败3次,才认为真的健康检查失败。并调整优先级
    fall 3
#连续监测2次成功,就认为成功。但不调整优先级
    rise 2
}

vrrp_instance VI_1 {
     #指定vrrp_instance的初始状态BACKUP
    state BACKUP
    interface ens33
    virtual_router_id 55
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.92.100 dev ens33 label ens33:1
    }
    #本vrrp_instance所引用的脚本配置,名称就是vrrp_script 定义的容器名
    track_script {
       chk_nginx
    }
}

添加Nginx监控脚本nginx_check.sh,监控Nginx的运行状态,如果发现异常并不能重启成功则关闭Keepalived,让VIP漂移到备份服务器.

#!/bin/bash
#检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
#尝试启动一次nginx,停止1秒后再次检测
    systemctl nginx start
    sleep 1
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
#如果启动没成功,就杀掉keepalive触发主备切换
        systemctl keepalived stop
    fi
fi

增加监控脚本的执行权限

chmod +x /etc/keepalived/ck_ng.sh

1.4 测试

1.5 踩到的坑

  1. yum安装的时候,不能用systemctl start keepalived启动,否则keepalived只会监控你的脚本并不会真正的去执行,准确的来说是找不到这个命令执行你的脚本,127是命令没找到,command not found
xxx.sh exited due to signal 127

期间还发生126 0 1 状态码,无一例外都是用systemctl start keepalived惹的祸,我用/usr/sbin/keepalived启动就一切正常

  1. vrrp_script{}中interval的间隔时间要大于脚本中的sleep时间会报错
xxx.sh exited due to signal 15
  1. 要关闭防火墙,或者把vrrp加到防火墙里面,不然可能出现脑裂现象
上一篇下一篇

猜你喜欢

热点阅读