Nginx+keepalived

【Nginx+Keepalived】

【keepalived系统】

            keepalived用简单明了一句话来说就是:
            在一台工作的Nginx崩溃的情况下,系统能够检测到,并自动将请求切换到另外一台备份的Nginx服务器上
            keepalived有两个服务端即:MasterBACKUP (主和备)
            两台主备对外有一个共同的浮动IP以接收来自外部的数据包。
            www.keepalived.org  下载安装包地址,建议下载稳定版本。
            当然如果在LVS配置了keepalived那么在nginx就没必要再做keepalived了。
            运行的原理请见下图:

           

【Nginx进程检测机制】


        当然这个脚本是参考的别人的博客所写,非常感谢,记录下来当为自用。

        参考博客地址:
        http://blog.csdn.net/yinwenjie/article/details/47130609  

            这个脚本的作用是判断nginx的进程是否在运行,当然是通过统计正常列的值来判断,如果检查到没有启动,就启动nginx,
        如果启动不了,则停止keepalived的响应,从而让keepalived知道一端的keepalived服务宕掉了,就启动备用keepalived端,
        从而自动化切换,当然keepalived本身也是有检测机制,但是没有这个深入。这个很有意思,由于不怎么会写脚本,所以这个思
        路很值得我借鉴,具体如下:

        脚本:

        ------------------------------------------------------
        #!/bin/bash
        if [ $(ps -C nginx --no-heading|wc -l) -eq 0 ];then      #注意中括号左右的空格
                /usr/local/nginx/sbin/nginx
        fi
        sleep 2
        if [ $(ps -C nginx --no-heading|wc -l) -eq 0 ];then
                service keepalived stop
        fi
        ------------------------------------------------------
        解析脚本:
                ------------------------------------------------------
                ps -C nginx                  意为检查进程名字为nginx的进程

                [root@SLC-one sbin]# ps -C nginx
                  PID TTY          TIME CMD
                 1180 ?        00:00:00 nginx
                 1181 ?        00:00:00 nginx
                ---------------------------------------------------------------
                ps -C nginx --no-heading     意为检查进程名字为nginx的进程并去除头部

                [root@SLC-one sbin]# ps -C nginx --no-heading
                 1180 ?        00:00:00 nginx
                 1181 ?        00:00:00 nginx
                ---------------------------------------------------
                |     管道符的作为是将上次的输出作为下次的输入
                wc -l                          意为同级列表数量
                ps -C nginx --no-heading | wc -l      意为检查进程名字为nginx的进程并去除头部最终统计出有几行

                [root@SLC-one sbin]# ps -C nginx --no-heading | wc -l
                2
                ------------------------------------------------------------------------------------------------
                -eq 0             是等于零的意思
                $        是调用linux下的变量引用操作符,可调用系统变量。

                所以最终:
                [ $(ps -C nginx --no-heading | wc -l) -eq 0 ] 的意思为:
                检查进程名字为nginx的进程并去除头部最终统计出有几行,而统计的行数是否等于零。
                (如果最终的值为零,表示没有nginx的进程,如果不为零,则表示nginx有相应进程在运行中。同时说明了nginx在正常运行。)
                ----------------------------------------------------------------------------------------------------------------
                then             表示然后的意思
                /usr/local/nginx/sbin/nginx    
                所以这意为:然后执行/usr/local/nginx/sbin/nginx 从而启动nginx
                ---------------------------------------------------------------     

      由此可见:
                这里的脚本是为了判断nginx是否有进程在运行。如果没有运行则进行启动,
                然后 sleep 2 等待2秒钟后(是为了给予nginx的启动时间)
                继续检查nginx的进程是否有启动成功,如果仍然没有启动,则停止keepalived服务
                service keepalived stop
                以便让keepalived的服务可以检查到有一端的keepalived宕机了,然后自动切换到备用的keepalived服务器。

【Nginx+keepalived前期准备】

            1.准备两台安装过Nginx的服务器,并保证服务器正常,如果是VMware虚拟机安装,请保证可以通过本地电脑正常访问Nginx首页
            2.下载keepalived稳定版的安装包

