Docker Nginx 负载均衡搭建(服务宕机-配置高可用) - 附(Python案例,其它语言同理)

news2024/9/21 14:39:54

目录

一 . 概要

1. 什么是负载均衡

2. 负载均衡有哪些优势?

(1)应用程序可用性

(2)应用程序可扩展性

(3)应用程序安全

(4)应用程序性能

3 . Nginx负载均衡调度策略

二 . 搭建案例

1. 创建项目目录

2. 创建三个py文件,启动三个服务

3. 编写 Nginx.conf

4. 编写 Dockerfile

三 . 镜像打包运行

四 . 个人小结


一 . 概要

1. 什么是负载均衡

负载均衡是在支持应用程序的资源池中平均分配网络流量的一种方法。现代应用程序必须同时处理数百万用户,并以快速、可靠的方式将正确的文本、视频、图像和其他数据返回给每个用户。为了处理如此高的流量,大多数应用程序都有许多资源服务器,它们之间包含很多重复数据。负载均衡器是位于用户与服务器组之间的设备,充当不可见的协调者,确保均等使用所有资源服务器。

2. 负载均衡有哪些优势?

目的:提升吞吐率, 提升请求性能, 提⾼高容灾

负载均衡可以定向和控制应用程序服务器与其访客或客户端之间的互联网流量。因此,它可提高应用程序的可用性、可扩展性、安全性和性能。

(1)应用程序可用性

服务器故障或维护可能会增加应用程序停机时间,使访客无法访问您的应用程序。负载均衡器可以通过以下方式提高您的系统的容错能力:自动检测服务器问题并将客户端流量重定向到可用服务器。您可以使用负载均衡来简化以下任务:

  • 运行应用程序服务器维护或升级而无需使应用程序停机
  • 为备份站点提供自动灾难恢复
  • 执行运行状况检查并防止出现可能导致停机的问题

(2)应用程序可扩展性

您可以使用负载均衡器在多个服务器之间智能地定向网络流量。您的应用程序可以处理数千个客户端请求,因为负载均衡会执行以下操作:

  • 防止任何一台服务器出现流量瓶颈
  • 预测应用程序流量,以便您可以在需要时添加或移除不同服务器
  • 为您的系统增加冗余度,使您可以放心扩展

(3)应用程序安全

负载均衡器具有多项内置的安全功能,可为您的互联网应用程序的安全保驾护航。它们是应对分布式拒绝服务攻击的有用工具,在这种攻击中,攻击者会用数百万个并发请求淹没应用程序服务器,从而导致服务器故障。负载均衡器还可以执行以下操作:

  • 监控流量并阻止恶意内容
  • 将攻击流量自动重定向到多个后端服务器,以最大限度减少影响
  • 通过一组网络防火墙路由流量,以提高安全性

(4)应用程序性能

负载均衡器通过增加响应时间和减少网络延迟来提高应用程序性能。它们可以执行诸如以下几项关键任务:

  • 在服务器之间平均分配负载以提高应用程序性能
  • 将客户端请求重定向到地理位置较近的服务器以减少延迟
  • 确保物理和虚拟计算资源的可靠性和性能

3 . Nginx负载均衡调度策略

调度算法概述
轮询逐一轮询,默认方式
weight加权轮询,weight越大,分配的几率越高
ip_hash按照访问IP的hash结果分配,会导致来自同一IP的请求访问固定的一个后台服务器
fair按后端服务器的响应时间来分配请求,响应时间短的优先分配。
url_hash按照访问URL的hash结果分配
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream backserver {
    server 192.168.0.14;
    server 192.168.0.15;
}
2、权重 weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

upstream backserver {
    server 192.168.0.14 weight=3;
    server 192.168.0.15 weight=7;
}
3、ip_hash( IP绑定)
上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。

我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream backserver {
    ip_hash;
    server 192.168.0.14:88;
    server 192.168.0.15:80;
}
4、fair(第三方插件)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream backserver {
    server server1;
    server server2;
    fair;
}
5、url_hash(第三方插件)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

upstream backserver {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
}

二 . 搭建案例

1. 创建项目目录

mkdir disaster_recovery

2. 创建三个py文件,启动三个服务

main1.py ,main2.py,main3.py  端口号分别为 4000,4001,4002

from flask_cors import CORS
from flask import Response, jsonify, Flask, request

