vlambda博客
学习文章列表

Nginx第五讲.高可用性--keepalived组件最实用指南


通过前几节课程,我们已经对nginx的基本配置,使用nginx能够实现的功能,包括反向代理、负载均衡、动静分离等进行了讲解。本次课程继续nginx入门的重要知识点,即nginx的高可用性配置。

众所周知,网络设备、服务器、应用、数据库等的规划建设时,必须要考虑软硬件系统的冗余度和高可用性,避免出现单点故障的情况,以下通过一张网络规划拓扑图,来展示网络设计规划中的冗余特性。

 

1

 

图中我们可以看到,网络设备都是采用双机部署的形式,那么即使通过双机部署,也仅仅是完成了物理意义上的冗余,如何做到双机主-备、主-主等形式对外提供服务,并且双机能够实时感知到对端的状态,从而在主机(本文均已主-备形式讨论)发生故障时,备机能够快速感知,并自动切换。这就需要不同的协议和配置来实现,针对不同设备、不同服务,所采用的主备高可用性技术也完全不同,以下列举常用的主备技术:

1.交换机:堆叠、M-LAG、VSS等;

2.路由器(网关):VRRP、HSRP等;

3.防火墙、负载均衡等:通过设备厂商自身的HA心跳线感知状态,通过设定好的协议或算法执行主备切换;

4.服务器:一般采用双机做网卡绑定bond的方式;

5.数据库:例如oracle数据库使用RAC做集群,mysql使用像keepalived、MHA等工具实现集群。

一、Nginx主备高可用性

通过nginx代理服务器,可以对后端的具体应用实现反向代理或负载均衡等功能,并且nginx可以对应用进行健康检查,将故障节点从负载均衡池中排出,从而实现对后端应用的高可用性保障。

但是,如果nginx服务器出现问题,则无法对外提供服务:

  

Nginx第五讲.高可用性--keepalived组件最实用指南

2

 

因此,我们要考虑到nginx服务的高可用性,采用主-备,或主-主的形式安装部署nginx服务,nginx的主备高可用性,依靠keepalived组件实现:

 

Nginx第五讲.高可用性--keepalived组件最实用指南

 3

 

主机不仅负责对后端两台服务进行健康检查,并且对外提供服务,接受客户端的请求,如图中红线所示;备机尽对后端服务进行健康检查,不对外提供服务,当主机故障发生切换时,才接管工作,如图中紫线所示:

  

Nginx第五讲.高可用性--keepalived组件最实用指南

4

 

客户端访问nginx服务器集群的虚拟IP。

 

二、配置高可用的准备工作

1.所需资源:

(1)需要两台nginx服务器:192.168.116.11和192.168.116.14;

(2)在两台服务器上安装nginx服务;

(3)在两台服务器上安装keepalived组件。

  

Nginx第五讲.高可用性--keepalived组件最实用指南

5

 

2.安装所需资源

1)Nginx具体安装过程,请查阅之前课程,结果如下:

  

Nginx第五讲.高可用性--keepalived组件最实用指南

6

 

2)通过yum方式安装keepalived组件:

命令:yum install keepalived,如图所示:

 

Nginx第五讲.高可用性--keepalived组件最实用指南 

7

 

安装完成后,路径为/etc/keepalived,并且生成配置文件,查看安装结果以及安装位置:

 

Nginx第五讲.高可用性--keepalived组件最实用指南 

8

 

三、高可用性配置

 

1.修改高可用keepalived组件的配置文件:

 

编辑keepalived.conf文件,修改相关参数如下,按照如下配置,只保留以下内容就可以

 

 

! Configuration File for keepalived

 

#全局定义

global_defs {

   router_id NodeA          #设备标识

   script_user root         #赋予检测脚本的权限

   enable_script_security   

}

 

 

vrrp_script chk_nginx

{

 

script "/etc/keepalived/nginx_check.sh"   #健康检查nginx状态的脚本文件


interval 2        #检测脚本执行的间隔时间


weight 2

}

 

#虚拟IP的配置

vrrp_instance VI_1 {     

    state MASTER      #服务器属性(主/备)

    interface ens33    #网卡名称

    virtual_router_id 50    #主备机的虚拟路由器ID即VRRP-ID必须相同

    priority 250      #主备机配置不同优先级,主机优先级>备机优先级

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

}

track_script {     #调用健康监测模板,一定要放在vip的配置下面

  chk_nginx

}

}

 

 

查看网卡信息:ifconfig,以及稍后查看连接情况:netstat

如果发现你的linux服务器没有ifconfig命令,则需要通过yum安装net-tools服务,以下是安装方法:

  

Nginx第五讲.高可用性--keepalived组件最实用指南

9

  

Nginx第五讲.高可用性--keepalived组件最实用指南

10

 

2.新建对nginx的健康检查脚本文件

 

