问题描述
在一个资源紧张的staging环境中,随着新的开发、数据工作负载和其他应用程序的增长,理想情况下,我们希望保持与生产环境相同的资源分配水平。例如,12因素应用程序原则之一描述了这一点,强调了不仅仅是使用模拟或轻量级的虚拟资源来实现表面上的一致性,而是通过在staging环境中运行相同的资源来实现真正的一致性。
显然,对于大规模扩展的项目,您可能会受到预算限制,只能在staging环境中模拟一些资源,使用“示例”数据或与生产环境中真实依赖项相同形状的微服务存根,以及其他牺牲。
但是,一种难以解决的牺牲是减少基本分配的资源,如CPU、RAM、磁盘访问、网络资源、日志等,以便在测试整个组件堆栈的行为时,部署在staging环境中的实体变得非常不同。
有各种工具可以帮助您自动减少资源使用,例如在许多云供应商环境和Kubernetes中的自动扩展,这实际上可以导致在部署请求与生产环境中相同类型的资源时,“超额分配”您的staging环境,但根据实际负载或其他动态条件进行调整。
我的问题是:关于在staging环境中超额分配资源的最佳实践或理解的现状是什么?这种类型的要求在预算方面有多频繁,以及在设计解决方案时需要考虑的主要原则是什么?对于问题的另一面,即“做生意的成本”,一个特定的部署实体应该将在staging中具有重要的生产一致性成本作为基本需求吗?
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
在staging环境中超额分配资源的最佳实践是根据每个公司和团队的不同而异。以下是一些可以考虑的主要原则:
1. 自动化环境部署:在云环境中,如果您正确地进行自动化,可以轻松创建动态环境。当成本成为限制因素时,您可以启动完整规模的staging环境进行负载测试,然后关闭它们。这对于大多数用例都适用。但是,某些问题只有在系统在特定负载下运行一段时间后才会出现。
2. 保持环境一致性:我们通常在staging环境中保持与生产环境相同但更小规模的环境,例如线性缩小的Presto集群/Spark集群、具有较少副本的Kubernetes微服务等。我们尽量保持实际的内存/CPU请求(或配置)在任何工具上相同。这样可以进行适当的负载测试,而无需对任何可扩展的内容进行配置更改。
3. 使用自动化工具:使用自动化工具可以检测到资源请求过大或过小的问题。例如,如果您使用Kubernetes,可以使用Prometheus和Alert Manager来检测资源请求的大小是否合适。您可以在staging和生产环境中实施和使用这些工具,以便在两个环境中都可以合理地调整大小,并保持一致性。
4. 负载测试:为了有效地进行负载测试,您仍然需要确保可以将staging环境(或其他动态环境)设置为生产环境的设置。
方案2
使用脚本或工具来管理容器的启动顺序可能会增加复杂性,并且需要确保容器A和容器B之间的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制容器的运行顺序。您可以使用docker run
命令来手动控制容器的启动顺序,或者使用一些第三方工具来管理容器的依赖关系。
示例:
以下是一个简单的bash脚本示例,可以在容器A启动后启动容器B:
#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b
在这个示例中,我们首先使用docker run
命令启动容器A,并将其命名为container_a
。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo
命令来测试)。一旦容器A就绪,我们再使用docker run
命令启动容器B,并将其命名为container_b
。
以上是关于在staging环境中超额分配资源的最佳实践的解决方案。根据不同的情况和需求,您可以选择适合您的方法来实现资源的合理分配和负载测试。