# 建立flask实例
app = Flask(__name__)
# 注册CORS, "/*" 允许访问所有api
CORS(app, resources=r'/*')

# 获取 Flask 应用的根路径
root_path = app.root_path

# 解决中文乱码
app.config['JSON_AS_ASCII'] = False

@app.route('/', methods=['GET', 'POST', 'DELETE', 'PUT', 'CATCH'])
def Start():
    print('启动成功!')
    return jsonify({'code': 200,'msg':'测试'})

@app.route('/start1', methods=['GET', 'POST', 'DELETE', 'PUT', 'CATCH'])
def Start1():
    print('启动成功Start1!')
    return jsonify({'code': 200,'msg':'测试'})

# 调用实例对象
if __name__ == '__main__':
    app.run(debug=True,host='0.0.0.0', port=4000)

3. 编写 Nginx.conf

这里Nginx监听80端口,反向代理到本地系统(也可以使用其他服务器ip及端口)的4000,4001,4002端口

这里我们使用负载均衡方案:权重,如果有其他需求,可以按照其他的方案进行修改:

events {
    worker_connections 1024;
}

http {
    upstream servers_list {
        server 192.168.14.93:4000 weight=3;
        server 192.168.14.93:4001 weight=5;
        server 192.168.14.93:4002 weight=2;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://servers_list;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            # 服务宕机-配置
            proxy_connect_timeout 1;
        }
    }
}


# worker_connections,单个工作进程可以允许同时建立外部连接的数量  数字越大,能同时处理的连接越多
# 1.默认:worker_connections: 1024
# 2.调大:worker_connections: 100000,(调大到10万连接)
# upstream servers_list { ... }: 定义了一个名为backend的上游服务器组,包含了要负载均衡的后端服务器列表。
# server { ... }: 定义了一个NGINX服务器块。
# listen 80;: 监听80端口。
# location / { ... }: 定义了一个用于处理所有请求的位置块。
# proxy_pass http://servers_list;: 将请求转发到名为backend的上游服务器组中定义的服务器上,实现负载均衡。
# proxy_set_header: 设置HTTP请求头,确保后端服务器能够获取到客户端的真实IP等信息。
# 在这个配置中,NGINX会将来自客户端的请求负载均衡地转发到backend1.example.com、backend2.example.com和backend3.example.com中的一个。

 proxy_connect_timeout 1;

nginx提供了宕机容错机制,当一个后端服务器由于服务器故障、网络问题等原因不能提供服务时, nginx可以通过配置超时,超过超时时间以后,则跳过当前服务器,请求下一台服务器
在nginx.conf文件中 配置 proxy_connect_timeout 1  连接超过1s 则跳过当前轮询

4. 编写 Dockerfile

FROM yankovg/python3.8.2-ubuntu18.04

# 设置时区为中国标准时间
ENV TZ=Asia/Shanghai

# 安装NGINX
RUN apt-get update && apt-get install -y nginx

# 配置NGINX
COPY nginx.conf /etc/nginx/nginx.conf

# 暴露端口
EXPOSE 80

# 启动NGINX
CMD ["nginx", "-g", "daemon off;"]

这里基础镜像选择预装了Python3.8的Ubuntu18,兼具了小体积和可扩展的特性,添加apt-get的安装源后,安装Nginx。

最后,将nginx.conf拷贝到对应的配置路径中,启动Nginx服务。

三 . 镜像打包运行

在项目根目录的终端内运行命令打包镜像:

docker build -t . disaster_recovery_task

 首次编译等待小会,进行下载

[+] Building 0.5s (8/8) FINISHED                                                                         docker:default
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 1.25kB                                                                             0.0s
 => [internal] load metadata for docker.io/yankovg/python3.8.2-ubuntu18.04:latest                                  0.5s
 => [1/3] FROM docker.io/yankovg/python3.8.2-ubuntu18.04@sha256:811ad1ba536c1bd2854a42b5d6655fa9609dce1370a6b6d48  0.0s
 => [internal] load build context                                                                                  0.0s
 => => transferring context: 1.58kB                                                                                0.0s
 => CACHED [2/3] RUN apt-get update && apt-get install -y nginx                                                    0.0s
 => [3/3] COPY nginx.conf /etc/nginx/nginx.conf                                                                    0.0s
 => exporting to image                                                                                             0.0s
 => => exporting layers                                                                                            0.0s
 => => writing image sha256:72c9a8f86c0c14d77a51d5542b7877c2d5e8b12c72a12a4b7708f7e15263ed05                       0.0s
 => => naming to docker.io/library/disaster_recovery_task                                                          0.0s

