Heim  >  Artikel  >  Backend-Entwicklung  >  nginx + keepalived 实现HA 主从模式

nginx + keepalived 实现HA 主从模式

WBOY
WBOYOriginal
2016-08-08 09:22:37977Durchsuche
1、安装keepalived

官方下载最新版:

keepalived-1.2.17.tar.gz

tar -zxvf keepalived-1.2.17.tar.gz 解压

cd keepalived-1.2.17

提前安装工具 yum install -y popt-devel 另外的在nginx安装时已经安装了。

然后:

./configure
make && make install

下面的这几步一定要做,keepalived启动时,默认到指定目录下读取文件:(服务可以使用service进行启动)

cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
chmod +x /etc/init.d/keepalived
chkconfig --add keepalived
chkconfig keepalived on
mkdir /etc/keepalived
#修改配置文件修改的是这个目录里的
cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ 
ln -s /usr/local/sbin/keepalived /usr/sbin/


2、安装nginx,可以参考nginx安装的那个文档(nginx对应多个tomcat)

注意:需要分别在两台机器上安装nginx,同时,配置文件中的server_name需要对应相应机器的IP,而不是一样的,这样一台机器死机后,可以定位到另一台机器。upstream 所对应的机器。

分别启动nginx,使用不同的访问方式,测试两个nginx服务是否正常。

3、配置keepalived (使用主从模式) 这样的话只需要改变虚拟主机IP就可以了,keepalived会自动访问本地机器的IP的。

vi /etc/keepalived/keepalived.conf

编辑文件(主):

! Configuration File for keepalived
global_defs {
   router_id nginx_master
}
#监控服务.NGINX mysql等
vrrp_script chk_nginx {
    script "/usr/local/nginx/check_nginx.sh"
    interval 2
    weight 2
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.254
    }
    track_script {
        chk_nginx  #检测脚本 上面配置的
    }
}

--

vi /etc/keepalived/keepalived.conf

编辑文件(从):

! Configuration File for keepalived
global_defs {
   router_id nginx_backup
}
#监控服务.NGINX mysql等
vrrp_script chk_nginx {
    script "/usr/local/nginx/check_nginx.sh"
    interval 2
    weight 2
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.254
    }
    track_script {
        chk_nginx  #检测脚本 上面配置的
    }
}

脚本/usr/local/nginx/check_nginx.sh"内容:记得改变执行权限

#!/bin/bash
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
then
/usr/local/nginx/sbin/nginx
sleep 5
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
then
killall keepalived
fi
fi

4、启动并测试:

首先启动两台机器上的nginx,

其次启动两台机器上的keepalived

service keepalived start (stop)

此时使用命令 ip addr 查看虚拟IP绑定 可以看到主 有,从没有,将主机的keepalived关掉,可以看到vip绑定到了从的上面

使用其他机器访问使用wget进行访问:

wget http://192.168.1.254/recommend/api/recommend/p2l?userid=20003829

查看是否能够访问,然后让本机的nginx关掉,继续使用wget看是否能够访问,如果能够访问则HA配置成功。


5、keepalive相关参数说明(仅供参考)

 ! Configuration File for keepalived

global_defs {
   notification_email {
     admin@lvtao.net             #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的<span>sendmail</span>服务
   }
   notification_email_from  admin@lvtao.net        #设置邮件的发送地址
   smtp_server 127.0.0.1                                #设置smtp server地址
   smtp_connect_timeout 30                              #设置连接smtp server的超时时间
   router_id LVS_DEVEL                                  #表示运行keepalived服务器的一个标识。发邮件时显示在邮件主题的信息
}

vrrp_instance VI_1 {
    state MASTER              #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
    interface eth0            #指定HA监测网络的接口
    virtual_router_id 51      #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
    priority 100              #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
    advert_int 1              #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
    authentication {          #设置验证类型和密码
        auth_type PASS        #设置验证类型,主要有PASS和AH两种
        auth_pass 1111        #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
    }
    virtual_ipaddress {       #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
        10.0.0.148
    }
}

virtual_server 10.0.0.148 80 {      #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
    delay_loop 6                    #设置运行情况检查时间,单位是秒
    lb_algo rr                      #设置负载调度算法,这里设置为rr,即轮询算法
    lb_kind DR                      #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
    persistence_timeout 50          #会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。
                                    #有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。
                                    #需要注意的是,这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果50秒内没有执行任何操作,
                                    #那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受50秒的时间限制
    protocol TCP                    #指定转发协议类型,有TCP和UDP两种

    real_server 10.0.0.137 80 {     #配置服务节点1,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开
        weight 3                    #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器
                                    #分配不同的负载,可以为性能高的服务器设置较高的权值,而为性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配系统资源
        TCP_CHECK {                 #realserver的状态检测设置部分,单位是秒
            connect_timeout 10      #表示3秒无响应超时
            nb_get_retry 3          #表示重试次数
            delay_before_retry 3    #表示重试间隔
            connect_port 80
        }
    }
    real_server 10.0.0.139 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

另外,为了保证服务可靠性,我们应该在每个节点运行shell脚本检测本机的服务是否正常,一旦检测到服务异常时,停止掉本机的keepalived, 如此虚拟IP自动转移到备用机器之上,如每隔3秒检测一次本机服务状态,如果连接3次检测失败,则停止掉keepalived实例。同时如果本机服务是正常的,但是keepalived没有启动(故障恢复之后),则启动keepalived,以达到故障恢复之目的。

check_service.sh文件的内容

#!/bin/bash

pidfile=/var/lock/subsys/`basename $0`.pid

if [ -f $pidfile ] && [ -e /proc/`cat $pidfile` ] ; then

    exit 1

fi

trap "rm -fr $pidfile ; exit 0" 1 2 3 15

echo $$ > $pidfile

maxfails=3

fails=0

success=0

while [ 1 ]

do

    /usr/bin/wget --timeout=3 --tries=1 http://127.0.0.1/ -q -O /dev/null

    if [ $? -ne 0 ] ; then

        let fails=$[$fails+1]

        success=0

    else

        fails=0

        let success=$[$success+1]

    fi

    if [ $fails -ge $maxfails ] ; then

        fails=0

        success=0

        #check keepalived is running ? try to stop it

        service keepalived status | grep running

        if [ $? -eq 0 ] ; then

            logger -is "local service fails $maxfails times ... try to stop keepalived."

            service keepalived stop 2>&1 | logger

        fi

    fi

    if [ $success -gt $maxfails ] ; then

        #check keepalived is stopped ? try to start it

        service keepalived status | grep stopped

        if [ $? -eq 0 ] ; then

            logger -is "service changes normal, try to start keepalived ."

            service keepalived start

        fi

        success=0

    fi

    sleep 3

done

两个节点上均应运行此脚本,请将此脚本加入到cron任务中(此程序已经作了单实例运行机制,加入计划任务的作用就是防止脚本意外中断后检测功能失效),可实现的功能:

如果本地服务连续三次检测失败,就尝试停止keepalived服务(如果keepalived处于运行状态)

如果本地服务连接三次检测成功,但keepalived没有启动,则启动之

关键的执行点,均已经记录到系统日志中(/var/log/messages)

执行crontab -e , 加入以下内容: 
*/1  *  *  *  * /root/check_service.sh

停止掉本机的keepalived, 稍过一会,就会keepalived服务被自动启动了(这是因为本地服务检测正常)

停止掉本机的nginx, 稍过一会,就会发现keepalived服务也被停止掉了

再启动nginx, 稍过一会,发现keepalived也被正常启动,并绑定了正确的虚拟IP




以上就介绍了nginx + keepalived 实现HA 主从模式,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn