zoukankan      html  css  js  c++  java
  • Nginx+Keepalived 实现高可用

    Keepalived 是一个高性能的 服务器高可用 或 热备解决方案,Keepalived主要来防止服务器单点故障的问题,可以通过其与Nginx的配合来实现web服务端的高可用。

    Keepalived 以VRRP协议为实现基础,用VRRP协议来实现高可用性(HA)。

    VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或者多个),如图:

     

    安装Keepalived

    准备环境

    准备两台 linux虚拟机,这里是centos 6.4

    192.168.85.3  

    192.168.85.4

    现在两台机器上安装好nginx,配置就用默认的就行(之前博文有写安装nginx过程)。

    接下来两台linux做同样操作。

    第一步

    版本: keepalived-1.2.18.tar.gz

    Keepalived 下载地址:http://www.keepalived.org/download.html

    下载Keepalived ,并上传到准备好的两台虚拟机上,这里上传到了 /lhy/software 

    解压安装到/usr/local下:tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/

     

    安装OpenSSL:yum install -y openssl openssl-devel 

    进入到/usr/local 下,执行命令:cd keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived

    然后在/usr/local/keepalived-1.2.18下安装和编译:make && make install

    第二步:

    keepalived安装成Linux系统服务,因为没有使用keepalived的默认安装路径(默认路径:/usr/local,安装完成之后,需要做一些修改工作:

    首先创建文件夹,将keepalived配置文件进行复制:

    mkdir /etc/keepalived

    cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

    然后复制keepalived脚本文件:

    cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

    cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

    ln -s /usr/local/sbin/keepalived /usr/sbin/                                                       (建立软连接)

    ln -s /usr/local/keepalived/sbin/keepalived /sbin/                                            (建立软连接)

    可以设置开机启动:chkconfig keepalived on,到此我们安装完毕!

    =================================================================

    软链接:软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式。这是linux中一个非常重要命令,请大家一定要熟悉。它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件。 
    当 我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的 目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。
    例如:ln -s /bin/less /usr/local/bin/less 

    -s 是代号(symbolic)的意思。 
    这 里有两点要注意:第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;第二,ln的链接又软链接 和硬链接两种,软链接就是ln -s ** **,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。 
    如果你用ls察看一个目录时,发现有的文件后面有一个@的符号,那就是一个用ln命令生成的文件,用ls -l命令去察看,就可以看到显示的link的路径了。

    =================================================================

    执行命令 service keepalived start ,如果看到可以如下启动,说明系统服务配置成功。

    也可以关闭和重启:  service keepalived stop/restart

    第三步、对配置文件进行修改:vim /etc/keepalived/keepalived.conf

     Keepalived 主要作用有两点,1,虚拟一个VIP出来,让两个Linux的入口统一。2,写一个脚本,做主备切换的时候的一个校验,比如服务挂了怎么办。

    两个文件:

    1,keepalived.conf ,覆盖 /etc/keepalived下的keepalived.conf 

    ! Configuration File for keepalived
    
    global_defs {
       router_id edu-proxy-01
    }
    
    vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh"
        interval 2
        weight -20
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface eth1
        virtual_router_id 51
        mcast_src_ip 192.168.1.51
        priority 100
        nopreempt
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
    
        track_script {
            chk_nginx
        }
    
        virtual_ipaddress {
            192.168.1.50
        }
    }

    +++++++++++++++++++++++++++++++++++++ 分割线 ++++++++++++++++++++++++++++++++++++++++++++++++++++++

    keepalived.conf配置文件说明:

    A) Master    

    ! Configuration File for keepalived
    
    global_defs {
       router_id lihaoyang ##标识节点的字符串,通常为hostname
    }
    ## keepalived 会定时执行脚本并且对脚本的执行结果进行分析,动态调整vrrp_instance的优先级。
    ##这里的权重weight 是与下面的优先级priority有关,如果执行了一次检查脚本成功,则权重会-20,也就是由100 - 20 变成了80,Master 的优先级为80 就低于了Backup的优先级90,那么会进行自动的主备切换。
    #如果脚本执行结果为0并且weight配置的值大于0,则优先级会相应增加。 #如果脚本执行结果不为0 并且weight配置的值小于0,则优先级会相应减少。 vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" ##执行脚本位置 interval 2 ##检测时间间隔 weight -20 ## 如果条件成立则权重减20(-20) } ## 定义虚拟路由 VI_1为自定义标识。 vrrp_instance VI_1 { state MASTER ## 主节点为MASTER,备份节点为BACKUP ## 绑定虚拟IP的网络接口(网卡),与本机IP地址所在的网络接口相同(我这里是eth0,通过ip a命令可查看 interface eth6 virtual_router_id 3 ## 虚拟路由ID号,主备节点必须一样 mcast_src_ip 192.168.85.3 ## 本机ip地址 priority 100 ##优先级配置(0-254的值) Nopreempt ## advert_int 1 ## 组播信息发送间隔,俩个节点必须配置一致,默认1s authentication { auth_type PASS auth_pass bhz ## 真实生产环境下对密码进行匹配,MASTER和Backup要一致 } track_script { chk_nginx } virtual_ipaddress { 192.168.85.10 ## 虚拟ip(vip),可以指定多个 } }

     注意:virtual_router_id 3 ## 虚拟路由ID号,主备节点必须一样,才能保证同一时刻只有一个节点有虚拟IP。

    B)Backup

    ! Configuration File for keepalived
    
    global_defs {
       router_id bhz006
    }
    
    vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh"
        interval 2
        weight -20
    }
    
    vrrp_instance VI_1 {
        state BACKUP
        interface eth0
        virtual_router_id 3
        mcast_src_ip 192.168.85.4
        priority 90 ##优先级配置
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass bhz
        }
    
        track_script {
            chk_nginx
        }
    
        virtual_ipaddress {
            192.168.85.10
        }
    }

    2,nginx_check.sh  脚本

    #!/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进程个数,如果是0,则启动nginx,如果启动后,nginx进程个数还是0,就杀死 keepalived ,这样就实现了 主备切换,keepalived.conf 中配置的2秒执行一次nginx_check.sh  脚本,所以当本节点的 nginx恢复后,就能

    +++++++++++++++++++++++++++++++++++++ 分割线 ++++++++++++++++++++++++++++++++++++++++++++++++++++++

    第四步 :

    masterkeepalived 配置文件 copymaster机器(172)的 /etc/keepalived/ 文件夹下,

    在把backupkeepalived配置文件copybackup机器(173)的 /etc/keepalived/ 文件夹下,

    最后把nginx_check.sh脚本分别copy到两台机器的 /etc/keepalived/文件夹下。

     第五步:

    nginx_check.sh脚本授权。赋予可执行权限:chmod +x /etc/keepalived/nginx_check.sh   。

    第六步:

    启动2台机器的nginx之后。我们启动两台机器的keepalived。

     /usr/local/nginx/sbin/nginx

      service keepalived start

      ps -ef | grep nginx

      ps -ef | grep keepalived

      可以进行测试,首先看一下俩台机器的ip a 命令下 都会出现一个虚拟ip,我们可以停掉一个机器的keepalived,然后测试,命令:service keepalived stop。结果发现当前停掉的机器已经不可用,keepalived会自动切换到另一台机器上。

    192.168.85.3 机器 ip a:

    192.168.85.4 机器 ip a :

    此时访问 虚拟出来的IP 192.168.85.10,结果访问到的是master节点:

    a) 测试 keepalived 挂了,实现切换

    执行命令service keepalived stop 关闭192.168.85.3的keepalived:

     

    执行命名 ip a 查看虚拟IP是否存在:

    发现停止了keepalived后,192.168.85.3 的虚拟IP已经不存在。此时已虚拟IP经漂移到了备用节点

    继续访问虚拟IP 192.168.85.10,可以看到,keepalived 正在启用备用节点:

    稍等片刻,可以看到备用节点已经启用:

    b)测试在nginx出现问题的情况下,实现切换

    还把192.168.85.3 的keepalived启动:service keepalived start,ip a查看虚拟IP

    这个时候我们只需要把nginx的配置文件进行修改,让其变得不可用(如 随便去掉一个分号)vim /usr/local/nginx/conf/nginx.conf  修改nginx配置文件,保存。kill 强杀掉nginx进程 

    重新加载nginx配置文件,已经报错:

    ip a查看虚拟IP,已经不存在:

    访问 虚拟IP 192.168.85.10,可以看到,keepalived正在切换到备用节点:

    稍等片刻,即会切换到备用节点 192.168.85.4 :

     将nginx修复后,重启nginx,service  keekalived start重启keepalived,即可恢复到master节点。

    keepalived 还可以用于redis、mysql等等所有服务的高可用

  • 相关阅读:
    Can't remove netstandard folder from output path (.net standard)
    website项目的reference问题
    The type exists in both DLLs
    git常用配置
    Map dependencies with code maps
    How to check HTML version of any website
    Bootstrap UI 编辑器
    网上职位要求对照
    Use of implicitly declared global variable
    ResolveUrl in external JavaScript file in asp.net project
  • 原文地址:https://www.cnblogs.com/lihaoyang/p/10455645.html
Copyright © 2011-2022 走看看