码迷,mamicode.com
首页 > 其他好文 > 详细

Keepalived+nginx

时间:2016-08-09 16:19:20      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:keepalived nginx ha

环境:

虚拟IP:172.16.10.49

nginx1:172.16.10.50   主

nginx2:172.16.10.51   备

分别在两台机器上安装nignx和keepalived,这里采用yum的方式安装。

keepalived应该说是lvs的衍生项目,与lvs的配合比较紧密。当用于做其他服务的HA的时候,只能依靠脚本去扩展相应的功能。

在keepalived+nginx的组合中,包括了两个层次上的HA:

主机层HA,这个依赖keepalived本身的功能,当主机down掉的时候,可以自动将VIP切换到备机上;

服务层HA,这部分是通过脚本结合keepalived的来实现的,通过脚本判断服务是否正常,从而操控keepalived的进程来实现vip在主备机之间的漂移。



1.设置nginx的yum源   

创建文件/etc/yum.repos.d/nginx.repo

加入以下内容:


[nginx]

name=nginx repo

baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/

gpgcheck=0

enabled=1


将其中的OS改成当前系统的类型(rhel|centos),OSRELEASE改成当前的版本(5|6|7)

yum install -y nginx

启动nginx:

/etc/init.d/nginx restart

查看当前端口 有80端口出现刚nginx安装完成。在备机上按上述安装nginx.



2.安装keepalived

在centos的源里有keepalived这个软件,这里不再采用源码安装的方式,直接

yum install keepalived -y



________________________________________

3.配置

nginx的配置正常进行,主服务器跟备机上nginx的配置要保持一致。(此处配置只供实验,且在K+N的配合中,nginx配置并无特别要求,只要主备上配置一致即可)

为了验证keepalived的效果,启动两台机器的上nginx,在Web目录下创建一个文件,index.html主备机上的文件稍有不同以区别当前生效的是哪台服务器。

nignx1: this is the master server

nginx2: this is the backup server



3.1 keepalived配置

配置文件:


! Configuration File for keepalived

global_defs {

   notification_email {

        root@localhost

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

vvrp_script chk_ngx {    !定义脚本

        script "/root/bin/chk_nginx.sh"

        interval 2

        weight 2

}

vrrp_instance VI_1 {

    state BACKUP  !(主:MASTER,备:BACKUP)

    interface eth0

    virtual_router_id 51  !(主备一致)

    priority 200 !(主 > 备)

    nopreempt

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        172.16.10.49/16 dev eth0

    }


   track_script {   !调用脚本

        chk_ngx

}

}



3.2 nginx服务检测脚本

功能很简单:

检测-->nginx进程--存活-->检测结束

       |

       |-->不存在nginx进程-->启动nginx-->等待-->再次检测-->存活-->检测结束

                                     |

                                     |-->进程不存在-->shutdown keepalived让vip漂移到备机-->结束


FN=`ps -C nginx --no-header | wc -l`

if [ $FN -eq 0 ]; then

        echo  stop

        /etc/init.d/nginx start

        sleep 2


        SN=`ps -C nginx --no-header | wc -l`    

        if [ $SN -eq 0 ];then

                echo sec-stop

                /etc/init.d/keepalived stop

        fi

fi


注:这个脚本有一个问题,在nginx假死,即nginx进程在,但无法正常提供http服务的情况下,无法完成杀掉keepalived使用vip漂移的功能。可采用检测http服务的方式来改善,用wget(curl)去访问80端口,正常返回结果刚正常,否则重启nginx,再次检测,如果还失败,刚杀掉keepalived进程。



code=`curl -I http://172.16.10.50/sfe | head -n 1 | awk ‘{print $2}‘`

if [ $code != "200" ];then

        /etc/init.d/keepalived stop

fi



4.启动         

/etc/init.d/keepalived  start

启动后执行ip add 可以看到vip已经绑定到eth0上了。


1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host 

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 52:54:00:ca:8f:b1 brd ff:ff:ff:ff:ff:ff

    inet 172.16.10.50/16 brd 172.16.255.255 scope global eth0

    inet 172.16.10.49/16 scope global secondary eth0

    inet6 fe80::5054:ff:feca:8fb1/64 scope link 

       valid_lft forever preferred_lft forever



停掉主服务器的nginx,检测脚本在检测到后会先启动一次nginx,当再次检测到nginx失败的时候,杀掉keepalived进程,vip漂移到backup服务器上:


2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 52:54:00:de:f8:42 brd ff:ff:ff:ff:ff:ff

    inet 172.16.10.51/16 brd 172.16.255.255 scope global eth1

    inet 172.16.10.49/16 scope global secondary eth1

    inet6 fe80::5054:ff:fede:f842/64 scope link 

       valid_lft forever preferred_lft forever


5.应用模式

常用的为MASTER-BACKUP(可以有多个)模式,配置主备服务器大部分一致只有两个地方需要注意:

MASTER--BACKUP



    priority 200 

    virtual_router_id 51 

    interface eth0

    state MASTER

    priority 100

    virtual_router_id 51 

    interface eth0

    state BACKUP  

在这种模式下,当主机Down之后,vip会漂移到备机,但当主机恢复重启后,vip会再次漂移回主机,但这个过程可能会发生一些预料之外的问题。既然备机已经绑定vip正常工作了,这里就可以考虑通过设置实现,主机恢复后,VIP不再自动漂移回主机,而是在备机出现故障的时候再漂移,或者是在人工维护时再漂移回主机。

BACKUP--BACKUP



    priority 200 

    virtual_router_id 51 

    interface eth0

    state BACKUP

    nopreempt

    priority 100

    virtual_router_id 51 

    interface eth0

    state BACKUP      

当主机备机同时启动时,keepalived通过priority来动态决定谁作为MASTER,主机增加nopreempt项,确认主机在down机重启后不会抢占vip. 继续由备机绑定VIP提供服务。         


本文出自 “那些年匆匆” 博客,请务必保留此出处http://gtlinux.blog.51cto.com/1047916/1836110

Keepalived+nginx

标签:keepalived nginx ha

原文地址:http://gtlinux.blog.51cto.com/1047916/1836110

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!