Nginx+Keepalived实现服务的高可用

1.Keepalived高可用软件

    Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。

    keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual  Router  Redundancy Protocol(虚拟路由冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断地运行。所以,keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能。

2.Keepalived高可用故障切换转移原理

    Keepalived高可用服务对之间的故障切换转移,是通过VRRP来实现的。在keepalived服务工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用来告诉备Backup节点自己还活着。当主节点发生故障时,就无法发送心跳的消息了,备节点也因此无法继续检测到来自主节点的心跳了。于是就会调用自身的接管程序,接管主节点的IP资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源和服务,恢复到原来的备用角色。

  一般情况下,如果我们做小型项目,前端用一个nginx做反向代理即可,大概是这样的

 

  但是,作为互联网项目,纯2C的话必然需要做高可用,不仅后端的ServerN个,Nginx同样需要有N个,一主N备,当有一个服务器挂掉的时候,服务能瞬间切换到其他服务器,大概是这样的 

  下面就以上图为例,说明一下如何实现server的高可用。

  

  1、准备

  

  虚拟机两台,同样安装nginxkeepalived,最简单的安装方法

        yum -y install nginx

        yum -y install keepalived

        如果找不到安装到哪儿了,可以使用whereis nginx查看,这里不再赘述。

  

  网络划分如下

  

  名称                                       IP            虚拟IP            操作系统

  

  虚拟机1VM1) 172.17.1.150      172.17.1.160     centos7.5

  

  虚拟机2VM2) 172.17.1.151   172.17.1.160        centos7.5

  

  2、两台机器都要操作:关闭防火墙,修改nginx首页,启动nginx

  

  * 关闭防火墙

  

  systemctl stop firewalld.service #临时关闭,重启失效

  

  systemctl disable firewalld.service #禁止开机启动

  

  安装nginx

  

  [[email protected] ~]# yum install nginx

  

  修改nginx首页(两台机器分别操作)

  

  [[email protected] ~]# echo "yunweimao" > /usr/share/nginx/html/index.html

       [[email protected] ~]# echo "maoxiaopu" > /usr/share/nginx/html/index.html

  

  启动nginx

  

  [[email protected] ~]# service nginx restart

  

  报错:

  

  nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)

  

  nginx: configuration file /etc/nginx/nginx.conf test failed

  

  修改:

  

  [[email protected] ~]# vim /etc/nginx/conf.d/default.conf

  

  * 简单起见,我们认为每个nginx都是代理一个服务,只用nginx默认带的静态页作为测试,分别修改页面内容为"yunweimao"“maoxiaopu”

  

  * 启动nginx

  

  systemctl start nginx

  

  3、修改keepalived的配置文件

  

  主配置如下(默认配置文件:/etc/keepalived/keepalived.conf)

! Configuration File for keepalived

global_defs {

 #  notification_email {

 #    [email protected]

 #    [email protected]

 #    [email protected]

 #  }

 #  notification_email_from [email protected]

 #  smtp_server 192.168.200.1

 #  smtp_connect_timeout 30

   router_id LVS_DEVEL

 #  vrrp_skip_check_adv_addr

 #  vrrp_strict

 #  vrrp_garp_interval 0

 #  vrrp_gna_interval 0

}

vrrp_script chk_nginx {

        script "/etc/keepalived/nginx_check.sh"

        interval 2

        weight -20

}

vrrp_instance VI_1 {

    state MASTER # 标识为主服务

    interface eth0 #绑定虚拟机的IP

    virtual_router_id 51 # 虚拟路由id,和从机保持一致

    #mcast_src_ip 172.17.1.150  #本机ip

    priority 100 #权重,需要高于从机

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

   track_script {

                chk_nginx ## 执行 Nginx 监控的服务

        }

    virtual_ipaddress {

        172.17.1.160 #/32 brd 255.255.255.0 dev ens33 label ens33:vip #虚拟IP地址

    }

}

  

  从机配置(默认配置文件:/etc/keepalived/keepalived.conf

  

! Configuration File for keepalived

global_defs {

#   notification_email {

#     [email protected]

#     [email protected]

#     [email protected]

#   }

#   notification_email_from [email protected]

#   smtp_server 192.168.200.1

#   smtp_connect_timeout 30

   router_id dreamer1

#   vrrp_skip_check_adv_addr

#   vrrp_strict

#   vrrp_garp_interval 0

#   vrrp_gna_interval 0

}

vrrp_script chk_nginx {

        script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径

        interval 2 ## 检测时间间隔

        weight -20 ## 如果条件成立,权重-20

}

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 51

    mcast_src_ip 172.17.1.151 ## 本机 IP 地址 

    priority 90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

        track_script {

                chk_nginx ## 执行 Nginx 监控的服务

        }

    virtual_ipaddress {

        172.17.1.160

    }

}

  

  3、编写监测心跳脚本

  

  上面配置中可以看到有一个脚本文件:/etc/keepalived/nginx_check.sh

  

  查看nginx是否启动,如果没启动则启动,如果启动不起来,停掉keepalived服务,此时心跳断掉,服务转向另一个nginx

#!/bin/bash

counter=$(ps -C nginx --no-heading|wc -l)

if [ "${counter}" = "0" ]; then

    /usr/sbin/nginx

    sleep 2

    counter=$(ps -C nginx --no-heading|wc -l)

    if [ "${counter}" = "0" ]; then

        /etc/init.d/keepalived stop

    fi

fi

  

  4、测试

  

  * 启动172.17.1.150上的nginxkeepalive

  

  * 启动172.17.1.151上的nginxkeepalive

  

  * 访问虚拟IPhttp://172.17.1.160

  

  * 停掉172.17.1.150上的keepalive

  

[[email protected] ~]# service  keepalived stop

  * 重新启动172.17.1.150上的keepalive,又会回到yunweimao

[[email protected] ~]# service  keepalived start

关于运维学习、分享、交流,笔者开通了微信公众号【运维猫】,感兴趣的朋友可以关注下,欢迎加入,建立属于我们自己的小圈子,一起学运维知识。

女票从事平面设计这一块,需要设计海报,宣传册的也可以联系我,明码标价3元/1页。

有需要技术交流的小伙伴可以加我微信,期待与大家共同成长,本人微信: