『Apisix进阶篇』动态负载均衡:APISIX的实战演练与策略应用

news/2024/5/9 21:49:45/文章来源:https://blog.csdn.net/qq_34202873/article/details/137076187

🚀『Apisix系列文章』探索新一代微服务体系下的API管理新范式与最佳实践 【点击此跳转】


📣读完这篇文章里你能收获到

  • 🎯 掌握APISIX中多种负载均衡策略的原理及其适用场景。
  • 📈 学习如何通过APISIX的Admin API和Dashboard进行负载均衡配置和管理。
  • 🚀 了解APISIX在云原生环境中与服务发现系统的集成方式。
  • 🛠️ 探索APISIX的性能优化技巧和故障检测与转移机制,提高系统的稳定性和可靠性。

请添加图片描述

文章目录

  • 一、APISIX负载均衡基础
  • 二、负载均衡策略详解
    • 2.1 带权轮询(Weighted Round Robin, WRR)
    • 2.2 最少连接数(Least Connections)
    • 2.3 一致性哈希(Consistent Hashing)
    • 2.4 指数加权移动平均(Exponential Moving Average, EMA)
  • 三、动态负载均衡实战
    • 3.1 带权轮询算法演示
    • 3.2 配置示例
      • 3.2.1 Admin API应用
      • 3.2.2 Dashboard可视化操作
    • 3.3 云原生服务发现的集成
  • 四、负载均衡性能优化与故障转移
    • 4.1 性能优化
      • 4.1.1 缓存机制
      • 4.1.2 连接复用
      • 4.1.3 健康检查参数调整
      • 4.1.4 批量请求处理
    • 4.2 故障检测与快速故障转移
      • 4.2.1 主动健康检查
      • 4.2.2 被动健康检查
      • 4.2.3 快速故障转移
      • 4.2.4 优雅回退

一、APISIX负载均衡基础

Apache APISIX基于高性能的Nginx和OpenResty平台构建,通过Lua脚本实现灵活的业务逻辑。在负载均衡方面,APISIX通过定义Upstream来集中管理一组后端服务实例,然后在路由配置中引用对应的Upstream,实现请求的均衡分发。
每个Upstream内部可以设置多种负载均衡策略,且可以动态更新服务实例列表,无需重启服务就能实现配置变更的实时生效,这极大地提升了运维效率和系统的响应速度。

二、负载均衡策略详解

2.1 带权轮询(Weighted Round Robin, WRR)

  • 原理: 在传统的轮询算法基础上,带权轮询增加了权重的概念。每个上游服务器可以根据其处理能力或其他因素被赋予一个权重值。在调度请求时,不仅按照顺序分配,还考虑到服务器的权重比例,权重高的服务器会更频繁地接收请求。例如,如果服务器A的权重是2,而服务器B的权重是1,则在两次循环中,服务器A将会收到两次请求,而服务器B只会收到一次。
  • 应用场景: 当后端服务器性能差异较大,需要按照各自处理能力动态调整接收到的请求量时,带权轮询是一个理想的选择。

2.2 最少连接数(Least Connections)

  • 原理: 最少连接数算法会选择当前已建立连接数最少的上游服务器发送新的请求。这意味着每次调度都会检查所有服务器的活跃连接数,并将新的请求分配给活跃连接数最少的服务器,这样可以有效地均衡各服务器间的负载。
  • 应用场景: 对于长连接服务或者处理请求所需时间差异较大的服务来说,该算法有助于避免某些服务器因处理慢速请求而堆积过多连接,保持整体系统的均衡。

2.3 一致性哈希(Consistent Hashing)

  • 原理: 一致性哈希算法通过对客户端请求的特征(如请求URL、源IP地址或其他可定制的键值)进行哈希运算,将请求映射到一个虚拟环上,并根据上游服务器的位置选择最近的服务器响应请求。每个服务器也会在环上有一个或多个对应的哈希槽,这样在增加或移除服务器时,仅影响一小部分请求的分布,从而减少缓存失效和重新分布请求的成本。
  • 应用场景: 在分布式缓存系统或存储集群中,一致性哈希特别有用,因为它能较好地保持数据和服务实例之间的关联性,尤其是在集群规模发生变化时。