What's Next?
  View summary of image vulnerabilities and recommendations → docker scout quickview

 打包成功后,运行命令查看镜像信息:

docker images

 可以看到镜像总大小不到1g:

REPOSITORY                          TAG              IMAGE ID       CREATED              SIZE
disaster_recovery_task              latest           72c9a8f86c0c   About a minute ago   784MB

 接着让我们来启动容器

docker run  -d  -p 81:80 --name disaster_recovery_task  disaster_recovery_task

 显示正在运行

CONTAINER ID   IMAGE                         COMMAND                   CREATED          STATUS          PORTS
         NAMES
2925cdd6a0f8   disaster_recovery_task        "nginx -g 'daemon of…"   33 seconds ago   Up 32 seconds   0.0.0.0:81->80/tcp       disaster_recovery_task

此时我们打开浏览器访问 http://127.0.0.1:81

  • 访问五次结果 
端口次数
40002
40012
40021

四 . 个人小结

nginx负载均衡是提高网站性能和可靠性的重要手段之一,合理配置和管理可以有效地提升网站的运行效率和用户体验,大家也可以尝试使用监控软件来对nginx以及服务进行宕机拉起

诚然,在我们程序开发中,大部分时间都是在书写代码,思考逻辑与数据清洗处理,但也要多了解其他东西,动手操作,增加自己的见识与理解,漫漫长路,学海无涯~(实践知真知)加油!

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

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

相关文章

openGauss学习笔记-226 openGauss性能调优-系统调优-配置LLVM-LLVM适用场景与限制

文章目录 openGauss学习笔记-226 openGauss性能调优-系统调优-配置LLVM-LLVM适用场景与限制226.1 适用场景226.2 非适用场景 openGauss学习笔记-226 openGauss性能调优-系统调优-配置LLVM-LLVM适用场景与限制 226.1 适用场景 支持LLVM的表达式 查询语句中存在以下的表达式支持…

uniapp开发微信小程序跳转到另一个小程序中

