美文网首页
Nginx + Keepalived高可用搭建

Nginx + Keepalived高可用搭建

作者: 热心肠的徐同学 | 来源:发表于2019-06-21 10:46 被阅读0次

    1.1 说明

    • Keepalived

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

    • 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的默认路径:

    • Nginx配置路径:/etc/nginx/
    • PID目录:/var/run/nginx.pid
    • 错误日志:/var/log/nginx/error.log
    • 访问日志:/var/log/nginx/access.log
    • 默认站点目录:/usr/share/nginx/html

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

    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 测试

    • 访问虚拟ip 192.168.92.100能正确的转发到nginx
    • 停掉主机,虚拟ip会自动漂移到另一台机器,所以访问192.168.92.100还是正常的,用户无法感知主机已下线
    • 停掉主机上的Nginx,由于keepalived会定时(我这里配置的两秒)执行自己写的shell脚本,当nginx挂了后会尝试启动一次nginx,如果启动失败,就杀掉keepalive触发主备切换
    • 停掉Keepalived,虚拟ip自动漂移到另一台机器,程序正常运行
    • 停掉备机,功能不受影响

    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加到防火墙里面,不然可能出现脑裂现象

    相关文章

      网友评论

          本文标题:Nginx + Keepalived高可用搭建

          本文链接:https://www.haomeiwen.com/subject/evoeqctx.html