2.4 指数加权移动平均(Exponential Moving Average, EMA)

  • 原理: EMA算法基于过去一段时间内服务器响应时间和吞吐量的表现来进行动态负载均衡。它会给每个服务器分配一个基于历史性能指标计算得出的权重,并随着时间推移给予最近数据更高的权重。这样,近期表现更好的服务器将更有可能获得更多的新请求。
  • 应用场景: 在实时监测服务器性能并据此做出智能决策的环境中,EMA能够实现动态优化资源分配,尤其适合那些性能波动较大的服务,确保整体系统效能最优。

三、动态负载均衡实战

配置Apache APISIX实现不同负载均衡策略:可以通过修改APISIX的Upstream配置,选择合适的负载均衡算法。可以通过API接口或Apache APISIX Dashboard设置负载均衡策略类型和相关参数。

3.1 带权轮询算法演示

接下来以带权轮询算法讲解,传入的流量按照预定顺序轮流分配给一组服务器的其中一个。

  • 目标:创建一个具有两个上游服务的路由,并且启用负载均衡来测试在两个服务之间的切换情况。访问 /headers 将被转发到 httpbin.org 和 mock.api7.ai 这两个上游服务,并且会返回请求头。

3.2 配置示例

3.2.1 Admin API应用

  1. 创建一个upstream指向 httpbin.org及mock.api7.ai
curl http://127.0.0.1:9180/apisix/admin/upstreams  \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{"id": "upstream-load-balance-id","name": "upstream-load-balance",	"type":"roundrobin",					"pass_host": "node","scheme": "https","nodes": [										{"host": "httpbin.org","port": 443,"weight": 1},									{"host": "mock.api7.ai","port": 443,"weight": 1}]
}'

image.png

  1. 创建一个路由routes,绑定以上创建的upstream
curl -i "http://127.0.0.1:9180/apisix/admin/routes" \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{"id": "routes-load-balance-id","name": "routes-load-balance",	"uri": "/headers","upstream_id": "upstream-load-balance-id"			
}' 

image.png

  1. 负载均衡请求验证,访问:http://127.0.0.1:9080/headers

image.png
image.png

3.2.2 Dashboard可视化操作

  1. 创建一个upstream指向 httpbin.org及mock.api7.ai
  • 点击上游->创建->填写节点(注意此次验证端口需填443),协议选择HTTPs->下一步->提交

image.png
image.png

  1. 创建一个路由routes,绑定以上创建的upstream
  • 点击路由->创建->填写匹配路径->填写HTTP匹配方法->下一步->选择上游服务->下一步->提交

image.png
image.png
image.png

  1. 负载均衡请求验证,访问:http://127.0.0.1:9080/headers

image.png
image.png

3.3 云原生服务发现的集成

Apache APISIX完美兼容云原生环境,能够与Kubernetes、Consul等服务发现系统集成。当服务实例在Kubernetes集群中创建或销毁时,APISIX能够自动发现并同步最新的服务实例列表,进而调整负载均衡策略,确保服务的高可用性和可扩展性。
参考官方:https://apisix.apache.org/zh/docs/apisix/discovery/

四、负载均衡性能优化与故障转移

4.1 性能优化

Apache APISIX在设计时充分考虑了性能优化,其中的一些关键措施包括:

4.1.1 缓存机制

APISIX支持对一些静态资源或者常用API的缓存,减少对后端服务的频繁调用,降低网络延迟,提高整体性能。要开启对某个路径的静态资源缓存,可以通过路由级别配置缓存插件proxy-cache实现

curl http://localhost:9080/apisix/admin/routes/routes-cache-id \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{"uri": "/anything/*","plugins": {"proxy-cache": {"cache_zone": "static_cache","ttl": 3600,"cache_key": "$request_uri"}},"upstream": {"type": "roundrobin","nodes": {"httpbin.org:80": 1}}
}'

4.1.2 连接复用

APISIX利用Nginx的长连接特性,保持与后端服务的连接池,减少建立TCP连接的开销,提升高并发场景下的性能。

