nginx keepalive 高可用原理和实操

文章目录

  • 前言
  • 一、nginx+keepalive搭建高可用服务方案?
  • 二、方案解析
    • 1.keepalive是什么
    • 2.nginx是什么
  • 三、keepalive与nginx环境安装
  • 四、高可用配置实例
  • 总结


前言


一、nginx+keepalive搭建高可用服务方案?

使用nginx-keepalived双机热备机制,vip主机可以进行漂移,这样当一台主机挂掉了,还有备用机可以使用,保证了服务的可靠性。
具体的vip漂移架构图,如下:
在这里插入图片描述

二、方案解析

1.keepalive是什么

Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。

健康检查和失败切换是keepalived的两大核心功能。
所谓的健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。

VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。

keepalived运行时,会启动3个进程,分别为:core(核心进程),check和vrrp

  • core:负责主进程的启动,维护和全局配置文件的加载;
  • check:负责健康检查
  • vrrp:用来实现vrrp协议

2.nginx是什么

Nginx是十分轻量级的HTTP服务器。Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发的,它已经在该站点运行超过两年半了。Igor Sysoev在建立的项目时,使用基于BSD许可。
Nginx凭借其稳定性、低资源消耗、简单配置和丰富的功能,从十多年前名不见经传的Web服务器软件,发展到如今能够跟Apache匹敌的地位。
1、作为Web服务器,Nginx处理静态文件、索引文件,自动索引的效率非常高
2、作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站运行速度
3、作为负载均衡服务器,Nginx既可以在内部直接支持Rails和PHP,也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡
4、在性能方面,Nginx是专门为性能优化而开发的,实现上非常注重效率。它采用内核Poll模型,可以支持更多的并发连接,最大可以支持对5万个并发连接数的响应,而且只占用很低的内存资源
5、在稳定性方面,Nginx采取了分阶段资源分配技术,使得CPU与内存的占用率非常低。Nginx官方表示,Nginx保持1万个没有活动的连接,而这些连接只占用2.5MB内存,因此,类似DOS这样的攻击对Nginx来说基本上是没有任何作用的
6、在高可用性方面,Nginx支持热部署,启动速度特别迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7x24小时不间断地运行

nginx采用多进程的模式,nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。
在这里插入图片描述

三、keepalive与nginx环境安装

安装keepalived

在线安装
yum install keepalived
修改/etc/keepalived/keepalived.conf配置
systemctl enable keepalived; 
systemctl start keepalived;

准备安rpm装包:
mkdir workspace & cd workspace
sudo yum install --downloadonly keepalived --downloaddir=.
rpm -ivh net-snmp-libs-5.7.2-49.el7_9.2.x86_64.rpm
rpm -ivh net-snmp-agent-libs-5.7.2-49.el7_9.2.x86_64.rpm
rpm -ivh keepalived-1.3.5-19.el7.x86_64.rpm
修改/etc/keepalived/keepalived.conf配置
systemctl enable keepalived; 
systemctl start keepalived;


