nginx keepalive 高可用原理和实操

news2024/11/19 4:22:15

文章目录

  • 前言
  • 一、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主页。从而实现了高可用方案。

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java-锁相关

线程不安全的原因 1.调度器随机调度,抢占式执行(无能为力) 举个例子 有一个int变量 叫count 就俩线程同时count一万次 结果应该为两万 可多次运行程序 这结果每次都不一样(而且小于2w) 是为什么呢 因为count这行代码是分三步运行的 load 把数据读到cpu add 在cpu寄存器实现加法…

一、计算机系统基础

// 本章节内容根据下列代码的生命周期来讲解计算机系统的各个部分 hello.c #include <stdio.h>int main {printf("hello, world\n");return 0; }文章目录 1.1信息 位 上下文1.2程序的编译过程1.3系统的硬件组成1.4运行hello程序1.5高速缓存1.6操作系统管理硬…

小程序用什么开发?

近年来&#xff0c;随着智能手机的普及和移动互联网的发展&#xff0c;小程序成为了一种备受关注的新型应用。那么&#xff0c;小程序用什么开发呢&#xff1f; 首先&#xff0c;小程序可以使用多种技术进行开发&#xff0c;其中比较流行的有两种方式&#xff1a;一种是借助微…

( 背包问题) 1049. 最后一块石头的重量 II ——【Leetcode每日一题】

❓1049. 最后一块石头的重量 II 难度&#xff1a;中等 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x &…

尾调用优化

尾调用优化 最近遇到一个堆栈溢出的问题&#xff0c;分析后发现可收敛为递归边界问题。结合“红宝书”中相关内容和ES6规范中的一些优化机制&#xff0c;整理记录如下。 前言 程序运行时&#xff0c;计算机会为应用程序分配一定的内存空间。应用程序会自行分配所获得的内存空…

SpringBoot @JsonProperty + @JsonMixin注解 实现返回json数据key的转换

参考资料 Springboot 一个注解搞定返回参数key转换 【实用】Spring Boot 2.7新特性&#xff1a;JsonMixin 目录 一. 需求二. 前期准备三. 解决方式一: JsonProperty注解三. 解决方式二: JsonProperty JsonMixin注解3.1 方式1 混入单个类3.1.1 创建一个被JsonMixin注解修饰的抽…

ChatGPT初学者最佳实践

2022年11月底&#xff0c;ChatGPT引爆了新一轮AI的革命&#xff0c;也让人们意识到AI真的能够大幅度提高人们的工作效率&#xff0c;甚至有人担心自己的工作会因为AI不保。这种居安思危的意识是正确的&#xff0c;但是正如锛凿斧锯的出现&#xff0c;并没有让木匠这个行业消失&…

音频格式及转换代码

音频信号的读写、播放及录音 python已经支持WAV格式的书写&#xff0c;而实时的声音输入输出需要安装pyAudio(http://people.csail.mit.edu/hubert/pyaudio)。最后我们还将使用pyMedia(http://pymedia.org)进行Mp3的解码和播放。 音频信号是模拟信号&#xff0c;我们需要将其…

纯前端绘制的下雨效果

先上效果&#xff1a; 再上代码&#xff1a; <!--黏糊糊的菜单--> <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><meta name"viewport" content"widt…

Golang笔记:使用os.Args和flag包编写命令行界面(CLIs)

文章目录 目的os.ArgsflagFlagSet总结 目的 命令行界面&#xff08;Command-line Interfaces&#xff09;是比较常用的一种软件形式。对于大部分开发运维人员来说很多时候CLIs可能比图形界面更加方便。软件开发时也经常会有需要开发命令行界面形式软件的情况&#xff0c;使用G…

Maven基础篇

Maven基本概念 Maven是什么 maven的本质是一个项目管理工程&#xff0c;将项目开发和管理过程抽象成一个项目对象模型&#xff08;POM&#xff09; POM&#xff08;Project Object Model&#xff09;&#xff1a;项目对象模型 作用 项目构建&#xff1a;提供标准的、跨平台…

什么是Selenium?如何使用Selenium进行自动化测试

目录 什么是 Selenium&#xff1f; Selenium 的优势是什么? 软件测试的需要 手动测试的挑战 自动化测试胜过手动测试 Selenium 对比 QTP 和 RFT Selenium 工具套件 Selenium 有哪些组件? Selenium RC &#xff08;远程控制&#xff09; Selenium IDE&#xff08;集成…

MIT6824——lab2(实现一个Raft库)的一些实现,问题,和思考

MIT 6824 关于lab2的实现&#xff0c;由于开源许可的问题&#xff0c;代码暂时不开源&#xff0c;下面是自己在实现过程中的思路&#xff0c;遇到的问题&#xff0c;以及总结 1 总结 1.1 raft整个流程 应用程序&#xff1a;kv数据库启动raft库&#xff0c;选举leader&#xf…

跳槽前,把自己逼成卷王...

前段时间席卷全互联网行业的内卷现象&#xff0c;想必有不少人都深陷其中。其实刚开始测试行业人才往往供不应求&#xff0c;而在发展了十几年后&#xff0c;很多人涌入这个行业开始面对存量竞争。红利期过去了&#xff0c;仅剩内部争夺。 即便如此&#xff0c;测试行业仍有许…

AspNetCore中的配置文件详解

1 配置文件 程序开发中&#xff0c;有些信息是要根据环境改变的&#xff0c;比如开发环境的数据库可能是本地数据&#xff0c;而生产环境下需要连接生产数据库&#xff0c;我们需要把这些信息放到程序外面&#xff0c;在程序运行时通过读取这些外部信息实现不改变程序代码适应…

计算机图形学-GAMES101-8

引言 着色是针对某一个点(片段)的应用&#xff0c;这里需要考虑着色的频率。  漫反射项代表光向四面八方均匀的反射出去&#xff0c;和观察方向无关。  Blinn-Phong反射模型结构如下&#xff1a; ) 一、Blinn-Phong模型 &#xff08;1&#xff09;Specular 什么时候才能看到…

SpringBoot实操篇1

一、工程打包与运行&#xff08;windows版&#xff09; 在浏览器中就可以访问到了&#xff0c;此时IDEA并没有启动。服务器就是命令行窗口。 跳过测试&#xff1a;可以看到多了很多数据&#xff0c;是因打包的时候将功能测试了一遍。在IDEA中可以关掉。 注意&#xff1a;必须…

nginx+php+mysql安装以及环境的搭建

目录 一、nginx的安装 二、php的下载安装 1.进入到/usr/local/下&#xff0c;下载php的安装包 2.解压 3.进入到php-8.2.6下&#xff0c;安装需要的依赖包 4.预编译php 5.编译 6.为php提供配置文件 7.为php-fpm提供配置文件 8.添加用户和用户组 9.修改php-fpm.conf配置…

JavaScript全解析-this指向

this指向&#xff08;掌握&#xff09; ●this 是一个关键字&#xff0c;是一个使用在作用域内的关键字 ●作用域分为全局作用域和局部作用域&#xff08;私有作用域或者函数作用域&#xff09; 全局作用域 ●全局作用域中this指向window 局部作用域 ●函数内的 this, 和 函…

OS之作业调度算法

目录 一、基本概念 二、先来先服务算法(FCFS) 三、短作业算法(SJF/SPF) 四、轮转调度算法(RR) 五、优先级调度算法 六、多级反馈队列调度算法 一、基本概念 T(周转)T(完成)-T(到达) 二、先来先服务算法(FCFS) 不利于短作业&#xff0c;非抢占式算法 算法思想&#xff…