维护 CronJob 的进度
Maintaining progress of the CronJob
我在 Kubernetes 集群上设置了一个 cron 作业来处理数据库中的数百万条记录。有时与 cron 作业对应的 pod 会被 Evicted 或 OOM Killed。现在我面临的问题是,每当此 cron 作业再次启动时,它都会从头开始处理所有这些记录。
只是想了解我应该如何在某处存储此 cron 作业的进度。假设我将它存储在数据库中,那么我应该多久调用一次数据库来存储状态?
Maintaining progress of the CronJob
您可以 check the job 运行 kubectl describe <your_job>
,但这可能不是适合您情况的解决方案。
Now the issue I am facing is whenever this cron job starts again it processes all those records from the beginning.
这是为了CronJob. This is for the correct operation of CronJob. You need to know that CronJob only performs certain tasks in a timely manner and does not interfere with them anymore. The solution to your problem will be to interfere with your script which is run by CronJob. User Rakesh Gupta的正确操作,在评论中有提到:
Try to base your next iteration on the timestamp or UUID of the rows fetched already
通常,您必须更改正在处理数据库的进程。您实际上可以为此使用时间戳或 UUID。基本上,您需要在 运行 您的流程之前找到一个可以轻松检查的标识符。然后您的过程将从特定位置开始 运行 而不是重新开始。如果进程因 OOM 而死,另一种解决方案可能是增加可用 RAM。
我知道我来晚了,Rakesh gupta & Mikolaj的建议很好。
您要么扩展资源限制,要么使用 DB。
我不确定您拥有的实际应用程序的架构,您也可以使用 Redis database 或 Redis 部署作为一个侧面的选择。 (这里我不建议更改数据库或部署,但如果您正在使用计划在将来使用 Redis thn)
当您的 cronjobs 运行 将记录转储到 Redis 并且 cronjob 一条一条地处理来自 [= Redis 数据库中的 24=]Queue。这是一个不错的选择,因为没有多少 Db 调用 会到达 main database.
我不确定你使用的是哪种语言,但这个库是与 Redis 一起使用并管理 Queue 的一个很好的例子:https://github.com/OptimalBits/bull
使用它,您可以管理 Redis Queue 并使用最少的 DB 处理记录调用和更改。
我建议解决 OOM 问题而不是寻找解决方法。我已经列出了我对两者的看法。
修复 OOM:
假设 Cronjob 正在处理数百万条记录并且它遇到了 OOM 问题,这主要是由于内存泄漏。我会检查某些数据 structures/resources 是否在完成后被释放。另一种方法是增加内存。
解决方法:
如果你用的是数据库,仅仅为了挽救进度而引入另一种技术意义不大。您可以为 cronjob 进度创建一个 table,并在处理完一批记录后更新 table。您可以使用页码或偏移量更新 table。
我在 Kubernetes 集群上设置了一个 cron 作业来处理数据库中的数百万条记录。有时与 cron 作业对应的 pod 会被 Evicted 或 OOM Killed。现在我面临的问题是,每当此 cron 作业再次启动时,它都会从头开始处理所有这些记录。
只是想了解我应该如何在某处存储此 cron 作业的进度。假设我将它存储在数据库中,那么我应该多久调用一次数据库来存储状态?
Maintaining progress of the CronJob
您可以 check the job 运行 kubectl describe <your_job>
,但这可能不是适合您情况的解决方案。
Now the issue I am facing is whenever this cron job starts again it processes all those records from the beginning.
这是为了CronJob. This is for the correct operation of CronJob. You need to know that CronJob only performs certain tasks in a timely manner and does not interfere with them anymore. The solution to your problem will be to interfere with your script which is run by CronJob. User Rakesh Gupta的正确操作,在评论中有提到:
Try to base your next iteration on the timestamp or UUID of the rows fetched already
通常,您必须更改正在处理数据库的进程。您实际上可以为此使用时间戳或 UUID。基本上,您需要在 运行 您的流程之前找到一个可以轻松检查的标识符。然后您的过程将从特定位置开始 运行 而不是重新开始。如果进程因 OOM 而死,另一种解决方案可能是增加可用 RAM。
我知道我来晚了,Rakesh gupta & Mikolaj的建议很好。
您要么扩展资源限制,要么使用 DB。
我不确定您拥有的实际应用程序的架构,您也可以使用 Redis database 或 Redis 部署作为一个侧面的选择。 (这里我不建议更改数据库或部署,但如果您正在使用计划在将来使用 Redis thn)
当您的 cronjobs 运行 将记录转储到 Redis 并且 cronjob 一条一条地处理来自 [= Redis 数据库中的 24=]Queue。这是一个不错的选择,因为没有多少 Db 调用 会到达 main database.
我不确定你使用的是哪种语言,但这个库是与 Redis 一起使用并管理 Queue 的一个很好的例子:https://github.com/OptimalBits/bull
使用它,您可以管理 Redis Queue 并使用最少的 DB 处理记录调用和更改。
我建议解决 OOM 问题而不是寻找解决方法。我已经列出了我对两者的看法。
修复 OOM: 假设 Cronjob 正在处理数百万条记录并且它遇到了 OOM 问题,这主要是由于内存泄漏。我会检查某些数据 structures/resources 是否在完成后被释放。另一种方法是增加内存。
解决方法: 如果你用的是数据库,仅仅为了挽救进度而引入另一种技术意义不大。您可以为 cronjob 进度创建一个 table,并在处理完一批记录后更新 table。您可以使用页码或偏移量更新 table。