CloudFoundry 在启动后立即销毁实例但没有完全关闭
CloudFoundry destroyes instance right after start but not shutting down fully
我在使用 CloudFoundry 方面经验不足。我知道如何在将服务连接到应用程序以及推送 war、日志文件等方面使用它。这些都是标准的东西。
但是当谈到 CloudFoundry 的配置和行为时,我的知识就结束了。
我的问题是,在我的应用程序启动并且 New Relic 完成后,它正在记录它用作收集器的内容等。CloudFoundry Cell 正在停止实例。
我使用 spring 集成,由于关闭 jvm 的信号,它关闭了所有东西。
我还在我的数据库中为某些作业禁用了几个布尔值。
一切正常,直到此时一切正常。
一旦一切都关闭,CloudFoundry 就会开始销毁当前实例的容器。在 wards 之后,日志条目表明销毁成功。
但是应用程序仍然是 运行 以及实例。
我的应用程序仍然时不时地记录一些东西(不是关闭的作业)并且该实例似乎仍然存在并且没有被“更新”。
有人知道为什么会这样吗?我是否必须在 spring 中实现一些东西来阻止实例被销毁?或者这是我需要进行的 CloudFoundry 配置吗?
一件奇怪的事是,它只发生一次对等周。每个星期三晚上到星期四早上。几乎在同一时间。
编辑:
这是我删除所有敏感信息的日志
Some logs which indicate that the app is still running as expected.
// I think this is the part where i gets interesting.
2020-07-09T00:44:09.87+0200 [CELL/0] OUT Cell XXX requesting replacement for instance XXX
2020-07-09T00:44:10.37+0200 [CELL/0] OUT Cell XXX creating container for instance XXX
2020-07-09T00:44:12.17+0200 [CELL/0] OUT Cell XXX successfully created container for instance XXX
Downloading droplet, starting the application and notice that it was shutted down unexpectedly. The indication for that is a flag in the database that hasn't been set to true which would happen during a proper shutdown.
2020-07-09T00:45:14.70+0200 [CELL/0] OUT Container became healthy
Some New Relic information which are not important for this question.
2020-07-09T00:45:19.94+0200 [CELL/0] OUT Cell XXX stopping instance XXX
This is the part where the application shuts down it's listeners and jobs.
2020-07-09T00:45:25.70+0200 [APP/PROC/WEB/0] OUT Exit status 143
2020-07-09T00:45:25.70+0200 [CELL/0] OUT Cell XXX destroying container for instance XXX
2020-07-09T00:45:25.88+0200 [PROXY/0] OUT Exit status 137
2020-07-09T00:45:26.07+0200 [CELL/0] OUT Cell XXX successfully destroyed container for instance XXX
2020-07-09T00:49:36.17+0200 [APP/PROC/WEB/0] OUT 2020-07-09T00:49:36,178+0200 Some log entry which indicates that the app is still alive
完成后,应用程序仍然是 运行(中间没有重新启动),可以通过将标志设置为 true 来再次启动所有作业,该标志在代码中设置为 false shutdown 挂钩,因此在应用程序关闭时不会启动新作业。
我现在知道问题出在哪里了。感谢一位同事,他在看到日志时确切地知道发生了什么。
CloudFoundry 在销毁旧实例之前创建一个新实例以避免停机。
一旦新实例启动并且健康,它就会销毁旧实例。
运行ning 在新实例上的应用程序仍然接收旧实例的关闭信号并执行关闭挂钩中的代码。这意味着标志将设置为 false 以在应用程序关闭时停止所有作业。
为避免这种情况,使用实例 ID 很重要。每个作业都需要获取它 运行 所在的实例的 ID。随着新实例的启动,实例 ID 必须在作业的 table 中被覆盖。所以新实例上的作业 运行 而不是旧实例。
我在使用 CloudFoundry 方面经验不足。我知道如何在将服务连接到应用程序以及推送 war、日志文件等方面使用它。这些都是标准的东西。 但是当谈到 CloudFoundry 的配置和行为时,我的知识就结束了。
我的问题是,在我的应用程序启动并且 New Relic 完成后,它正在记录它用作收集器的内容等。CloudFoundry Cell 正在停止实例。 我使用 spring 集成,由于关闭 jvm 的信号,它关闭了所有东西。 我还在我的数据库中为某些作业禁用了几个布尔值。 一切正常,直到此时一切正常。
一旦一切都关闭,CloudFoundry 就会开始销毁当前实例的容器。在 wards 之后,日志条目表明销毁成功。 但是应用程序仍然是 运行 以及实例。 我的应用程序仍然时不时地记录一些东西(不是关闭的作业)并且该实例似乎仍然存在并且没有被“更新”。
有人知道为什么会这样吗?我是否必须在 spring 中实现一些东西来阻止实例被销毁?或者这是我需要进行的 CloudFoundry 配置吗?
一件奇怪的事是,它只发生一次对等周。每个星期三晚上到星期四早上。几乎在同一时间。
编辑: 这是我删除所有敏感信息的日志
Some logs which indicate that the app is still running as expected.
// I think this is the part where i gets interesting.
2020-07-09T00:44:09.87+0200 [CELL/0] OUT Cell XXX requesting replacement for instance XXX
2020-07-09T00:44:10.37+0200 [CELL/0] OUT Cell XXX creating container for instance XXX
2020-07-09T00:44:12.17+0200 [CELL/0] OUT Cell XXX successfully created container for instance XXX
Downloading droplet, starting the application and notice that it was shutted down unexpectedly. The indication for that is a flag in the database that hasn't been set to true which would happen during a proper shutdown.
2020-07-09T00:45:14.70+0200 [CELL/0] OUT Container became healthy
Some New Relic information which are not important for this question.
2020-07-09T00:45:19.94+0200 [CELL/0] OUT Cell XXX stopping instance XXX
This is the part where the application shuts down it's listeners and jobs.
2020-07-09T00:45:25.70+0200 [APP/PROC/WEB/0] OUT Exit status 143
2020-07-09T00:45:25.70+0200 [CELL/0] OUT Cell XXX destroying container for instance XXX
2020-07-09T00:45:25.88+0200 [PROXY/0] OUT Exit status 137
2020-07-09T00:45:26.07+0200 [CELL/0] OUT Cell XXX successfully destroyed container for instance XXX
2020-07-09T00:49:36.17+0200 [APP/PROC/WEB/0] OUT 2020-07-09T00:49:36,178+0200 Some log entry which indicates that the app is still alive
完成后,应用程序仍然是 运行(中间没有重新启动),可以通过将标志设置为 true 来再次启动所有作业,该标志在代码中设置为 false shutdown 挂钩,因此在应用程序关闭时不会启动新作业。
我现在知道问题出在哪里了。感谢一位同事,他在看到日志时确切地知道发生了什么。
CloudFoundry 在销毁旧实例之前创建一个新实例以避免停机。 一旦新实例启动并且健康,它就会销毁旧实例。 运行ning 在新实例上的应用程序仍然接收旧实例的关闭信号并执行关闭挂钩中的代码。这意味着标志将设置为 false 以在应用程序关闭时停止所有作业。
为避免这种情况,使用实例 ID 很重要。每个作业都需要获取它 运行 所在的实例的 ID。随着新实例的启动,实例 ID 必须在作业的 table 中被覆盖。所以新实例上的作业 运行 而不是旧实例。