暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Nginx+KeepAlived实现高可用

上古伪神 2021-06-25
284

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,这样才会有高可用。










                    文章转载自上古伪神,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论