当前位置: 首页 > 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提供了可伸缩性、水…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来&#xf…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

LLMs 系列实操科普(1)

写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

Python Einops库:深度学习中的张量操作革命

Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...