🚀『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应用
- 创建一个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}]
}'
- 创建一个路由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"
}'
- 负载均衡请求验证,访问:http://127.0.0.1:9080/headers
3.2.2 Dashboard可视化操作
- 创建一个upstream指向 httpbin.org及mock.api7.ai
- 点击上游->创建->填写节点(注意此次验证端口需填443),协议选择HTTPs->下一步->提交
- 创建一个路由routes,绑定以上创建的upstream
- 点击路由->创建->填写匹配路径->填写HTTP匹配方法->下一步->选择上游服务->下一步->提交
- 负载均衡请求验证,访问:http://127.0.0.1:9080/headers
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还可根据配置策略,逐步将流量返回至该节点,实现负载均衡的平滑过渡和风险控制。