该脚本文件的作用是,探测nginx进程是否存在,如果不存在,则尝试启动nginx,启动不成功后,则停止keepalived服务,让服务切换到备份服务器。

/etc/keepalived路径新建nginx_check.sh脚本文件如下:

 

 

#!/bin/bash    

if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]    

then    

/usr/local/nginx/sbin/nginx     #以上作用:如果进程没有nginx,则启动

sleep 5                         #间隔时间

if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]    

then    

killall keepalived              #以上作用:如果进程没有nginx,则停止keepalived

fi    

fi  

 

 

第一个大坑预警!!

做这个实验,一共卡了我半天的时间,这里是一个大坑,编辑完此脚本文件,尝试执行,发现有报错:


Nginx第五讲.高可用性--keepalived组件最实用指南

11

 

因为在dos/window下按一次回车键实际上输入的是“回车(CR)”和“换行(LF)”,而Linux/unix下按一次回车键只输入“换行(LF)”,所以修改的sh文件在每行都会多了一个CR,所以Linux下运行时就会报错找不到命令。

编辑文件,查看编码类型:

  

Nginx第五讲.高可用性--keepalived组件最实用指南


12

发现编码为dos:

 

Nginx第五讲.高可用性--keepalived组件最实用指南

13

 

将编码修改为unix即可解决问题:


Nginx第五讲.高可用性--keepalived组件最实用指南

 14

 

如果使用的linux系统没有查看进程的命令,则通过yum安装的方式,安装psmisc服务:

 

Nginx第五讲.高可用性--keepalived组件最实用指南

 15

 

3.启动服务

启动nginx以及keepalived:systemctl start keepalived.service

注意两台都需要启动。

  

Nginx第五讲.高可用性--keepalived组件最实用指南

16

 

通过log查看启动过程,以及vrrp选取主备的结果等:

  

Nginx第五讲.高可用性--keepalived组件最实用指南

17

 

通过log我们可以看到keepalived的启动过程,其实本质就是用的vrrp,至于vrrp什么原理,他其实是网络工程上,路由器或者交换机配置网关虚拟化的常用协议:

具体想了解的,可以私信我,我讲一下VRRP的原理。


第二个大坑预警!!

上述log第二个红圈部分,可以看到,keepalived配置文件中,所配置的nginx进程检测脚本没有执行成功。

研究了半天,真的是半天!!

反复对比过脚本是不是配错了,多个空格,少个括号什么的,然后上网搜。。。都是一些扯淡的答案,最后发现,还是我技艺不精,linux好久不用都生疏了。

查看检测脚本nginx_check.sh的属性,发现,他没有执行的权限,他竟然没有执行的权限!!

  

Nginx第五讲.高可用性--keepalived组件最实用指南

18

 

心态直接爆炸!!把权限修改后,再次重新启动,所有问题顺利解决,心情大好!

 

Nginx第五讲.高可用性--keepalived组件最实用指南

 19

 

可以看到,脚本已经帮我把nginx启动了。

 

 

Nginx第五讲.高可用性--keepalived组件最实用指南

 20

4.验证服务

 

Nginx第五讲.高可用性--keepalived组件最实用指南

 21

 

查看两台服务器的tcp连接情况,发现始终只有主节点192.168.116.11存在80端口的http连接,备份服务器则没有,使用命令:netstat -an | grep 192.168.116.15:80

 

Nginx第五讲.高可用性--keepalived组件最实用指南

22

 

5.双机切换验证

停止主服务器nginx服务:

 

Nginx第五讲.高可用性--keepalived组件最实用指南

 23

 

可以看到nginx服务还是启动状态,查看log,我们发现,是keepalived的探测脚本,在检测到nginx进程停止后,重新启动了nginx进程:

 

Nginx第五讲.高可用性--keepalived组件最实用指南

 24

 

这次直接把nginx铲了!

不过做之前,切记备份一下,或者做个快照,生产环境还是不要这样测试了。。

  

Nginx第五讲.高可用性--keepalived组件最实用指南

25

 

铲!

  

Nginx第五讲.高可用性--keepalived组件最实用指南

26

 

然后将nginx进程kill掉:

  

Nginx第五讲.高可用性--keepalived组件最实用指南

27

 

查看log,发现keepalived探测失效后,进程已经关闭:

 

 28

 

 

 29

 

经过不懈努力,终于大功告成,建议各位小伙伴,研究nginx之前,一定要打好linux的基础,要不然,学起来会很痛苦!!!

本系列nginx入门课程已经全部结束了,接下来会以一个网络工程师的角度,陪同大家学习python,希望继续关注和支持我,谢谢!

 

----------------------------------------------------------------

 

如果觉得不错,有所帮助的话,请记得点赞,转发!!!

 

我是CCIE_佟老板,一个让你沉溺于网络学习世界的好伙伴。