百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Nginx+Keepalived实现Nginx高可用架构,告别单点故障

off999 2025-02-20 17:29 19 浏览 0 评论

在架构设计中,可以利用NGINX的反向代理和负载均衡实现后端应用的高可用性,同时我们还需要考虑Nginx的单点故障。真正做到架构高可用性。

问题

主要考虑以下几点:

1、Nginx服务因为意外现象挂掉

2、服务器宕机导致NGINX不可用


解决方案

目前主流的解决方案就是keepalived+nginx 实现nginx的故障转移,同时做好监控报警。在自动故障转移的同时能通知到相关的应用负责人检查相关应用,排查隐患,彻底解决问题。


VRRP协议

开始前先简单了解下vrrp协议。keepalived就实现了该协议来保证服务高可用:

在企业网当中,PC一般是需要使用"网关"来与外部网络进行通讯,这样如果网关出现了故障那么整一个子网的对外通讯都会被切断,VRRP的出现就能把这个问题很好地解决了,VRRP可以通过把多台设备(路由器、交换机、防火墙等)虚拟化成一台设备,然后通过配置虚拟IP地址作为网关就能实现对网关的备份(这虚拟IP地址是代表整个VRRP组内的所有设备),当其中一台设备出现故障之后,VRRP组内其他设备会通过某些机制来接替故障设备的工作。

如上图所示,SW7和SW8若配置了VRRP 那么SW7和SW8就是一个整体,其中一台出现故障都不会对业务造成很大的影响。

VRRP概念:

虚拟设备:由一个"主(Master)"设备和多个"备(Backup)"设备组成的一个虚拟网关。

主设备(Master):负责转发数据报文和周期性向备设备发送VRRP协议报文。

备设备(Backup):不负责转发数据报文,在Master设备发生故障的时候会通过选举形式成为新的Master设备,该角色会接收来自Master设备的VRRP报文并加以分析。

VRID:用来表示一个VRRP组。

虚拟IP:配置在虚拟设备上的虚拟IP地址,一个虚拟设备可以拥有一个或者多个虚拟IP地址。

IP地址拥有者:分配给虚拟设备的虚拟IP的真实拥有者(例如:分配个虚拟路由的IP为192.168.1.1,但是这个IP已经分配给物理接口G0/0/1这个接口那么这个接口就是"IP拥有者"),IP拥有者会直接跳过选举成为Master,并且是不可抢占的。

虚拟MAC地址:由虚拟设备生成的虚拟MAC地址,每一个虚拟设备都会自动生成一个虚拟MAC地址,这个MAC地址是用于虚拟设备处理ARP报文的。

优先级:用于表示物理设备的优先级,这个参数用于Master的选举,取值范围是1-254,这个有优先级有两个比较特殊的值,分别是0和255,优先级0是由原来Master设备发送的,这个优先级是声明此设备不再参与VRRP组。优先级为255的是IP拥有者的优先级,拥有这个优先级会直接成为Master。(优先级数值越低优先级则越高)

抢占模式:当Backup 设备接收到的VRRP报文通过分析得出当前Master设备的优先级低于Backup设备,则Backup设备会切换为Master设备。


高可用搭建

模拟环境:

序号

环境名称

IP地址

环境介绍

1

访问客户端1

10.151.4.63

PC,有Chrome等浏览器

2

nginx备+keepalived备

10.151.6.12

centos7.6 反向代理 nginx高可用备

3

nginx主+keepalived主

10.151.7.24

centos7.6 反向代理 nginx高可用主

4

web应用服务器

10.151.7.7

web应用

5

VIP

10.151.7.136


nginx服务和web应用是已经配置好的环境,这里就不介绍相关的配置。强烈建议关闭Firewalld和selinux服务

1、keepalived的安装

yum install -y keepalived


2、keepalived主(10.151.7.24

修改配置文件

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived


global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id nginx02 # router_id 唯一标识符
vrrp_skip_check_adv_addr
vrrp_stricti
vrrp_garp_interval 0
vrrp_gna_interval 0
}

#检测脚本,如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加,如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少,其他情况,维持原本配置的优先级,即配置文件中priority对应的值
#这样可以做到利用脚本检测业务进程的状态,并动态调整优先级从而实现主备切换
#优先级的范围在[1-254],注意如果要通过优先级实现主备切换的话
#在这里,检测nginx的脚本,发现nginx进程dump掉后,会在脚本中关闭keepalived服务,从而切换到备份节点
vrrp_script check_nginx {
????script "/etc/keepalived/nginx_check.sh" #nginx服务检查脚本
????interval 1 #每个1秒检测一次
????weight -2
}


vrrp_instance VI_1 {
state MASTER #如果不指定Master或者BACKUP,那priority最高的就是master
interface enp0s31f6 #网卡
virtual_router_id 52 #组播ID,通过224.0.0.18可以监听到现在已经存在的VRRP ID,最好不要跟现有ID冲突,主节点和备份节点vrid应该保持一致
priority 150 #主备的优先级priority,权重数字越大优先级就越高
advert_int 1 #发送组播包的间隔时间,默认为1秒,keepalive之间是通过组播地址224.0.0.18相互通信的
authentication { #这个是验证类型为PASS(明文),密码为hdtv。验证类型也可以选择IPSEC,但是官方是不推荐的
auth_type PASS
auth_pass 1111
}
track_script {
????check_nginx
????}


virtual_ipaddress {
10.151.7.136/22 #虚拟ip地址
}
}


启动服务【service keepalived start】

执行命令【ip add】观察网卡信息,可以发现在原来网卡enp0s31f6下面,增加了一个ip地址10.151.7.136/22

此时在别的机器上也能ping通该ip

3、keepalived备(10.151.6.12)

修改配置文件

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id nginx01 # router_id 唯一标识符
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}


vrrp_instance VI_1 {
state BACKUP #如果不指定Master或者BACKUP,那priority最高的就是master

interface enp5s0 #网卡
virtual_router_id 52 #组播ID,通过224.0.0.18可以监听到现在已经存在的VRRP ID,最好不要跟现有ID冲突 ,主节点和备份节点vrid应该保持一致
priority 50 #优先级priority,权重数字越大优先级就越高
advert_int 1 #发送组播包的间隔时间,默认为1秒,keepalive之间是通过组播地址224.0.0.18相互通信的

vrrp_script check_nginx {
????script "/etc/keepalived/nginx_check.sh" #nginx服务检查脚本
????interval 1 #每个1秒检测一次
????weight -2
}

track_script {
????check_nginx
????}

authentication { #这个是验证类型为PASS(明文),密码为hdtv。验证类型也可以选择IPSEC,但是官方是不推荐的
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.151.7.136/22 #虚拟ip地址,【虚拟ip实际上是利用arp协议,不断告诉路由器,这个ip属于我的这块网卡,这样路由器收到发往这个ip的请求时,就会转到这块网卡来,因为不是网卡实际绑定的ip,所以称为虚拟ip】
}
}

启动服务【service keepalived start】

执行命令【ip add】观察网卡信息,可以发现在原来网卡enp0s31f6下面,并没有增加了一个ip地址10.151.7.136/22。不紧张,不是装错了,是因为这是BACKUP节点,所以没有创建对应的虚拟ip。

查看服务状态【service keepalived status】也可以发现,备份节点的keepalive进入了BACKUP状态

高可用性测试

引起keepalived vip漂移的几个常见因素

  • 服务器宕机
  • 监听网卡故障
  • 某一服务或者其他事件触发 可以用脚本监听服务端口 服务 进程等

依次测试即可体验keeplive的vip漂移。

相关推荐

Python设计模式 第 13 章 中介者模式(Mediator Pattern)

在行为型模式中,中介者模式是解决“多对象间网状耦合”问题的核心模式。它就像“机场调度中心”——多个航班(对象)无需直接沟通起飞、降落时间,只需通过调度中心(中介者)协调,避免航班间的冲突与混乱...

1.3.1 python交互式模式的特点和用法

什么是Python交互模式Python交互模式,也叫Python交互式编程,是一种在Python解释器中运行的模式,它允许用户在解释器窗口中输入单个Python语句,并立即查看结果,而不需要编写整个程...

Python设计模式 第 8 章 装饰器模式(Decorator Pattern)

在结构型模式中,装饰器模式是实现“动态功能扩展”的核心模式。它就像“手机壳与手机的关系”——手机(原始对象)具备通话、上网等基础功能,手机壳(装饰器)可在不改变手机本身的前提下,为其新增保护、...

python设计模式 综合应用与实战指南

经过前面16章的学习,我们已系统掌握创建型模式(单例、工厂、建造者、原型)、结构型模式(适配器、桥接、组合、装饰器、外观、享元、代理)、行为型模式(责任链、命令、迭代器、中介者、观察者、状态、策略...

Python入门学习教程:第 16 章 图形用户界面(GUI)编程

16.1什么是GUI编程?图形用户界面(GraphicalUserInterface,简称GUI)是指通过窗口、按钮、菜单、文本框等可视化元素与用户交互的界面。与命令行界面(CLI)相比,...

Python 中 必须掌握的 20 个核心:str()

str()是Python中用于将对象转换为字符串表示的核心函数,它在字符串处理、输出格式化和对象序列化中扮演着关键角色。本文将全面解析str()函数的用法和特性。1.str()函数的基本用法1.1...

Python偏函数实战:用functools.partial减少50%重复代码的技巧

你是不是经常遇到这样的场景:写代码时同一个函数调用了几十次,每次都要重复传递相同的参数?比如处理文件时总要用encoding='utf-8',调用API时固定传Content-Type...

第2节.变量和数据类型【第29课-输出总结】

同学们,关于输出的知识点讲解完成之后,把重点性的知识点做一个总结回顾。·首先对于输出这一章节讲解的比如有格式化符号,格式化符号这里需要同学们额外去多留意的是不是百分号s格式化输出字符串。当然课上也说百...

AI最火语言python之json操作_python json.loads()

JSON(JavaScriptObjectNotation,JavaScript对象表示法)是一种开放标准的文件格式和数据交换格式,它易于人阅读和编写。JSON是一种常用的数据格式,比如对接各种第...

python中必须掌握的20个核心函数—split()详解

split()是Python字符串对象的方法,用于将字符串按照指定的分隔符拆分成列表。它是文本处理中最常用的函数之一。一、split()的基本用法1.1基本语法str.split(sep=None,...

实用方法分享:pdf文件分割方法 横向A3分割成纵向A4

今天在街上打印店给儿子打印试卷时,我在想:能不能,把它分割成A4在家中打印,这样就不需要跑到街上的打印店打印卷子了。原来,老师发的作业,是电子稿,pdf文件,A3格式的试卷。可是家中的打印机只能打印A...

20道常考Python面试题大总结_20道常考python面试题大总结免费

20道常考Python面试题大总结关于Python的面试经验一般来说,面试官会根据求职者在简历中填写的技术及相关细节来出面试题。一位拿了大厂技术岗SpecialOffer的网友分享了他总结的面试经...

Kotlin Data Classes 快速上手_kotlin快速入门

引言在日常开发中,我们常常需要创建一些只用来保存数据的类。问题是,这样的类往往需要写一堆模板化的方法:equals()、hashCode()、toString()……每次都重复,既枯燥又容易出错。//...

python自动化RobotFramework中Collections字典关键字使用(五)

前言介绍安装好robotframework库后,跟之前文章介绍的BuiltIn库一样BuiltIn库使用介绍,在“python安装目录\Lib\site-packages\robot\librarie...

Python中numpy数据分析库知识点总结

Python中numpy数据分析库知识点总结二、对已读取数据的处理②指定一个值,并对该值双边进行修改③指定两个值,并对第一个值的左侧和第二个值的右侧进行修改2.4数组的拼接和行列交换①竖直拼接(np...

取消回复欢迎 发表评论: