当前位置: 首页 > news >正文

Nginx反向代理实现负载均衡+Keepalive实现高可用

目录

实现负载均衡

实现高可用


 

实现负载均衡

Nginx的几种负载均衡算法:

  • 1.轮询(默认) 每个请求按照时间顺序逐一分配到下游的服务节点,如果其中某一节点故障,nginx 会自动剔除故障系统使用户使用不受影响。

  • 2.权重(weight) 在配置文件中对下游的服务节点指定权重值 weight, weight 值越大则被分配的评率越高,一般这种负载均衡,用于节点的配置情况不一样,有的可能配置高,有的配置低。

  • 3.ip_hash 对每个请求,针对 ip 进行 hash, 然后分配到后台节点,这样一来,同一 ip 会被固定分配到下游固定服务上。它能够暂时的解决集群环境中容器之间 session 共享的问题(因为session每次只能和一个人,一对一的记录,但是如果现在需要负载均衡就出现了一种一对多的情况,可以使用ip_hash实现一对一),但是不是解决的根本之道,只是权宜之策,我们试想,如果访问的好好的,家里的路由器被重启了,或者运营商分配给你的 ip 地址改变了,那么你再次访问的时候,新的 ip 就可能被分配到新的服务上,之前的 session 也就失效了。

  • 4.least_conn (最少连接调度算法) 最少连接调度算法,对下游服务中连接情况,优先选择连接数最少的服务分配。

  • 5.least_time (最小响应时间) 最小响应时间, 计算节点平均响应时间,然后取响应最快的那个,分配更高权重。

(1)首先我们一共需要三个主机

后端的两个主机用于apache服务:

window10:192.168.159.165kail:192.168.159.151

负载均衡设备nginx:

centos1:192.168.159.200

(2)配置window10

开启apache服务

新建一个网页并且编辑内容:

新建的网页:www/index.html
内容:
Hello My Ip add 192.168.159.165

访问结果

343bb77cca6047cdba3ce8d7daeeb5d9.png

(2)配置kail

开启apache服务

新建一个网页并且编辑内容:

网页地址:/var/html/index.html
网页内容:
Hello My Ip add 192.168.159.165

访问结果

c09e813555bd4a73865f1b368705808c.png

(3)nginx设备配置

进入 /etc/nginx/nginx.conf

vim /etc/nginx/nginx.conf

配置负载均衡:

upstream nginx_boot{
# 30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2   
server 192.168.159.151 weight=100 max_fails=2 fail_timeout=30s;
server 192.168.159.165 weight=100 max_fails=2 fail_timeout=30s;
# 这里的IP请配置成你WEB服务所在的机器IP
}
server {location / {root   html;        # 配置一下index的地址,最后加上index.ftl。        index  index.html index.htm index.jsp index.ftl;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 请求交给名为nginx_boot的upstream上        proxy_pass http://nginx_boot;}location ~ .*.(gif|jpg|jpeg|bmp|png|ico|txt|js|css){root   /usr/local/nginx/html/static;expires 7d;}
}

b4bc45bea37147dcad3015eb76bb59d8.png

现在可以尝试访问:

第一次:

35bc119fc4c6414da600a4b2e84fa3ec.png

第二次:

94495fe2bdaf4d93bc20d9f0ba091bc5.png

不断地尝试可以发现:始终是访问一次165然后再一次151,成功的实现了负载均衡!!!,并且权重和我们设置的也是一样的,当然也可以手动的修改权重

也可以将负载均衡的方式修改为轮询或者上面介绍的其他方式。

实现高可用

线上如果采用单个节点的方式部署Nginx,难免会出现天灾人祸,比如系统异常、程序宕机、服务器断电、机房爆炸、地球毁灭….哈哈哈,夸张了。但实际生产环境中确实存在隐患问题,由于Nginx作为整个系统的网关层接入外部流量,所以一旦Nginx宕机,最终就会导致整个系统不可用,这无疑对于用户的体验感是极差的,因此也得保障Nginx高可用的特性。

接下来则会通过keepalived的VIP机制,实现Nginx的高可用。 VIP并不是只会员的意思,而是指Virtual IP,即虚拟IP。

keepalived在之前单体架构开发时,是一个用的较为频繁的高可用技术,比如MySQL、Redis、MQ、Proxy、Tomcat等各处都会通过keepalived提供的VIP机制,实现单节点应用的高可用。

上面那个实验完成了,但是现在实现了负载均衡但是并没有实现高可用问题

需要实现高可用,那就需要增加一台nginx服务器

这里使用192.168.159.201当做另外一台nginx服务器

实现原理:(类似于VRRP)

  1. 需要在200和201这两台设备上都安装keepalive+nginx的环境

  2. keepLive虚拟出一个VIP

  3. 浏览器通过访问这个VIP来实现高可用

这里以192.168.159.200这台设备为了,下面是具体的过程:

(1)首先配置keepalive

//获取软件包
wget https://www.keepalived.org/software/keepalived-2.2.4.tar.gz
//解压
tar -zxvf keepalived-2.2.4.tar.gz
//进入该目录中后进行预编译
./configure
//编译
make/make install

(2)添加配置文件

vi keepalived.conf

bal_defs {  # 自带的邮件提醒服务,建议用独立的监控或第三方SMTP,也可选择配置邮件发送。notification_email {  root@localhost  }  notification_email_from root@localhost  smtp_server localhost  smtp_connect_timeout 30  # 高可用集群主机身份标识(集群中主机身份标识名称不能重复,建议配置成本机IP)  router_id 192.168.159.200
}  # 定时运行的脚本文件配置  
vrrp_script check_nginx_pid_restart {  # 之前编写的nginx重启脚本的所在位置  script "/soft/scripts/keepalived/check_nginx_pid_restart.sh"   # 每间隔3秒执行一次  interval 3  # 如果脚本中的条件成立,重启一次则权重-20  weight -20  
}  # 定义虚拟路由,VI_1为虚拟路由的标示符(可自定义名称)  
vrrp_instance VI_1 {  # 当前节点的身份标识:用来决定主从(MASTER为主机,BACKUP为从机)  state MASTER  # 绑定虚拟IP的网络接口,根据自己的机器的网卡配置  interface ens33   # 虚拟路由的ID号,主从两个节点设置必须一样  virtual_router_id 250 # 填写本机IP  mcast_src_ip 192.168.159.200  # 节点权重优先级,主节点要比从节点优先级高  priority 100  # 优先级高的设置nopreempt,解决异常恢复后再次抢占造成的脑裂问题  nopreempt  # 组播信息发送间隔,两个节点设置必须一样,默认1s(类似于心跳检测)  advert_int 1  authentication {  auth_type PASS  auth_pass 1111  }  # 将track_script块加入instance配置块  track_script {  # 执行Nginx监控的脚本  check_nginx_pid_restart  }  virtual_ipaddress {  # 虚拟IP(VIP),也可扩展,可配置多个。192.168.159.250  }  
}

(7)编写脚本

vim check_nginx_pid_restart.sh

//脚本内容:
#!/bin/sh  
# 通过ps指令查询后台的nginx进程数,并将其保存在变量nginx_number中  
nginx_number=`ps -C nginx --no-header | wc -l`  
# 判断后台是否还有Nginx进程在运行  
if [ $nginx_number -eq 0 ];then  # 如果后台查询不到`Nginx`进程存在,则执行重启指令  /soft/nginx/sbin/nginx -c /soft/nginx/conf/nginx.conf  # 重启后等待1s后,再次查询后台进程数  sleep 1  # 如果重启后依旧无法查询到nginx进程  if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then  # 将keepalived主机下线,将虚拟IP漂移给从机,从机上线接管Nginx服务  systemctl stop keepalived.service  fi  
fi

(8)为该脚本授权

chmod +x check_nginx_pid_restart.sh

(9)将一些文件拷贝到/etc下

mkdir /etc/keepalived
cp keepalived.conf /etc/keepalived/
cd /root/keepalived/keepalived/etc/init.d
cp keepalived /etc/init.d/
cd ../sysconfig
cp keepalived /etc/sysconfig/

(10)修改配置文件

vim /etc/keepalived/keeplive.conf
//修改后:
bal_defs {  # 自带的邮件提醒服务,建议用独立的监控或第三方SMTP,也可选择配置邮件发送。notification_email {  root@localhost  }  notification_email_from root@localhost  smtp_server localhost  smtp_connect_timeout 30  # 高可用集群主机身份标识(集群中主机身份标识名称不能重复,建议配置成本机IP)  router_id 192.168.159.200
}  # 定时运行的脚本文件配置  
vrrp_script check_nginx_pid_restart {  # 之前编写的nginx重启脚本的所在位置  script "/root//keepalived/keepalived/etc/keepalived/check_nginx_pid_restart.sh"   # 每间隔3秒执行一次  interval 3  # 如果脚本中的条件成立,重启一次则权重-20  weight -20  
}  # 定义虚拟路由,VI_1为虚拟路由的标示符(可自定义名称)  
vrrp_instance VI_1 {  # 当前节点的身份标识:用来决定主从(MASTER为主机,BACKUP为从机)  state MASTER  # 绑定虚拟IP的网络接口,根据自己的机器的网卡配置  interface ens33   # 虚拟路由的ID号,主从两个节点设置必须一样  virtual_router_id 250 # 填写本机IP  mcast_src_ip 192.168.159.200  # 节点权重优先级,主节点要比从节点优先级高  priority 100  # 优先级高的设置nopreempt,解决异常恢复后再次抢占造成的脑裂问题  nopreempt  # 组播信息发送间隔,两个节点设置必须一样,默认1s(类似于心跳检测)  advert_int 1  authentication {  auth_type PASS  auth_pass 1111  }  # 将track_script块加入instance配置块  track_script {  # 执行Nginx监控的脚本  check_nginx_pid_restart  }  virtual_ipaddress {  # 虚拟IP(VIP),也可扩展,可配置多个。192.168.159.250  }  
}

(11)设置开机自启

[root@centos111 keepalived]# chkconfig keepalived on
[root@centos111 keepalived]# systemctl daemon-reload
[root@centos111 keepalived]# systemctl start keepalived.service 
[root@centos111 keepalived]# systemctl enable keepalived.service 

 

fe92cabf462c42358e4d2ea84d67e4fd.png

(12)备服务器配置(201)--大致流程与200相同

这里就不详细演示了

注:从上图中可以明显看见虚拟IP已经成功挂载,但另外一台机器192.168.159.250并不会挂载这个虚拟IP,只有当主机下线后,作为从机的192.168.159.201才会上线,接替VIP。

e2997c477e6047a583a496dab7c0eb91.png

(13)测试

使用kail (192.168.159.151) ping 虚拟ip(192.168.159.250)、

2dd5f3e948c84b3493934a9afef5a4de.png

可以看到成功的ping通了

现在尝试关闭192.168.159.200服务器

nmcli con down ens33

然后再打开该服务器

nmcli con up ens33

查看192.168.159.201服务器

fe0d2d3c073e4641b7ae93338359c9da.png

可以发现192.168.159.250这个虚拟ip已经转到备服务器(192.168.159.201)这里了!

到此Nginx的负载均衡和高可用实验都全部完成!!

 

 

相关文章:

Nginx反向代理实现负载均衡+Keepalive实现高可用

目录 实现负载均衡 实现高可用 实现负载均衡 Nginx的几种负载均衡算法: 1.轮询(默认) 每个请求按照时间顺序逐一分配到下游的服务节点,如果其中某一节点故障,nginx 会自动剔除故障系统使用户使用不受影响。 2.权重…...

实用高效 无人机光伏巡检系统助力电站可持续发展

近年来,我国光伏发电行业规模日益壮大,全球领先地位愈发巩固。为解决光伏电站运维中的难题,浙江某光伏电站与复亚智能达成战略合作,共同推出全自动无人机光伏巡检系统,旨在提高发电效率、降低运维成本,最大…...

Django框架之csrf跨站请求

目录 一、csrf跨站请求伪造详解 二、csrf跨域请求伪造 【1】正常服务端 【2】钓鱼服务端 三、csrf校验 【介绍】 form表单中进行csrf校验: 【1】form表单如何校验 【2】ajax如何校验 四、csrf相关装饰器 【1】csrf_protect装饰器: 【…...

[系统移植] 移植主线Buildroot(2023.02-rc3)到RK3399

文章目录 一、编译环境二、Git环境三、克隆源代码四、编译源代码五、烧录固件六、系统启动一、编译环境 PC 机用的是 Ubuntu 18.04,执行以下命令安装必要工具: sudo apt install gcc build-essential bison flex gettext tcl sharutils libncurses-dev zlib1g-dev \ exube…...

自动语音识别 支持86种语言 Dragon Professional 16 Crack

从个体从业者到全球组织,文档密集型行业的专业人士长期以来一直依靠 Dragon 语音识别来更快、更高效地创建高质量文档,减少管理开销,以便他们能够专注于客户。了解 Dragon Professional v16 如何通过单一解决方案提高标准,为各个业…...

i社为什么不出游戏了?

I社,即国际知名的游戏公司,近来为何鲜有新游问世?曾经风靡一时的游戏开发者,如今为何陷入了沉寂?这其中的种种原因,值得我们深入剖析。 首先,I社近期的沉寂可能与其内部管理层的调整和战略规划…...

Harmony开发 eTs公共样式抽取

Harmony系统开发使用eTs开发过程中对于样式相同且重复使用的样式可以抽取成公共样式循环利用,类似于android的style样式。 import router from ohos.router import cryptoFramework from ohos.security.cryptoFramework; import prompt from system.prompt class L…...

Java中的方法

在Java中,方法是一个重要的概念,它用于组织和执行可重复使用的代码块。本文将详细介绍Java中方法的概念、定义和使用方法,以及一些常见的编程技巧和注意事项。 一、方法的概念 在Java中,方法是用来执行特定任务的代码块。它封装了…...

存算一体还是存算分离?谈谈数据库基础设施的架构选择

从一则用户案例说起 某金融用户问,数据库用服务器本地盘性能好还是外置存储好?直觉上,本地盘路径短性能应该更好。然而测试结果却出乎意料:同等中等并发压力,混合随机读写模型,服务器本地SSD盘合计4万 IOPS…...

go模版引擎的使用~~

go模板语句 以下是一些go语言模板引擎的一些简单知识和使用 基础语法 重要!!!: 模板在写动态页面的网站的时候,我们常常将不变的部分提出成为模板,可变部分通过后端程序的渲染来生成动态网页&#xff0…...

我们为什么要进行敏捷开发培训

敏捷开发是一种以人为核心、迭代、循序渐进的软件开发方法。它强调团队合作、客户需求和适应变化。进行敏捷开发培训其实有多种原因,我整理了一些,可以作为参考: 理解敏捷原则和实践: 敏捷开发不仅是一种方法论,更是一…...

【算法萌新闯力扣】:合并两个有序链表

力扣题目:合并两个有序链表 开篇 今天是备战蓝桥杯的第24天及算法村开营第2天。根据算法村的讲义,来刷链表的相关题目。今天要分享的是合并两个有序链表。 题目链接: 21.合并两个有序链表 题目描述 代码思路 通过创建一个新链表,然后遍历…...

BEV+Transformer架构加速“上车”,智能驾驶市场变革开启

BEVTransformer成为了高阶智能驾驶领域最为火热的技术趋势。 近日,在2023年广州车展期间,不少车企及智能驾驶厂商都发布了BEVTransformer方案。其中,极越01已经实现了“BEVTransformer”的“纯视觉”方案的量产,成为国内唯一量产…...

Java中的jvm——面试题+答案(JVM的一些高级概念、调优技巧、垃圾回收算法等)——第13期

当涉及到Java虚拟机(JVM)时,面试官可能涉及更深入的问题,涵盖性能调优、垃圾回收算法、类加载机制等方面。 什么是类加载机制?请解释类加载的过程。 答案: 类加载是将类的.class文件加载到内存中的过程&…...

Android修行手册-ViewPager定制页面切换以及实现原理剖析

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…...

Mycat实现读写分离

Mycat实现读写分离 Mycat支持MySQL主从复制状态绑定的读写分离机制。这里实现的也是基于MySQL主从复制的读写分离。 MySQL主从复制配置 首先要配置MySQL的主从复制,这里配置的是一主一次从。可以参考下面的文章。 https://blog.csdn.net/wsb_2526/article/detail…...

Ceph----CephFS文件系统的使用:详细实践过程实战版

CephFS 介绍 是一个基于 ceph 集群 且兼容 POSIX 标准的文件系统。 创建 cephfs 文件系统时 需要在 ceph 集群中添加 mds 服务,该服务 负责处理 POSIX 文件系统中的 metadata 部分, 实际的数据部分交由 ceph 集群中的 OSD 处理。 cephfs 支持以内核模块…...

python tkinter 使用(七)

python tkinter 使用(七) 本篇文章主要讲下tkinter 中的message 控件. Message控件可以用于在窗口中显示一段文本消息. 以下是个简单的例子: #!/usr/bin/python3 # -*- coding: UTF-8 -*- """Author: zhTime 2023/11/24 上午11:38 .Email:Describe: "…...

17. Python 数据库操作之MySQL和SQLite实例

目录 1. 简介2. 使用PyMySQL2. 使用SQLite 1. 简介 数据库种类繁多,每种数据库的对外接口实现各不相同,为了方便对数据库进行统一的操作,大部分编程语言都提供了标准化的数据库接口,用户不需要了解每种数据的接口实现细节&#x…...

Kafka-TopicPartition

Kafka主题与分区 主题与分区 topic & partition,是Kafka两个核心的概念,也是Kafka的基本组织单元。 主题作为消息的归类,可以再细分为一个或多个分区,分区也可以看作对消息的二次归类。 分区的划分为kafka提供了可伸缩性、水…...

python打卡day49

知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

【位运算】消失的两个数字(hard)

消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...