注意:一开始我的云上务工模块是单独的tabbar界面,但是小程序跳转好像不能直接点击tabbar进行,所以我将这里改成了点击首页中的按钮进行跳转 点击这里进行小程序跳转 目录 基础讲解 uniapp小程序跳转的两个方法 调用说明(半屏跳转…

【鸿蒙 HarmonyOS 4.0】ArkTS开发语言

一、背景 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。 二、基本语法 2.1、基本语法介绍 ArkTS的基本组成,资料来自…

企业安全建设工具推荐

全自动化挖洞,助力企业安全建设,一键实现域名扫描、IP 发现、端口扫描、服务识别、网站识别、漏洞探测、分析发现、合规检查。 使用方式: 录入目标企业名称即可开始使用 技术细节: 第一步:通过企业主体关联企业备案…

前端学习——JS学习

文章目录 1. 定义变量,关键字 var、let、const2. 定义变量,数据类型3. 数组变量的操作4. 对象的操作5. JSON 字符串 1. 定义变量,关键字 var、let、const 这里主要是对var、let做比较 /** 1. var存在变量提升、let不存在变量提升 **/ cons…

办理布基纳法索(Burkina Faso)ECTN认证

布基纳法索ECTN认证 一. 什么是布基纳法索(Burkina Faso)ECTN认证? 根据布基纳法索(Burkina Faso)签发于 11/07/2006法令编号 00557的规定: 自2006年11月07 日起所有出口至布基纳法索(Burkina Faso)的货…

ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(一)

在我们开始探索人工智能的世界时,了解如何与之有效沉浸交流是至关重要的。想象一下,你手中有一把钥匙,可以解锁与OpenAI的GPT模型沟通的无限可能。这把钥匙就是——正确的提示词(prompts)。无论你是AI领域的新手&#…

Vue响应式状态ref()与reactive()

1. ref()声明响应式状态 <template><!--在DOM元素调用变量时,不需要指定输出变量的value,因为Vue会帮你输出.value但是注意,这个帮助只会帮助顶级的ref属性才会被解包--><div>{{ count }}</div><div>{{ object }}</div><div>{{ arr…

vue Threejs实现任意画线(鼠标点击画线)

Threejs实现任意画线(鼠标点击画线) 鼠标左键单击添加点鼠标右键回退到上一个点,并继续画按住shift可以画平行于x轴或平行于z轴的线按Esc完成画线

如何把视频转换成mp4格式?总结4种转换方法【全】

随着视频在我们生活中的普及&#xff0c;我们常常需要将视频文件转换成不同的格式以适应不同的播放设备或应用场景。而MP4格式作为一种广泛兼容且高质量的视频格式&#xff0c;常常是人们的首选。因此&#xff0c;掌握将视频转换成MP4格式的方法变得至关重要。 在本文中&#…

消息队列MQ 保证消息不丢失(消息可靠性)

文章目录 概述RabbitMQ 怎么避免消息丢失&#xff08;可靠传输&#xff09;RocketMQ 怎么确保消息不丢失Kafka 怎么保证消息不丢失activeMQ 怎么避免消息丢失MQ 宕机了消息是否会丢失线上服务宕机时&#xff0c;如何保证数据100%不丢失吗&#xff1f;消息队列消息持久化 概述 …

如何做bug分析 ?bug分析什么 ? 为什么要做bug分析 ?

每当我们完成一个版本测试时&#xff0c;总会在测试报告中添加一些分析bug的指标 &#xff0c;主要用于分析在测试过程中存在的问题 。但是在分析的过程中你就可能遇到如下的问题 &#xff1a; 我应该分析那些指标呢 &#xff1f;每一个具体的指标该如何分析 &#xff1f;它能说…

软件性能测试和功能测试有何联系和区别?第三方软件检测机构简析

软件性能测试和功能测试是软件开发过程中非常重要的两个环节。从根本上说&#xff0c;它们都是为了保证软件质量和可靠性&#xff0c;但它们的目标和方法却有所不同。 软件性能测试是评估软件在特定负载下的性能表现&#xff0c;包括响应时间、吞吐量、并发能力等指标。它通过…

1.deeplabv3+网络结构及原理

这里的网络结构及原理可以看这篇博客&#xff0c;DeepLabV3: 在DeepLabV3基础上引入了Decoder_matlab deeplabv3resnet101-CSDN博客该博客翻译原论文解释得很清楚。 一、引言 语义分割的目标是为图像中的每个像素分配语义标签。在这项研究中&#xff0c;考虑了两种类型的神经网…

Flink ML 的新特性解析与应用

摘要&#xff1a;本文整理自阿里巴巴算法专家赵伟波&#xff0c;在 Flink Forward Asia 2023 AI特征工程专场的分享。本篇内容主要分为以下四部分&#xff1a; Flink ML 概况在线学习的设计与应用在线推理的设计与应用特征工程算法与应用 一、Flink ML 概况 Flink ML 是 Apache…

Python自动化UI测试之Selenium基础实操

1. Selenium简介 Selenium 是一个用于 Web 应用程序测试的工具。最初是为网站自动化测试而开发的&#xff0c;可以直接运行在浏览器上&#xff0c;支持的浏览器包括 IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Googl…

(done) 矩阵的对角化,以及是否可对角化的判断、还有对角化的本质。相似对角化计算过程

相似对角化 和 对角化 很大程度上是一回事 甚至判断两个矩阵的相似性&#xff0c;也跟对角化有很大关系 参考视频1&#xff1a;https://www.bilibili.com/video/BV1PA411T7b5/?spm_id_from333.788&vd_source7a1a0bc74158c6993c7355c5490fc600 参考视频2&#xff1a;http…

node 之 初步认识

思考&#xff1a;为什么JavaScript可以在浏览器中被执行 代执行的js代码——JavaScript解析引擎 不同的浏览器使用不同的JavaScript解析引擎 Chrome 浏览器 》 V8 Firefox浏览器 》OdinMonkey(奥丁猴&#xff09; Safri浏览器 》JSCore IE浏览器 》Chakra(查克拉&#xff09; e…

【算法分析与设计】

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位…

Vue 图片轮播第三方库 介绍

Vue图片轮播是一种在网页上以自动或手动方式展示图片的组件&#xff0c;常用于产品展示、网站banner等场景。有许多第三方库可以帮助Vue开发者轻松实现图片轮播功能。以下是一些流行的Vue图片轮播第三方库的介绍&#xff1a; 1. Vue-awesome-swiper - **简介**&#xff1a;V…