Nginx+KeepAlived实现高可用

时间:2022-07-24
本文章向大家介绍Nginx+KeepAlived实现高可用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1、何为高可用

加入有两个服务器有相同的服务,平时只有一台提供服务,另一台作为热备。当提供服务的机子挂了之后,热备机能马上接管服务,这就是高可用。

Nginx的高可用可以用KeepAlive实现。

而Hadoop、Kafka等则是用Zookeeper实现高可用。

2、KeepAlived简介

keepalive是通过VRRP(虚拟路由冗余协议)实现高可用。

VRRP全称 Virtual Router Redundancy Protocol,即 虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将N台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP(vip,也就是路由器所在局域网内其他机器的默认路由),占有这个IP的master实际负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。master会发组播消息,当backup在超时时间内收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,保证路由器的高可用。

KeepAlive会给多台机子对外提供同一个虚拟ip,master会进行处理服务,如果master挂掉了,则backup会成为maste继续提供服务。

3、安装KeepAlived

(1)下载安装包解压

tar -zxvf keepalived-2.1.5.tar.gz

(2)进入解压目录,配置安装目录,跟Nginx安装类似

./configure --prefix=/usr/soft/keepalived --sysconf=/etc

如果提示缺少依赖,则使用yum安装如下依赖,依赖安装完之后再次配置安装目录

yum install gcc ;
yum install openssl-devel;
yum -y install libnl libnl-devel

(3)编译安装

make && make install

(4)进入解压目录,拷贝配置文件

cd到解压的包 /usr/soft/keepalived-2.1.5
cp /usr/soft/keepalived-2.1.5/keepalived/etc/init.d/keepalived      /etc/init.d
cp /usr/soft/keepalived-2.1.5/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
cp /usr/soft/keepalived/sbin/keepalived /usr/sbin/keepalived
mkdir /etc/keepalived
cp /usr/soft/keepalived-2.1.5/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf

(5)将KeepAlive添加到系统服务并启动

chkconfig --add keepalived
chkconfig keepalived on
service keepalived start

3、配置KeepAlived

编辑配置文件:我这边配置192.168.197.140为虚拟ip

vim  /etc/keepalived/keepalived.conf

下面是100机器上的配置:

global_defs {
   router_id LVS_DEVEL //标识本节点的字条串,通常为hostname
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER  //如果是备用,则为BACKUP
    interface eno16777736 //使用ifconfig获取
    virtual_router_id 51  
    priority 100  //优先级
    advert_int 1 //MASTER与BACKUP节点间同步检查的时间间隔,单位为秒
    authentication { //验证类型和验证密码
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.197.140  //虚拟ip
    }
}

virtual_server 192.168.197.140 80 { //监听端口
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.197.100 80 { //真实ip及端口
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            delay_before_retry 3
            nb_get_retry 3
        }
    }
}

配置之后,使用虚拟ip就可以直接访问nginx。

跟上述配置相同,我在110机器上的配置如下:

global_defs {
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface eno16777736
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.197.140
    }
}

virtual_server 192.168.197.140 80 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.197.110 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            delay_before_retry 3
            nb_get_retry 3
        }
   }
}

此时100机器为master,110机器为backup。

将100上的nginx停掉(也就是当前是master的):

会发现,无法访问,因为停掉nginx无法将备用机换成master,只有停掉100上的KeepAlived,110上的backup才会转成master。

下面把100上的KeepAlived停掉,就可以访问到110的内容了。

所以还需要自己写一个脚本去监测nginx存活状态,然后视情况停掉keepAlived,这样才会有高可用。