下载keepalive(下载官网:https://www.keepalived.org/download.html)
cd /home/*****/workspace/
wget --no-check-certificate https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
tar xf  keepalived-2.2.7.tar.gz

cd keepalived-2.2.7
./configure
make -j3&& make install

sudo cp -rf keepalived/etc/keepalived/keepalived.conf.sample /usr/local/sbin/keepalived.conf
/usr/local/sbin/keepalived keepalived.conf


卸载keepalived
yum卸载
yum remove keepalived
或者rpm卸载
rpm -e net-snmp-libs-5.7.2-49.el7_9.2.x86_64
rpm -e net-snmp-agent-libs-5.7.2-49.el7_9.2.x86_64
rpm -e keepalived-1.3.5-19.el7.x86_64
rm -rf /etc/keepalived/*

安装nginx

1.安装nginx:
sudo rpm -Uvh  http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
sudo yum -y install nginx
sudo nginx -v 
sudo journalctl -u nginx -f

2.查看安装nginx结果:
rpm   -qa  | grep  nginx
3.升级
rpm  -Uvh  新版本软件nginx包 
4.卸载
命令:rpm   -e  nginx

安装报错解决:在这里插入图片描述

解决:
原因是Nginx 启动时 PID 文件并未生成,导致文件无法读取
/usr/lib/systemd/system/nginx.service新增 ExecStartPost=/bin/sleep 0.1
systemctl daemon-reload
systemctl restart nginx

四、高可用配置实例

/etc/keepalived/keepalived.conf如下
Keepalived的配置文件可以分为三块:
全局定义块:对整个 Keepalive 配置生效的,不管是否使用 LVS;
VRRP 实例定义块:是 Keepalived 的核心;
虚拟服务器(LVS)定义块:LVS 配置只在使用 Keepalived 来配置和管理 LVS 时才需要使用,如果仅仅使用 Keepalived做 HA,LVS 的配置完全是不需要的。
配置文件都是以块(block)形式组织的,每个块都在{和}包围的范围内。#和!开头的行都是注释。

简单实例:
主节点

! Configuration File for keepalived
global_defs {                                            #全局配置
        router_id   vplatform1                           #此处注意router_id为负载均衡标识,在局域网内应该是唯一的。
        script_user root
        enable_script_security
}

vrrp_script chk_service_state {
        script "/etc/keepalived/check_port.sh"
        #script "killall -0 nginx"
        interval 2                  #脚本检测的时间间隔,表示每n秒就检查一次,默认1秒就检测一次
        weight -20
        # rise 2		            #表示需要连续成功2次才能认为是成功的
        # fall 2		            #表示需要连续失败2次才能认为是失败的
        # timeout 2				    #脚本检测超时时间,超过这个时间则认为检测失败
}

vrrp_script avoid_brain_split {
        script "/usr/bin/ping -c 1 -w 1 10.20.50.254"
        interval 2                  #脚本检测的时间间隔,表示每n秒就检查一次,默认1秒就检测一次
        weight -20
        rise 2		                #表示需要连续成功2次才能认为是成功的
        fall 2		                #表示需要连续失败2次才能认为是失败的
        timeout 2				    #脚本检测超时时间,超过这个时间则认为检测失败
}

vrrp_instance VI_1 {                              #vrrp 实例部分定义,VI_1自定义名称
    state MASTER                                  #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
    interface eth0                                #网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
    virtual_router_id 51                          #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
    priority 100                                  #定义优先级,数字越大,优先级越高。
    advert_int 1                                  #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
    authentication {                              #设置验证类型和密码,两个节点必须一致
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {                           #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
        10.20.40.100/24
    }
    track_script {                                #脚本监控状态
        chk_service_state                         #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20
    }
    notify_master /etc/keepalived/slave2master.sh
    notify_backup /etc/keepalived/master2slave.sh
}

从节点

! Configuration File for keepalived
global_defs {                                   #全局配置
        router_id vplatform2                    #此处注意router_id为负载均衡标识,在局域网内应该是唯一的。
        script_user root
        enable_script_security
}

vrrp_script chk_service_state {
        script "/etc/keepalived/check_port.sh"
        #script "killall -0 nginx"
        interval 2                  #脚本检测的时间间隔,表示每n秒就检查一次,默认1秒就检测一次
        weight -20
        # rise 2		            #表示需要连续成功2次才能认为是成功的
        # fall 2		            #表示需要连续失败2次才能认为是失败的
        # timeout 2				    #脚本检测超时时间,超过这个时间则认为检测失败
}

vrrp_script avoid_brain_split {
        script "/usr/bin/ping -c 1 -w 1 10.20.50.254"
        interval 2                  #脚本检测的时间间隔,表示每n秒就检查一次,默认1秒就检测一次
        weight -20
        rise 2		                #表示需要连续成功2次才能认为是成功的
        fall 2		                #表示需要连续失败2次才能认为是失败的
        timeout 2				    #脚本检测超时时间,超过这个时间则认为检测失败
}

vrrp_instance VI_1 {                              #vrrp 实例部分定义,VI_1自定义名称
    state BACKUP                                  #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
    interface eth0                                #网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
    virtual_router_id 51                          #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
    priority 90                                   #定义优先级,数字越大,优先级越高。
    advert_int 1                                  #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
    authentication {                              #设置验证类型和密码,两个节点必须一致
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {                           #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
        10.20.40.100/24
    }
    track_script {                                #脚本监控状态
        chk_service_state                         #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20
    }
    notify_master /etc/keepalived/slave2master.sh
    notify_backup /etc/keepalived/master2slave.sh
}

checkport实例

#!/bin/bash
#检测nginx是否启动了
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then     
    systemctl start nginx
    sleep 1                                          
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        systemctl stop keepalived
    elif [ `ps -C keepalived --no-header |wc -l` -eq 0 ];then
        systemctl restart keepalived
    fi
fi

其中slave2master.sh、master2slave.sh以及checkport.sh一定要存在/etc/keepalived/下且权限要正确如下:

chmod 0744 /etc/keepalived/master2slave.sh
chmod 0744 /etc/keepalived/slave2master.sh
chmod 0644 /etc/keepalived/keepalived.conf
chmod 0644 /etc/keepalived/check_port.sh

在主机A上执行ip addr在这里插入图片描述
发现虚拟IP在主机A网卡eth0上,重启主机A,发现虚拟IP消失,在主机B上出现虚拟IP
在这里插入图片描述

如果主机A/B都配置了nginx,可以通过VIP:80访问nginx主页,即便关闭主机A,VIP会切换到主机B上,此时仍然可以访问nginx主页。从而实现了高可用方案。

总结

通过本文的讲解应该对高可用方案有了较深刻的理解,希望能够对你有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/20511.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【云计算•云原生】4.云原生之什么是Kubernetes

文章目录 Kubernetes概念Kubernetes核心概念集群podConfigMap Kubernetes架构master节点的组件worker节点组件 Kubernetes网络架构内部网络外部网络 k8s各端口含义 Kubernetes概念 K8S就是Kubernetes,Kubernetes首字母为K,末尾为s,中间一共有…

BEV(0)---Transformer

1 Transformer Transformer是一个Sequence to Sequence model,特别之处在于它大量用到了self-attention,替代了RNN,既考虑了Sequence的全局信息也解决了并行计算的问题。 1.1 self-attention: ①. 输入x1 ~ x4为一个sequence&…

MySQL基础(三十一)数据库其它调优策略

1 数据库调优的措施 1.1 调优的目标 尽可能 节省系统资源 ,以便系统可以提供更大负荷的服务。(吞吐量更大)合理的结构设计和参数调整,以提高用户操作 响应的速度 。(响应速度更快)减少系统的瓶颈&#xf…

服务网关Gateway

前言 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 破坏了服务无状态…

DJ6-4 文件存储空间的管理

目录 6.4.1 空闲表 1、存储空间的分配与回收 2、空闲表法的优缺点 6.4.2 空闲链表 1、空闲盘块链 2、空闲盘区链 6.4.3 位示图 1、位示图的表示 2、存储空间的分配 3、存储空间的回收 4、位示图法的优缺点 6.4.4 成组链接 1、空闲盘块的组织 plus 个人理解图…

上海亚商投顾:沪指震荡调整跌0.21% 两市成交金额不足8000亿

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪 三大指数今日震荡调整,上证50午后一度跌超1%,以保险为首的权重板块走低。军工股逆市大涨&a…

Python基本数据类型之一——set(集合)

Python基本数据类型之一——set(集合) 一、python集合定义 集合(set)是一个无序不重复元素的序列。基本功能是进行成员关系测试和删除重复元素。 二、创建方式 在Python中,创建集合有两种方式: 一种是用一对大括号将多个用逗号分隔的数据括起来。 另一种…

【周末闲谈】超越ChatGPT?科大讯飞星火认知大模型

个人主页:【😊个人主页】 系列专栏:【❤️周末闲谈】 ✨第一周 二进制VS三进制 ✨第二周 文心一言,模仿还是超越? ✨第二周 畅想AR 文章目录 前言星火名字的由来科大讯飞星火落地应用演示赶超ChatGPT的底气在哪里?“硬…

如何使用sbvadmin进行私有化部署的代码开发

前言 本文主要讲述如何使用sbvadmin进行私有化部署的代码开发,这里我们用的私有化仓库是gitee,当然你也可以用自己搭建的gitlab来做,原理差不多。 一、新建仓库 1.后端api 导入后端仓库:https://github.com/billyshen26/sbvadmi…

搭建Redis主从集群+哨兵+代理predixy

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Redis是什么?二、搭建Redis集群步骤1.环境和版本2.Redis 安装部署3.主从同步配置4.哨兵模式配置5.代理predixy配置 总结 前言 提示&#xff1a…

SpringSecurity框架学习与使用

SpringSecurity框架学习与使用 SpringSecurity学习SpringSecurity入门SpringSecurity深入认证授权自定义授权失败页面权限注解SecuredPreAuthorizePostAuthorizePostFilterPreFilter 参考 SpringSecurity学习 SpringSecurity入门 引入相关的依赖,SpringBoot的版本…

R语言 | 数据框

目录 一、认识数据框 7.1 建立第一个数据框 7.2 验证与设定数据框的列名和行名 二、认识数据框的结构 三、获取数据框内容 3.1 一般获取 3.2 特殊字符$ 3.3 再看取得的数据 四、使用rbind()函数增加数据框的行数据 五、使用cbind()函数增加数据框的列数据 5.1 使用$符号…

超星学习通小助手多线程工具Python

话不多说,直接开始,不会安转的直接使用后面两款,下载直接打开exe运行 第一款:网课小助手python,需要自行安装Python环境(支持Windows、Mac、Linux各种环境) https://wwiv.lanzoul.com/ifVrC0vk…

时序预测 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元时间序列预测

时序预测 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元时间序列预测 目录 时序预测 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元时间序列预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 基于贝叶斯(bayes)优化卷积神经网络-门控循环单元(CNN-GR…

数据库设计与前端框架

数据库设计与前端框架 学习目标: 理解多租户的数据库设计方案 熟练使用PowerDesigner构建数据库模型理解前端工程的基本架构和执行流程 完成前端工程企业模块开发 多租户SaaS平台的数据库方案 多租户是什么 多租户技术(Multi-TenancyTechnology&a…

力扣sql中等篇练习(二十一)

力扣sql中等篇练习(二十一) 1 最大数量高于平均水平的订单 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 # Write your MySQL query statement below WITH t1 as (SELECT order_id,avg(quantity) AquantityFROM OrdersDeta…

GEE:如何进行对MOD09GA数据集进行水体/云掩膜并计算NDVI将其导出至云盘?

目录 01 为什么用GEE而不是传统的下载ENVIArcGIS? 02 操作详解 01 为什么用GEE而不是传统的下载ENVIArcGIS? 由于地理空间数据云中缺少2015年10月份的NDVI月合成影像,于是查看了地理空间数据云的NDVI数据集处理的一些介绍如下(地理空间数据…

什么是SpringBoot自动配置

概述: 现在的Java面试基本都会问到你知道什么是Springboot的自动配置。为什么面试官要问这样的问题,主要是在于看你有没有对Springboot的原理有没有深入的了解,有没有看过Springboot的源码,这是区别普通程序员与高级程序员最好的…

【C++】8.编译:CMake工具入门

😏*★,*:.☆( ̄▽ ̄)/$:*.★* 😏这篇文章主要介绍CMake工具的入门使用。————————————————学其所用,用其所学。——梁启超————————————————— 欢迎来到我的博客,一起学习知识…

【前端客栈】使用CSS实现畅销书排行榜页面

📬📫hello,各位小伙伴们,我是小浪。大家都知道,我最近是在更新各大厂的软件测试开发的面试真题,也是得到了很大的反馈和好评,几位小伙伴也是成功找到了测开的实习,非常不错。如果能前…