处理不可预测的流量高峰对应用程序来说是一项重大挑战。对于管理 Web 应用程序、电子商务平台或 SaaS 解决方案的开发人员、DevOps 工程师和系统管理员而言,当用户活动突然增加,导致基础设施不堪重负时,这个问题就会显现出来。如果没有适当的扩容机制,高流量会减慢服务速度、增加延迟、降低用户体验,甚至导致完全停机——从而造成收入损失和声誉受损。
这个问题通常发生在营销活动、产品发布、季节性事件或你的内容病毒式传播期间。传统的解决方案要么是过度配置资源(这在正常流量期间会浪费资金),要么是手动扩容(这需要持续监控,并且无法足够快地响应突发高峰)。
DigitalOcean 的 Droplet 自动伸缩池 (Droplet Autoscale Pools) 提供了一种无缝的方式来自动调整基础设施以满足需求。该解决方案实时监控应用程序的资源利用率,并根据预定义的阈值动态添加或移除计算资源,确保在高峰期实现最佳性能,同时在活动较低期间最大限度地降低成本。
在本教程中,你将通过实际示例了解自动伸缩的重要性,学习如何使用 DigitalOcean 用户界面 (UI) 和命令行界面 (CLI) 设置 Droplet 自动伸缩池,配置伸缩规则和阈值,优化自动伸缩的最佳实践,监控性能和基准测试伸缩效率,进行负载测试以模拟真实的流量高峰并观察自动伸缩的实际效果,确定正确的自动伸缩池大小,以及有关 DigitalOcean 自动伸缩的常见问题解答。
理解自动伸缩
自动伸缩 (Auto-scaling) 是一种云计算功能,可根据当前需求自动调整服务器池中的计算资源数量。自动伸缩使用预定义的规则来根据需要增加或减少容量,而不是手动配置或取消配置服务器。
自动伸缩的工作原理
- 监控 (Monitoring): 系统持续监控 CPU 使用率、内存利用率或请求率等资源指标。
- 评估 (Evaluation): 当这些指标超过预定义的阈值时,将触发伸缩操作。
- 执行 (Execution): 在高需求期间自动添加新资源(横向扩展),或在低需求期间移除资源(横向缩减)。
自动伸缩的优势
- 成本优化 (Cost Optimization ): 仅在需要时为所需资源付费。
- 性能提升 (Improved Performance): 即使在流量高峰期也能保持一致的性能。
- 减少运营开销 (Reduced Operational Overhead): 无需手动扩容和持续监控。
- 高可用性 ( High Availability ): 自动替换不健康的实例以保持服务可靠性。
- 可伸缩性 (Scalability): 无需重新设计基础设施即可处理从数百到数百万用户的增长。
挑战与注意事项
- 配置复杂性 (Configuration Complexity): 设置适当的阈值需要测试和微调。
- 启动时间 (Boot Time): 新实例需要时间来初始化,这可能在快速扩容期间导致短暂延迟。
- 有状态应用程序 (Stateful Applications): 在本地存储会话数据的应用程序需要额外的考虑。
- 成本管理 (Cost Management): 配置不当可能导致不必要的扩容和成本增加。
真实世界的自动伸缩示例
场景 1:电子商务流量高峰 想象一家在线商店正在进行“黑色星期五”促销活动。流量突然激增,导致响应时间变慢。如果没有自动伸缩,客户会面临延迟或结账失败。有了 Droplet 自动伸缩池,基础设施会自动扩容,防止停机。
场景 2:SaaS 应用程序处理增长 一家初创公司推出了一个新功能,导致用户注册量增加。自动伸缩确保系统根据实时需求动态调整,而无需手动配置新服务器。
前提条件
在开始之前,请确保你具备以下条件:
- 一个 DigitalOcean 账户。
- 访问 DigitalOcean 控制面板的权限。
- 在你的系统上安装并认证了
doctl
CLI 工具。 - 对 Droplets 有基本的了解。
步骤 1 - 创建自动伸缩池
Droplet 自动伸缩池能够根据资源利用率或固定大小为 Droplet 池启用自动水平扩展。
使用控制面板创建自动伸缩池
在 DigitalOcean 控制面板的左侧菜单中,单击 Droplets,其中包含 Droplets 选项卡和 Autoscale Pools 选项卡。
现在单击 Autoscale Pools 选项卡上的 Create an Autoscale Pool 按钮来创建自动伸缩池。
自动伸缩池配置
在“Autoscale Pool Configuration”部分,你可以选择池的配置,这决定了池的伸缩方式。
-
Autoscale (自动伸缩) :根据 Droplet 的聚合资源利用率动态管理池中的 Droplet 数量。你可以选择:
- Pool Size (池大小) :控制池中 Droplet 的最小和最大数量。
- Target Utilization (目标利用率) :控制监控哪些指标(CPU、内存或两者)以及在什么阈值下进行伸缩。
- Cooldown Duration (冷却持续时间) :自动伸缩池在对池中 Droplet 进行修改之间等待的最短时间。选择一个至少与 Droplet 启动所需时间一样长的冷却持续时间。
-
Fixed Size (固定大小) :在池中维护固定数量的 Droplet。你可以选择:
- Number of Droplets (Droplet 数量) :你希望池中拥有的 Droplet 数量。
在本教程中,你将使用 Autoscale 配置,根据你的池大小范围和利用率指标自动调整池中的 Droplet 数量。这对于管理不可预测的流量非常理想。
选择池大小、目标利用率和冷却持续时间
现在,让我们配置池大小和目标利用率。
在此示例中,你已将池大小设置为最少 1 个 Droplet,最多 3 个 Droplet。 我们将目标 CPU 利用率设置为 40% ,内存利用率设置为 40% 。当指标超过目标使用百分比时,一个 Droplet 将自动添加到你的自动伸缩池中。当它低于该值时,我们将移除一个。 冷却持续时间设置为 5 分钟。它设置了伸缩事件之间的最小等待时间,确保新 Droplet 完全启动并且利用率稳定后再进行进一步调整。
自动伸缩池 Droplet 配置
现在你将选择自动伸缩池中 Droplet 的配置。你可以在创建池后随时更新此配置。 选择基础 Droplet 大小、区域和镜像。
根据需要配置其他设置,例如 SSH 密钥、高级选项和唯一名称。
单击右上角的 Create Autoscale Pool 按钮。
你现在会注意到自动伸缩池正在创建并且处于 active (活动) 状态。
这将根据自动伸缩池配置中指定的内容创建一个 Droplet。
使用 CLI 创建自动伸缩池
你还可以使用 doctl
命令行实用程序来创建、配置和管理 Droplet 的自动伸缩池。 你可以参考此官方文档了解如何在你的系统上安装和配置 doctl
。
一旦安装了 doctl
,你将需要创建一个 API 令牌。 要生成个人访问令牌,请登录 DigitalOcean 控制面板。 在左侧菜单中,单击 API,这将带你进入“Applications & API”页面的“Tokens”选项卡。在 Personal access tokens 部分,单击 Generate New Token 按钮。
使用 API 令牌授予 doctl
访问你的 DigitalOcean 账户的权限。在 doctl auth init
提示时传入令牌字符串,并为此身份验证上下文指定一个名称。
doctl auth init --context <NAME>
现在你将被提示复制粘贴你生成的令牌。
Output
Please authenticate doctl for use with your DigitalOcean account. You can generate a token in the control panel at https://cloud.digitalocean.com/account/api/tokens
❯ Enter your access token: <TOKEN>
现在,使用以下命令列出已成功认证的生成令牌。
doctl auth list
你应该在输出中看到列出的令牌:
Output
mytoken(current)
注意:身份验证上下文允许你在多个已认证的账户之间切换。你可以重复上述步骤添加其他 DigitalOcean 账户,然后列出并在身份验证上下文之间切换:
doctl auth switch --context <NAME>
现在,要验证 doctl
是否正常工作,你可以从命令行运行以下命令。
doctl account get
Output
User Email Team Droplet Limit Email Verified User UUID Status
your_email@digitalocean.com CMS 10 true xxxxxx-xxxxx-xxxxxx-a80bb9d13dd8 active
现在,使用以下 doctl
命令创建一个 Droplet 自动伸缩池。你可以在此 doctl compute droplet-autoscale
指南中查看完整的命令参考。 命令是:
doctl compute droplet-autoscale create --name my-droplet-pool --image ubuntu-24-04-x64 --region blr1 --size s-1vcpu-1gb --min-instances 1 --max-instances 3 --cpu-target 40 --mem-target 40 --cooldown-minutes 5 --project-id <PROJECT_ID> --ssh-keys <SSH_KEY_ID>
这将创建与上一节中从 DigitalOcean 云控制面板生成的配置相同的自动伸缩池。 你可以参考此官方文档了解如何使用 doctl
创建自动伸缩池以了解更多信息。
步骤 2 - 进行 负载测试 以测试自动伸缩性能
为了模拟流量高峰并观察自动伸缩,你将使用 loadtest
工具对 Droplet 执行负载测试。这将帮助你评估自动伸缩池在各种负载条件下的性能。
通过 SSH 连接到你的自动伸缩 Droplet 并安装 loadtest
。
sudo npm install -g loadtest
负载测试本质上是对请求的配置,以模拟你要测试的系统上的负载。这使其非常灵活,特别擅长实现复杂的用户流程。但它也可以进行简单的测试,所以让我们从简单的开始:
以下是在你的 Droplet 上执行负载测试的命令行命令:
loadtest http://your-droplet-ip -n 1000 -c 10 -t 10m
此命令将在 10 分钟内以 10 个并发连接向指定的 Droplet IP 模拟 1000 个请求。根据需要调整参数以模拟不同的负载场景。 一段时间后,一旦目标 CPU 和内存利用率超过设定的阈值,你应该会注意到新的 Droplet 被创建以处理负载。
你可以使用我们往期关于负载测试简介的文章了解更多关于负载测试以及在 Ubuntu 上使用哪些框架进行负载测试的信息。
确定正确的自动伸缩池大小
选择正确的池大小取决于工作负载需求。请遵循以下准则:
- 分析流量模式 (Analyze Traffic Patterns): 监控 CPU 使用趋势以确定平均负载和峰值负载。
- 估算资源需求 (Estimate Resource Needs): 从基础池开始,并根据负载测试结果进行调整。
- 考虑伸缩速度 (Consider Scaling Speed): 向上伸缩会添加新实例,这些实例需要时间来初始化。
设置为自动伸缩的池通过将利用率乘以池中当前的 Droplet 数量并对结果向上取整来确定池应具有多少 Droplet。
例如,一个拥有两个 Droplet、目标 CPU 利用率为 80% 、当前 CPU 利用率为 95% 的自动伸缩池将执行以下计算来确定池的大小:
ceil(2 Droplets * (95% current CPU / 80% target CPU))
= ceil(2 Droplets * 1.1875)
= ceil(2.375 Droplets)
= 3 Droplets
因此,该池将从两个 Droplet 扩展到三个 Droplet。 如果设置了多个指标,则池将使用所有指标中此计算的最大结果。
你可以参考 DigitalOcean 的官方指南获取详细的自动伸缩池大小建议。
常见问题解答 (FAQs)
- DigitalOcean 自动伸缩池是如何工作的? DigitalOcean 自动伸缩池根据资源利用率或固定大小动态调整池中的 Droplet 数量。这是通过自动水平扩展实现的,确保池大小能够适应变化的工作负载需求。
- 所需的最小 Droplet 数量是多少? 建议至少使用两个 Droplet 以实现冗余和平滑伸缩。这允许负载分配,并确保池可以在不停机的情况下向上或向下伸缩。
- 自动伸缩响应流量高峰的速度有多快? 自动伸缩通过根据冷却持续时间 (Cooldown Duration) 向上或向下伸缩来响应流量高峰。这段时间是新实例初始化并变为可用所必需的。为了最大限度地减少伸缩延迟的影响,建议进行预热。 池的冷却持续时间是自动伸缩池在对池中 Droplet 进行修改之间等待的最短时间。 这种冷却可以防止在伸缩过程中的抖动。它还通过在新 Droplet 启动之前销毁旧 Droplet 来防止在配置更改期间发生停机。
- 我可以将自动伸缩池与 负载均衡 器一起使用吗? 是的,DigitalOcean 自动伸缩池可以与 DigitalOcean 负载均衡器结合使用,以确保在池中高效分配流量。这种组合使你的应用程序能够处理增加的流量并动态伸缩。
- 如何监控我的自动伸缩性能? 要监控自动伸缩性能,请使用 DigitalOcean 云控制面板上的 Autoscale Pools Tab (自动伸缩池选项卡) 或
doctl compute droplet-autoscale list
命令。这可以提供对自动伸缩池当前状态的洞察,并帮助你优化其配置。 - 我可以手动调整自动伸缩池中的 Droplet 数量吗? 是的,你可以使用 DigitalOcean 控制面板或 CLI 手动调整自动伸缩池中的 Droplet 数量。这允许对池大小进行细粒度控制,使你能够响应变化的工作负载需求。
- 如果我的 Droplet 数量达到最大限制会发生什么? 如果 Droplet 数量达到为自动伸缩池设置的最大限制,则不会创建额外的 Droplet。设置适当的最大值至关重要,以确保你的池可以扩展以满足需求,而不会超出资源限制。
结论
DigitalOcean 的 Droplet 自动伸缩池为处理不可预测的工作负载和流量模式提供了强大的解决方案。通过遵循本教程,你可以有效地配置自动伸缩、优化性能,并在无需人工干预的情况下确保流量高峰期间的平稳运行。
实施最佳实践,例如使用负载均衡 器分配流量,根据应用程序的性能特征设置适当的伸缩阈值,以及配置最佳的冷却周期,将最大限度地发挥 DigitalOcean 上自动伸缩的优势。
实施 Droplet 自动伸缩池的主要优势包括:
- 成本优化: 仅在需要时为所需资源付费。
- 提高可靠性: 自动处理流量高峰而不会降低服务质量。
- 减少运营开销: 无需手动扩容和持续监控。
- 增强用户体验: 无论负载如何,都能保持一致的性能。
- 业务 敏捷性 : 快速适应不断变化的市场条件和季节性需求。
对于生产工作负载,请考虑使用 DigitalOcean Monitoring 实施全面的监控策略,以便更深入地了解应用程序的性能,并随着时间的推移进一步优化你的自动伸缩配置。
通过利用 DigitalOcean 的基础设施和自动伸缩功能,你可以构建具有弹性、可伸缩的应用程序,在优化云基础设施成本的同时提供一致的性能。
最后如果你正在寻找支持欧美地区、东南亚等全球范围内的价格便宜的云服务,欢迎尝试 DigitalOcean。如需了解更多,可与 Digitalocean 中国区独家战略合作伙伴卓普云直接交流。