【Keepalived安装】

        1.    这里使用的是keepalived-1.2.23.tar.gz版本
               分别在两台Nginx服务器上面安装keepalived-1.2.23.tar.gz过程如下:

            tar -zxvf keepalived-1.2.23.tar.gz
            cd keepalived-1.2.23
            ./configure --prefix=/usr/local/keepalived
            make && make install

        2.    接下来写入上面的脚本到/usr/local/keepalived/script(当然两台Nginx的服务器上面都要有这个脚本)
            这个script目录是我自建的,因为我觉得对应软件的脚本文件就放入到软件的安装目录下就好了,方便查找,个人习惯。

            ---------------------------------------------------
            touch chknginx /usr/local/keepalived/script/chknginx
            cd /usr/local/keepalived/script/
            vim chknginx
            ---------------------------------------------------------
            #!/bin/bash
            if [ $(ps -C nginx --no-heading|wc -l) -eq 0 ];then
                    /usr/local/nginx/sbin/nginx
            fi
            sleep 2
            if [ $(ps -C nginx --no-heading|wc -l) -eq 0 ];then
                    service keepalived stop
            fi
            --------------------------------------------------------------
            注意加入完成以后给文件的可执行权限,我这里是全给的,如下所示:

            chmod 777 chknginx
            -rwxrwxrwx. 1 root root 184 Aug  3 00:13 chknginx
            ---------------------------------------------------------------

【Keepalived配置文件更改】

        1.    keepalived的配置文件在 /usr/local/keepalived/etc/keepalived/keepalived.conf
            首先确立大的方向即:
                哪台来做主备,以及浮动IP
                192.168.60.90  浮动ip
                192.168.60.107 Master
                192.168.60.108 BACKUP

        2.    接下来进行配置文件的更改,在Nginx+keepalived这里只用配置前面的两个部分,即Global部分和Vrouter部分。

            -----------------------------------Global全局配置部分----------------------------------------------
                                -------------------------------------------------

            [root@SLC-one keepalived]# less keepalived.conf 
            ! Configuration File for keepalived
            #全局设置
            global_defs {
                #存在于同一个网段中,一组keepalived的各个节点都有不同的名字
                #在全局设置中,这里可以设置管理员的email邮箱信息
               notification_email {    #通知邮件
                 acassen@firewall.loc
                 failover@firewall.loc
                 sysadmin@firewall.loc
               }
               notification_email_from Alexandre.Cassen@firewall.loc  #通知邮件来源
               smtp_server 127.0.0.1            #设置邮件服务器地址为本地
               smtp_connect_timeout 30          #设置连接超时时间
               router_id LVS_nginx_kpone        #设置本keepalived的ID名称
               vrrp_skip_check_adv_addr
               vrrp_strict
               vrrp_garp_interval 0
               vrrp_gna_interval 0
            }

            vrrp_script chknginx      #这一段如果在配置文件里面没有,就自行加入进去,是为了激活上面加入的chknginx脚本
            {
                script "/usr/local/keepalived/script/chknginx"    #脚本所在地址
                interval 10               #设置检测时间间隔为每10秒一次
            }
            ----------------------------------------Vrouter的配置部分-----------------------------------------------
                               ------------------------------------------------------------

            vrrp_instance VI_1 {        #设置第一个实例
                state MASTER              #设置本机keepalived角色为MASTER(如果是另一台则设置为BACKUP)
                interface eth0          #绑定网卡为eth0(可以用ifconfig命令查看当前使用的网卡名称及地址)
                virtual_router_id 51      #虚拟路由节点ID,在同一组keepalived中,这个ID一定必须要一样,才会被识别
                nopreempt            #如果不希望在MASTER恢复后重新抢占,那么这里一定要配置非抢占模式(一般默认为抢占模式)
                priority 100            #设置此MASTER的优先级(MASTER的优先级一定比SLAVE的优先级高,值越大优先级越高)
                advert_int 1              #设置组播信息发送间隔,两台主从也必须一样
                authentication {         #认证信息
                    auth_type PASS      #只有两边的认证信息一致才能加入到同一个组中
                    auth_pass 1111
                }
                virtual_ipaddress {     #浮动虚拟ip设置,这个原本的配置文件里面有三个,可目前我们只需要一个
                    192.168.60.90       #设置浮动ip
                }
                track_script {            #关联上面的vrrp_script chknginx
                    chknginx
                }  
            }

        3.  将keepalived做成系统服务
                如果万一将服务器重新启动了,如果不是系统服务,keepalived是不是会起不来,需要手动启动,岂不是太麻烦,
                所以还是要将它做成系统的服务,这样就不必担心了。
                因为我在上面安装的时候是将keepalived安装在/usr/local/keepalived下面的,所以如要注册成为系统服务,
                需要做以下更改:

                cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
                cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/keepalived
                cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived
                mkdir /etc/keepalived
                cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
                ---------------------------这样就可以将keepalived做成系统服务了-----
                /etc/rc.d/init.d/keepalived   加入init.d的启动列表,如果后面加上start可以启动
                chkconfig keepalived on  加入开机启动

        4.  启动keepalived的服务
            先启动MASTER:service keepalived start
            再启动BACKUP:service keepalived start
            可以通过查看动态日志来看启动的状态:tail -f /var/log/messages

            经过反复试验可以实现:
                a.    当192.168.60.107宕机的时候,访问192.168.60.90,依然可以访问到nginx的首页,
                    只是是由192.168.60.108传过来,证明服务已经切换到60.108.


                b.    当192.168.60.107恢复的时候,访问192.168.60.90,当然依然可以访问,只是通过首页可以看到是由
                    192.168.60.107传回来的,服务又切换回来了。


                c.    将两台nginx服务器进行重启,脚本生效,可以正常访问nginx的首页,说明chknginx的脚本文件和keepalived
                    的服务都是正常可行的。
                    也可以通过查看进程判断nginx和keepalived是否已启动

                    [root@SLC-one ~]# ps -C nginx
                      PID TTY          TIME CMD
                     1033 ?        00:00:00 nginx
                     1035 ?        00:00:00 nginx
                    [root@SLC-one ~]# ps -C keepalived
                      PID TTY          TIME CMD
                      986 ?        00:00:00 keepalived
                      992 ?        00:00:00 keepalived
                      993 ?        00:00:00 keepalived
                                   或者也可以使用/etc/init.d/keepalived status 来查看 

        5.    配置过程注意事项:
            a.    注意防火墙的开关 service iptables start/stop
            b.  注意备用的keepalived为BACKUP而不是SLAVE,尤其是更改配置文件的时候
            c.    注意脚本文件的添加,知道bash脚本的就知道在if之后的[]的中括号的左右必须留有空格,否则会报错
            d.    BACKUP端可以不止有一个,可以有多个
            e.    局域网的组播地址要可用,因为局域网内的所有keepalived节点都是依靠组播地址来寻找对方的。
            f.    脚本存放的位置一定要跟配置文件里面的vrrp_script chknginx 内里地址对应

【主节点的抢占与非抢占模式】

            先来看原来主节点的配置文件段落:
            vrrp_script chknginx      #这一段如果在配置文件里面没有,就自行加入进去,是为了激活上面加入的chknginx脚本
            {
                script "/usr/local/keepalived/script/chknginx"    #脚本所在地址
                interval 10               #设置检测时间间隔为每10秒一次
                weight -2      #权重值减2,一旦节点失效,那么它优先级就会自动减少2,建议最好有多少个节点的数量,这里就减几
                            #这样可以一直保证这个节点的优先级比其他节点都低
                #fall 1   #表示多少次检查失败,就算为节点失效。默认为1
            }

            同时需要加入nopreempt非抢占模式的更改,配置问价里面如果没有就手动加入这一项。

            vrrp_instance VI_1 {        #设置第一个实例

                nopreempt           #如果不希望在MASTER恢复后重新抢占,那么这里一定要配置非抢占模式(一般默认为抢占模式)

                track_script {
                    chknginx
                }  
            }
            这个nopreempt和上面的weight、fall都可以在主和备端同时配置,谁失效谁就减权重值。从而达到服务器的更高可用性能。




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值