问题标签 [cloudcaptain]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
postgresql - Play Framework 2.5 请求随机超时
症状
经过一段时间的正常运行后,我们的后端将停止对其大多数端点做出响应。对于那些人来说,它只会开始表现得像个黑洞。一旦处于这种状态,如果我们不采取任何行动,它就会一直呆在那里。
更新
当后端处于无响应状态时,我们可以使用我们制作的数据库转储来重现此行为。
基础设施设置
我们在 AWS 上的一个 EC2 实例上运行 Play 2.5,该实例位于负载均衡器后面,RDS 上有一个 PostgreSQL 数据库。我们使用slick-pg作为我们的数据库连接器。
我们所知道的
到目前为止,我们发现了一些事情。
关于 HTTP 请求
我们的日志和调试显示请求正在通过过滤器。此外,我们看到对于身份验证(我们为此使用Silhoutte),应用程序能够执行数据库查询以接收该请求的身份。但是,控制器操作将永远不会被调用。
后端正在响应HEAD
请求。进一步的日志记录显示,似乎使用注入服务的控制器(我们为此使用谷歌的 guice)是那些不再调用方法的控制器。没有注入服务的控制器似乎工作正常。
关于 EC2 实例
不幸的是,我们无法从那个获得太多信息。我们正在使用 boxfuse,它为我们提供了一个不可变的和通过 ssh-able 基础设施。我们即将将此更改为基于 docker 的部署,并且可能很快会提供更多信息。不过,我们有 New Relic 设置来监控我们的服务器。我们在那里找不到任何可疑的东西。内存和 CPU 使用情况看起来不错。
尽管如此,这个设置还是在每次部署时为我们提供了一个新的 EC2 实例。即使在重新部署之后,问题至少在大多数情况下仍然存在。最终可以通过重新部署来解决这个问题。
更奇怪的是,我们可以在本地运行后端连接到 AWS 上的数据库,并且一切都可以正常工作。
所以我们很难说问题出在哪里。似乎数据库没有与任何 EC2 实例一起使用(直到它最终将与新实例一起使用),而是与我们的本地机器一起使用。
关于数据库
db 是此设置中唯一的有状态实体,因此我们认为问题应该与它有关。
由于我们有一个生产环境和一个登台环境,我们可以在后者不再工作时将生产数据库转储到登台中。我们发现这确实可以立即解决问题。不幸的是,我们无法从某种损坏的数据库中获取快照以将其转储到暂存环境中,看看这是否会立即破坏它。当后端不再响应时,我们有数据库的快照。当我们将其转储到暂存环境时,后端将立即停止响应。
根据 AWS 控制台,与数据库的连接数约为 20,这是正常的。
TL;博士
- 对于某些端点,我们的后端最终开始表现得像一个黑洞
- 请求未达到控制器操作
- EC2 中的新实例可能会解决此问题,但不一定
- 在本地使用相同的数据库,一切正常
- 将工作数据库转储到其中可以解决问题
- EC2 实例的 CPU 和内存使用率以及与数据库的连接数看起来完全正常
- 当后端不再响应时,我们可以使用我们制作的数据库转储来重现该行为(请参阅更新 2)
- 使用新的 slick 线程池设置,我们将在重新启动数据库后从 slick 获取 ThreadPoolExecutor 异常,然后重新启动我们的 ec2 实例。(见更新 3)
更新 1
回复marcospereira :
以这个为例ApplicationController.scala
:
和index
工作admin
正常。不过,这taskchecker
将显示出奇怪的行为。
更新 2
我们现在可以重现此问题!我们发现上次后端不再响应时我们进行了数据库转储。当我们将其转储到暂存数据库中时,后端将立即停止响应。
我们现在开始在我们的一个过滤器中记录线程数,Thread.getAllStackTraces.keySet.size
发现有 50 到 60 个线程正在运行。
更新 3
正如@AxelFontaine建议的那样,我们为数据库启用了多可用区部署故障转移。我们通过故障转移重新启动了数据库。在重新启动之前、期间和之后,后端没有响应。
重新启动后,我们注意到与 db 的连接数保持为 0。此外,我们不再获得任何用于身份验证的日志(在我们这样做之前,身份验证步骤甚至可以发出 db 请求并获得响应)。
重启 EC2 实例后,我们现在得到
play.api.UnexpectedException: Unexpected exception[RejectedExecutionException: Task slick.backend.DatabaseComponent$DatabaseDef$$anon$2@76d6ac53 rejected from java.util.concurrent.ThreadPoolExecutor@6ea1d0ce[Running, pool size = 4, active threads = 4, queued tasks = 5, completed tasks = 157]]
(我们之前没有得到那些)
对于我们的请求以及需要访问数据库的后台作业。我们的光滑设置现在包括
按照这里的建议
更新 4
在我们得到更新 3 中描述的异常后,后端现在再次运行良好。我们没有为此做任何事情。这是后端第一次在没有我们参与的情况下从这种状态中恢复。
liquibase - 更新生产数据库:jhipster
我很难理解 Liquibase 如何与 jhipster 一起工作。我正在使用 Boxfuse 将 jar 文件部署到 AWS。现在,由于我的应用程序不断发展,我需要每周添加/删除列/表。
当我第一次部署它时,应用程序第一次运行良好,当数据库模式没有变化时它也运行良好,只有代码的变化。现在,我需要将列添加到数据库。我使用 mvn liquibase:update 命令和包含 master.xml 中相应更改的更改集。甚至更改也会应用于数据库。我确认了他们。
现在,当我使用更改部署更新的 jar 时,它会出错并且无法部署。此外,boxfuse 控制台没有显示任何特定错误。它只是说上传失败。
有人可以帮我弄这个吗?谢谢。
playframework - 如何使用非默认 VPC 创建 Boxfuse 环境
我在一家拥有 AWS 账户的公司工作,我们希望将所有 Play 应用程序部署在同一个 AWS 区域(比如 us-east-1)。该区域没有“默认”VPC,无论如何,我们更愿意将我们的应用程序部署在我们的 IT 部门已经设置的现有 VPC 中。如何从 Web 界面 ( https://console.cloudcaptain.sh ) 将 Boxfuse 设置为使用另一个 VPC,然后使用默认 VPC?如果这是不可能的,我们怎么能通过命令行来做到这一点?
cloudcaptain - 使用带有 Boxfuse 的内部 LB
是否可以将应用程序配置为使用内部 AWS LB(经典)?
我有一堆在自定义 LB 上运行的应用程序,但它们都是面向互联网的。我在 Boxfuse 控制台(LB 选择器下拉菜单)中找不到我新创建的内部 LB...
cloudcaptain - 在自托管解决方案上运行 boxfuse 图像
我刚刚找到了 Boxfuse。对于开发和运输应用程序来说,这是一个非常有趣的解决方案。有一点让我很困扰。我可以在使用 kvm 或类似工具的自托管解决方案上运行 boxfuse 图像吗?感谢您的帮助。
spring-cloud - 在 ecs 中使用 Spring-Cloud-docker 通过 Cloud-Watch 处理日志记录的最佳实践
我现在尝试了几天来设置我的 docker-container 并运行一个 spring-cloud 应用程序
- 使用“docker logs”登录 ec2 实例
- 在 Cloud-Watch 的 logGroup 中显示我的日志记录条目
到目前为止我最好的结果:我在 Cloud-Watch 中获得了日志的前 20 行(Ascii-Art 和 Spring 版本中的 Spring-Brand),仅此而已。当时 EC2 实例上的 docker 显示与“docker logs”相同,但是我系统上的同一个 docker 像往常一样记录。但是,我的大多数尝试都没有显示通过“docker logs”或 Cloud-Watch 进行日志记录。但同样,我的控制台附加程序通过 log4j2 进行的应用程序日志运行与配置完全一样。
甚至我的本地 docker 与 app.jar 的日志也符合预期(不幸的是,Windows7、Docker 工具箱,没有 Linux 可能)。只有在 EC2 实例上,“泊坞窗日志”才会保持沉默。
配置:
- 我有正确的泊坞窗图像吗?openjdk:8-jdk-alpine
- 我的 Spring/AWS-Dependencies 是否正确(我们主要使用 SQS):spring-cloud-aws-messaging、spring-cloud-aws-autoconfigure、spring-boot-starter-web、aws-java-sdk-sts
- 我是否需要我现在使用的这些日志记录依赖项? spring-boot-starter-log4j2 (um alle Brücken für CommonsLogging zu haben)
- 我的应用程序中使用的日志记录(通过 slf4j 的 log4j2)可能是问题吗?
- 我尝试了Console-Appender=>STDOUT=>awslogs方式。我尝试了(另外或作为交换)cloud-watch-appenders(com.boxfuse.cloudwatchlogs:cloudwatchlogs-java-appender和pro.apphub:aws-cloudwatch-log4j2)。使用这两个附加程序,我修复了一些初始配置错误,然后我看到...... Cloud-Watch 上什么都没有。
- 在 ECS 任务中,我尝试了“ awslogs ”-配置以在 Cloudwatch 中获取 Docker-STDOUT(这就是导致上述前 20 行日志记录的原因)。我尝试使用“ json-file ”-config 在 EC2-instance 上使用“docker logs”查看某些内容。两者都没有导致预期的结果。
你能给我一些我可能错过的东西吗?
为什么只有日志的前 20 行(Spring-Header?)
为什么附加程序不显示希望的结果?我希望它像“Graylog”一样简单......在日志配置中选择了正确的附加配置,瞧,有日志条目。
您是否有一些教程链接,其中从 spring-cloud 到 Cloud-Watch 的日志记录是主题,并解释了所有必要的部分和步骤?
您是否有一些片段(Pom、task-json、其他提示)可以帮助我完成这项工作?
改变像 Boxfuse 这样的“一切就绪”的解决方案确实会更好吗?
十分感谢!
PS:我知道ELK-Stack等有解决方案,但我真的很想先尝试Cloud-Watch。
cloudcaptain - boxfuse 的默认配置参数
是否有可在 boxfuse.conf 中使用的配置 Boxfuse 参数的记录列表?主要是,当您在 Web 控制台中创建和配置应用程序时,我想通过 .conf 将该应用程序分配给具体项目,而不是 Boxfuse 在部署期间创建另一个应用程序,因为如果从其他地方推断它。
cloudcaptain - 不加密 AMI 的 Boxfuse 部署
是否可以在不加密图像的情况下将 Boxfuse 部署到 AWS?即使是最小的 Play Framework 融合应用程序(~90MB)也需要大约 5 分钟(而不是宣布的 ~50 秒)来加密,更不用说更大的项目了。出于这个原因,能够至少在部署频繁的环境(QA、测试等)中禁用加密会很有趣。Boxfuse 的某处有一条关于选择针对 AMI 签名优化的 AWS 区域的评论,但我没有运气。对于我的情况,它仍然很慢。
java - 有没有办法从 boxfuse 中提取我的源代码?
原谅一个非技术应用程序所有者可能是一个愚蠢的问题,一年前我与一位后端开发人员合作,对我的应用程序进行了一些修复,但没有直接从他那里得到他的代码(忘记了)。现在我正在与一位新的后端开发人员合作,我们需要该代码。我们使用 boxfuse 来推送更改,有没有办法从 boxfuse 获取代码,还是我们搞砸了?!
go - 如何在 boxfuse 图像(golang 应用程序)中包含配置文件?
我正在使用 golang 服务器,我想在融合图像中包含一些配置文件。但是,我找不到任何可以为我指明正确方向的文档。谢谢!