Nginx高可用——keepalived组件实用指南

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

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

Nginx高可用——keepalived组件实用指南_第1张图片

图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张图片

图2

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

Nginx高可用——keepalived组件实用指南_第3张图片

图3

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

Nginx高可用——keepalived组件实用指南_第4张图片

图4

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

综上所述,nginx的主备高可用性需要:(1)两台nginx服务器;(2)keepalived组件;(3)对外提供服务的虚拟IP地址。

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

1.所需资源:

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

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

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

Nginx高可用——keepalived组件实用指南_第5张图片

图5

2.安装所需资源

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

Nginx高可用——keepalived组件实用指南_第6张图片

图6

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

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

Nginx高可用——keepalived组件实用指南_第7张图片

图7

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

Nginx高可用——keepalived组件实用指南_第8张图片

图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 {

192.168.116.15/24 #对外服务的VRRP虚拟IP地址

}

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

chk_nginx

}

}

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

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

Nginx高可用——keepalived组件实用指南_第9张图片

图9

Nginx高可用——keepalived组件实用指南_第10张图片

图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

第一个大坑预警!!

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

图11

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

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

Nginx高可用——keepalived组件实用指南_第11张图片

图12

发现编码为dos:

Nginx高可用——keepalived组件实用指南_第12张图片

图13

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

Nginx高可用——keepalived组件实用指南_第13张图片

图14

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

Nginx高可用——keepalived组件实用指南_第14张图片

图15

3.启动服务

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

注意两台都需要启动。

Nginx高可用——keepalived组件实用指南_第15张图片

图16

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

Nginx高可用——keepalived组件实用指南_第16张图片

图17

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

两台设备,通过比较优先级,选取主设备,并且将虚拟出来的地址应用在这台主设备上,通过双方HA的探测,感知对方状态。

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

第二个大坑预警!!

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

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

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

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

Nginx高可用——keepalived组件实用指南_第17张图片

图18

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

Nginx高可用——keepalived组件实用指南_第18张图片

图19

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

查看网卡生成的虚拟ip地址:192.168.116.15:

Nginx高可用——keepalived组件实用指南_第19张图片

图20

4.验证服务

通过浏览器访问虚拟地址,http://192.168.116.15,可以看到能够正常打开nginx网页:

Nginx高可用——keepalived组件实用指南_第20张图片

图21

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

Nginx高可用——keepalived组件实用指南_第21张图片

图22

5.双机切换验证

停止主服务器nginx服务:

Nginx高可用——keepalived组件实用指南_第22张图片

图23

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

Nginx高可用——keepalived组件实用指南_第23张图片

图24

这次直接把nginx铲了!

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

Nginx高可用——keepalived组件实用指南_第24张图片

图25

铲!

Nginx高可用——keepalived组件实用指南_第25张图片

图26

然后将nginx进程kill掉:

图27

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

Nginx高可用——keepalived组件实用指南_第26张图片

图28

再次打开网页http://192.168.116.15,发现正常访问,查看备份服务器192.168.116.16,看到vrrp虚地址,以及http连接均切换到了该服务器:

Nginx高可用——keepalived组件实用指南_第27张图片

图29

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

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

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

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

你可能感兴趣的:(nginx,运维,高可用)