配置上游慢启动
新的应用实例在承接正常流量份额前,可能需要一定时间预热缓存或初始化连接。上游慢启动会逐步增加新节点的有效负载均衡权重,同时由现有节点继续处理请求。
慢启动改变的是流量分配,而不是请求总速率。仅含一个节点的上游仍会接收全部请求。如果所有可用节点都是新节点,这些节点仍会共同处理全部流量。
前置要求
启动示例上游服务
将 GATEWAY_CONTAINER 设置为正在运行的 APISIX 容器。将该容器和两个 echo 服务器连接到专用网络:
export GATEWAY_CONTAINER=replace-with-apisix-container-name
docker network create apisix-slow-start-net
docker network connect apisix-slow-start-net "$GATEWAY_CONTAINER"
docker run -d --name slow-start-existing --hostname existing \
--network apisix-slow-start-net jmalloc/echo-server:v0.3.7
docker run -d --name slow-start-new --hostname new \
--network apisix-slow-start-net jmalloc/echo-server:v0.3.7
服务器会在响应中标识自身。两个服务器均已运行,但最初只有现有服务器属于该上游。
创建上游和路由
创建包含一个节点、预热窗口为 60 秒的上游:
curl "http://127.0.0.1:9180/apisix/admin/upstreams/slow-start" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"type": "roundrobin",
"nodes": {
"slow-start-existing:8080": 100
},
"warm_up_conf": {
"slow_start_time_seconds": 60,
"min_weight_percent": 10
}
}'
创建引用该上游的路由:
curl "http://127.0.0.1:9180/apisix/admin/routes/slow-start" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"uri": "/slow-start",
"upstream_id": "slow-start"
}'
添加第二个节点前发送请求,并确认响应标识为 existing:
curl "http://127.0.0.1:9080/slow-start"
请在添加第二个节点前发送此请求,使 APISIX 将现有节点记录为已完成预热。如果在首次请求前就配置两个节点,APISIX 会将二者都视为初始成员,不会让其中一个节点相对另一个逐步提升权重。
添加节点并观察慢启动
添加配置权重相同的第二个节点。PATCH 会将该节点合并到现有节点映射中:
curl "http://127.0.0.1:9180/apisix/admin/upstreams/slow-start" -X PATCH \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"nodes": {
"slow-start-new:8080": 100
}
}'
在接下来一分钟内分批发送请求,并统计各服务器的响应数。每批请求提供足够的样本,便于观察流量份额 的变化:
for elapsed in $(seq 0 10 60); do
echo "After ${elapsed} seconds:"
seq 1 100 | xargs -P 20 -I {} \
curl -sS "http://127.0.0.1:9080/slow-start" | \
grep -o 'Request served by [^[:space:]]*' | sort | uniq -c
[ "$elapsed" -lt 60 ] && sleep 10
done
新节点的初始有效权重为 10,现有节点的权重为 100。随着新节点的权重逐步达到 100,它所处理的请求比例会接近一半。由于配置更新和请求会分布到不同的网关工作进程,实际计数会有所波动。最小百分比是相对于该节点配置权重的百分比,而不是相对于全部流量的百分比。