• KeepAlived + Nginx 实现高可用


    提前备好两台服务器(主:192.168.2.34,备:192.168.2.24),并安装好nginx,nginx安装此文不做赘述

    1、下载keepAlived至/usr/local并解压

    wget --no-check-certificate https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
    tar -zxvf keepalived-2.2.7.tar.gz

    2、安装

    #创建安装目录
    mkdir /usr/local/keepalived
    #安装
    cd keepalived-2.2.7/
    ./configure --prefix=/usr/local/keepalived  --sysconf=/etc  ##此处指定安装目录以及配置文件路径
    make && make install
    

     3、此时/usr/local 目录下会有三个文件,除了安装目录(keepalived)其余两个都可以删除

     4、新增配置文件。

    #我们安装时就指定了配置文件所在目录/etc/keepalived下
    cd /etc/keepalived
    #拷贝一个新的配置文件
    cp keepalived.conf.sample keepalived.conf
    

     samples下为一些常用的配置文件示例。

     5、修改配置文件

    ##主
    vrrp_instance VI_1 {
        state MASTER  ##主机为MASTER 备机为BACKUP
        interface ens160  ##物理网卡名称
        virtual_router_id 1  ##虚拟路由ID,如果是一组虚拟路由就定义一个ID,如果是多组就要定义多个,而且这个虚拟ID还是虚拟MAC最后一段地址信息,取值范围0~255
        priority 100  ##节点优先级,主 > 备
        advert_int 1 ##主备间心跳检查时间间隔,单位:s
        authentication {  ##校验方式,主要有AUTH和PASS两种,主备通信时使用,通常使用PASS
            auth_type PASS  
            auth_pass 123456 ##主备密码必须相同
        }
        virtual_ipaddress {
            192.168.2.111 ##虚拟ip,主备必须相同
        }
    }
    
    ##备
    vrrp_instance VI_1 {
        state BACKUP  ##主机为MASTER 备机为BACKUP
        interface ens160  ##物理网卡名称
        virtual_router_id 1##虚拟路由ID,如果是一组虚拟路由就定义一个ID,如果是多组就要定义多个,而且这个虚拟ID还是虚拟MAC最后一段地址信息,取值范围0~255
        priority 80 ##节点优先级,主 > 备 
        advert_int 1 ##主备间心跳检查时间间隔,单位:s 
        authentication { ##校验方式,主要有AUTH和PASS两种,主备通信时使用,通常使用PASS 
             auth_type PASS 
             auth_pass 123456 ##主备密码必须相同 
        } 
        virtual_ipaddress { 
             192.168.2.111 ##虚拟ip,主备必须相同 
        } 
    }

    6、将keepalived加入系统服务

    cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
    cp /usr/local/keepalived/sbin/keepalived /etc/init.d/
    ##刷新系统进程
    systemctl daemon-reload
    ##启动、终止、查看状态、重启
    systemctl start keepalived.service
    systemctl stop keepalived.service
    systemctl status keepalived.service
    systemctl restart keepalived.service
    

    7、启动keepalived服务(主备都启)

     8、查看网卡ip

    [root@data-anal keepalived]# ip addr 
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
        link/ether 00:0c:29:6e:9b:d2 brd ff:ff:ff:ff:ff:ff
        inet 192.168.2.34/24 brd 192.168.2.255 scope global noprefixroute ens160
           valid_lft forever preferred_lft forever
        inet 192.168.2.111/32 scope global ens160
           valid_lft forever preferred_lft forever
        inet6 fe80::716c:e679:1315:14/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever

    先在主服务器(192.168.2.34)上查看,可以看到我们配置的网卡上多出来一个虚拟ip:192.168.2.111,反观备服务器(192.168.2.24)上是没有的。

    如果都有的话,可能是配置文件中的虚拟路由id(virtual_router_i)不相同,导致分成了两个虚拟路由

    9、通过虚拟ip访问我们提前装好的nginx,我们安装好的两个nginx分别做了区分

    • 主服务器(192.168.2.34)nginx欢迎页

    •  备服务器(192.168.2.24)nginx欢迎页

    10、通过我们的VIP(192.168.2.111)访问nginx,此时我们看到是主服务器(192.168.2.34)在响应。

     

    11、我们关停主服务器keepalive服务,同时监控备服务器日志信息(默认在 /var/log/messages ),可以看到备服务器同步已经注册了虚拟ip(192.168.2.111),同时通过 ip addr 查看,发现主服务器的虚拟ip已经剔除。

    systemctl stop keepalived.service
    

    12、此时通过虚拟ip再进行访问,发现已经是备服务器(192.168.2.24)在响应,此时已经实现了keepAlived的高可用。高并发时备服务器可以有多个。

     13、keepalived的高可用为了保证其他服务的正常使用,如果keepalived可用,但应用服务不可用那就是个假象。所以检测其他服务的功能也是必备的,此处我们以检测nginx服务为例(两台服务器都做配置)

    • 在/etc/keepalived目录增加nginx检测脚本chk_nginx.sh,并赋权可执行 chmod +x chk_nginx.sh
    #!/bin/bash
    ## 查看某个名称的进程个数  ps -C nginx --no-header |wc -l
    A=`netstat -tnlp | grep 80 | grep nginx | wc -l`
    if [ $A -eq 0 ];then
      /usr/local/nginx/sbin/nginx
      sleep 2
      if [ `netstat -tnlp | grep 80 | grep nginx | wc -l` -eq 0 ];then
         systemctl stop keepalived.service
      fi
    fi
    

      

    •  在keepalived.conf中增加检测。两点要求:vrr_script 在vrrp_instance 之前track_script 在virtual_ipaddress之前
    vrrp_script chk_nginx {
        script "/etc/keepalived/chk_nginx.sh"
        interval 2
        weight 2
    }
    vrrp_instance VI_1 {
        state MASTER
        interface ens160
        virtual_router_id 1
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 123456
        }
        virtual_ipaddress {
            192.168.2.111
        }
        track_script {
            chk_nginx
        }
    }

     14、重启keepalived服务,保证主备keepalived服务正常,此时34服务器为主,24服务器为备,且虚拟ip在34服务器上,此时关停主服务器nginx,再查进程时发现nginx依然服务正常且 PID 已变,说明已经被keepalived重新拉起

    15、此处我们假设一下nginx拉不起来的场景,在脚本中注释拉起nginx的语句,此处不用重启keepalived。

     16、我们停掉nginx,同时我们在备服务器上可以看到,虚拟ip已经漂移至备服务器,同时主keepalived服务已经被停掉

    /usr/local/nginx/sbin/nginx -s stop

    停之前主keepalived进程

    备服务日志

     

    停止后keepalived进程

    17、此时我们keepalived + Nginx高可用已经实现。

    PS:实操过程中有几个要点:

    • 设置网卡时,使用 ip addr 查看绑定网卡信息 
    • 设置虚拟ip时,一定要设置当前网络环境没有被分配的ip,已经分配的ip,启动服务也不会报错,但访问不到。可以用局域网ip扫描工具扫描下。 
    • chk_nginx.sh中检测间隔时间(sleep 1)一定要比keepalived.conf中配置的检测间隔时间(interval 2)要短,不然会出现一直到不了停keepalived进程
  • 相关阅读:
    GlusterFS分布式文件系统部署
    bower解决js的依赖管理
    Linux如何查看当前占用CPU或内存最多的几个进程
    WIN7无法卸载掉中文繁体注音输入法
    kafka消费者报错INVALID_FETCH_SESSION_EPOCH
    Hbase报错:org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet
    Prometheus一条告警是怎么触发的
    prometheus client_golang使用
    prometheus告警插件-alertmanager
    sed替换变量
  • 原文地址:https://www.cnblogs.com/lansetuerqi/p/16190490.html
Copyright © 2020-2023  润新知