4.1.3 健康检查参数调整

通过合理设置健康检查间隔、超时时间、失败阈值等参数,既能确保及时发现和剔除故障节点,又能避免过度检查造成的性能损耗。

4.1.4 批量请求处理

APISIX支持批量处理请求,特别是在一致性哈希场景下,可以一次性完成多个请求的路由选择,降低CPU和内存的使用率。

4.2 故障检测与快速故障转移

4.2.1 主动健康检查

APISIX内置了主动健康检查机制,周期性地向后端服务发送探测请求,根据响应结果确定服务实例的健康状态。

4.2.2 被动健康检查

除了主动检查外,APISIX还能根据后端服务的实际响应情况来判定服务实例是否健康。例如,如果一段时间内请求失败次数超过阈值,则认为该实例异常。

4.2.3 快速故障转移

一旦发现后端服务实例出现故障,APISIX会立即停止向该实例发送请求,并根据负载均衡策略将流量迅速转移至其他健康的实例,保证服务的连续性。

4.2.4 优雅回退

在故障节点恢复后,APISIX还可根据配置策略,逐步将流量返回至该节点,实现负载均衡的平滑过渡和风险控制。

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

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

相关文章

Redis - list 列表

前言 列表类似于 Java 中的数组或者顺序表,在 Redis 中,可以对列表两端插⼊(push)和弹出(pop),还可以获取指定范围的元素列表、 获取指定索引下标的元素等。列表是⼀种⽐较灵活的数据结构&#…

16、OpenFeign和Sentinel集成实现fallback服务降级

注:本篇文章主要参考周阳老师讲解的cloud进行整理的! 1、需求说明 cloudalibaba-consumer-nacos-order83 通过OpenFeign调用 cloudalibaba-provider-payment9001 1、 83 通过OpenFeign调用 9001微服务,正常访问OK 2、 83 通过OpenFeign调用 …

【Redis教程0x01】入门:Windows下安装和启动Redis

什么是Redis? Redis 是互联网技术领域中使用最广泛的存储中间件,它是 Remote Dictionary Service 三个单词中加粗字母的组合。 Redis 以超高的性能、完美的文档、简洁的源码著称,国内外很多大型互联网公司都在用。它的版本更新非常的快&…

腾讯云2核2G服务器CVM S5和轻量应用服务器优惠价格

腾讯云2核2G服务器多少钱一年?轻量服务器61元一年,CVM 2核2G S5服务器313.2元15个月,腾讯云2核2G服务器优惠活动 txyfwq.com/go/txy 链接打开如下图: 腾讯云2核2G服务器价格 轻量61元一年:轻量2核2G3M、3M带宽、200GB月…

力扣-20 有效的括号详解 Java

目录 1.题目分析 2.基础知识储备 2.1 哈希表 2.2 栈的存取 3. 逻辑概要 4.源码 示例 1.题目分析 为了对比都是从内而外,一个个匹配,全部匹配成功即为有效字符 2.基础知识储备 2.1 哈希表 简单来说,keyvalue存储 ,通过key…

Go打造REST Server【二】:用路由的三方库来实现

前言 在之前的文章中,我们用Go的标准库来实现了服务器,JSON渲染重构为辅助函数,使特定的路由处理程序相当简洁。 我们剩下的问题是路径路由逻辑,这是所有编写无依赖HTTP服务器的人都会遇到的问题,除非服务器只处理一到…

基于Google云原生工程师的kubernetes最佳实践(三)

目录 三、集群管理 利用node affinity、taint等机制管理node 通过pod affinity/anti-affinity机制将pod分配到合适的node Node分级管理 从Qos角度将Pod分级 用namespace隔离不同的环境和用户 配置RBAC权限控制 1. 遵循最小权限原则 2. 使用 Role 和 ClusterRole 分离权…

Nuxt3(项目创建)

1.官方文档 Installation Get Started with Nuxt 2.版本要求 node版本>18.0,建议使用偶数版本 3.安装 可采用npx或pnpm,本人使用的pnpm进行安装,如果提示npx没有安装的话使用npm install -g npx安装即可。 // 安装npx npm install…

Python爬虫学习完整版

一、什么是爬虫 网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性,根据用户需求定向抓取相关网页并分析也成为如今主流的爬取策略。 1 爬虫可以做什么 你可以爬取网络上的的图片&#…

全国超市数据可视化仪表板制作

全国超市消费数据展示 指定 Top几 客户销费数据展示 指定 Top几 省份销费数据展示 省份销售额数据分析 完整结果

FFmpeg拉取RTSP流并定时生成10秒短视频

生成效果: 视频时长为10秒 生成格式为FLV 输出日志: 完整实现代码如下: 需要在Mac和终端先安装FFmpeg brew install ffmpeg CMake文件配置: cmake_minimum_required(VERSION 3.27) project(ffmpeg_open_stream) set(CMAKE_CXX_STANDARD 17)#头文件包目录 include_director…

IDEA 2023右下角无git分支显示解决

当你排除项目问题之后,可能就是idea配置问题了,需要在View -> Appearance -> Status Bar Widgets 中 把 git Branch 勾上。

6.windows ubuntu 子系统 测序数据质量控制。

上一个分享,我们对测序数据进行了质量评估,接下来我们需要对数据进行数据质量控制。 数据预处理(Data Preprocessing):包括去除接头序列(adapter trimming)、去除低质量序列(qualit…

jdk8中的Arrays.sort

jdk8中Arrays.sort 这里可以看到根据传入数组类型的不同,排序的算法是由区别的。 拆分解析 我们在平时引用的时候,一般只会传入一个数组,但是真正调用的时候,参数会进行补全。 public static void sort(int[] a) {DualPivotQui…

Lilishop商城(windows)本地部署【docker版】

Lilishop商城(windows)本地部署【docker版】 部署官方文档:LILISHOP-开发者中心 https://gitee.com/beijing_hongye_huicheng/lilishop 本地安装docker https://docs.pickmall.cn/deploy/win/deploy.html 命令端页面 启动后docker界面 注…

oracle docker安装

修改下载的Image的REPOSITORY和TAG属性 修改下载的Image的REPOSITORY和TAG属性&#xff1a;docker tag <IMAGE ID> <REPOSITORY NAME> docker tag 3fa112fd3642 aliyun/oracle_11g 参考网址 使用docker images时&#xff0c;可能会出现REPOSITORY和TAG均为none的镜…

网络工程师练习题6

网络工程师 综合题 计算并填写下表&#xff1a; TP地址191.23.181.13子网掩码255.255.192.0地址类型 &#xff08;1&#xff09;网络地址&#xff08;2&#xff09;直接广播地址&#xff08;3&#xff09;主机号&#xff08;4&#xff09;子网内的最后一个可用IP地址&#xf…

【高并发服务器 03】——epoll模型

epoll模型理论&#xff08;从select到epoll&#xff09; select select的算法时间复杂度略高&#xff0c;存在线性的性能下降问题&#xff08;需要遍历访问文件描述符&#xff09;。并且&#xff0c;受限于早期的内核资源的限制&#xff0c;select能够监视的文件描述符的数量…

探索智慧农业精准除草,基于高精度YOLOv8全系列参数【n/s/m/l/x】模型开发构建农田作物场景下杂草作物分割检测识别分析系统

智慧农业是未来的一个新兴赛道&#xff0c;随着科技的普及与落地应用&#xff0c;会有更加广阔的发展空间&#xff0c;关于农田作物场景下的项目开发实践&#xff0c;在我们前面的博文中也有很堵相关的实践&#xff0c;单大都是偏向于目标检测方向的&#xff0c;感兴趣可以自行…

鸿蒙网络开发学习:【ylong_http】

简介 ylong_http 构建了完整的 HTTP 能力&#xff0c;支持用户使用 HTTP 能力完成通信场景的需求。 ylong_http 使用 Rust 编写&#xff0c;为 OpenHarmony 的 Rust 能力构筑提供支持。 ylong_http 在 OpenHarmony 中的位置 ylong_http 向 OpenHarmony 系统服务层中的网络协…