pau*_*der 0 kubernetes mongock
Mongock看起来很有前途。我们希望在具有多个并行运行的副本的 kubernetes 服务中使用它。
我们希望当我们的服务部署时,第一个副本将获取 mongockLock,并且其所有 ChangeLogs/ChangeSets 将在其他副本尝试运行它们之前完成。
我们在 kubernetes 环境中运行着一个 mongodb 实例,并且我们希望 mongock ChangeLogs/ChangeSets 仅执行一次。
mongockLock 能否保证只有一个副本才能完成 ChangeLogs/ChangeSets?
或者我是否需要启用交易(或其他一些配置)?
我将先提供简短的答案,然后提供详细的答案。我建议你也阅读长篇,以便正确理解它。
\n默认情况下,Mongock 保证 ChangeLogs/changeSets 一次仅由一个 pod 运行。拥有锁的人。
\n幕后真正发生的事情(如果没有进行其他配置)是,当一个 Pod 获取锁定时,其他 Pod 也会尝试获取它,但他们不能,因此他们被迫等待一段时间(可配置,默认4分钟)与配置的锁次数一样多(默认3次)。此后,如果我无法获取它并且仍然有待应用的更改,Mongock 将抛出 MongockException,这应该意味着 JVM 启动失败(Spring 中默认情况下会发生这种情况)。
\n这在 Kubernetes 中很好,因为它确保它将重新启动 Pod。\n所以现在,假设 Pod 再次启动并且已经应用了 ChangeLogs/changeSets,Pod 会成功启动,因为它们甚至不需要获取锁没有等待应用的更改。
\n现在,假设锁定和互斥是明确的,我想指出一个需要通过changeLog/changeSet 设计来缓解的潜在问题。
\n如果您处于 Kubernetes 等具有 pod 初始化时间的环境中,您的迁移需要比初始化时间更长的时间,并且在 pod 准备就绪/运行状况之前执行 Mongock 进程(这是它的一个条件),则此问题适用)。最后一个条件是非常需要的,因为它确保应用程序使用正确版本的数据运行。
\n在这种情况下,想象 Pod 启动 Mongock 进程。在 Kubernetes 初始化时间之后,该过程仍未完成,但 Kubernetes 突然停止了 JVM。这意味着某些changeSet已成功执行,其他一些甚至尚未启动(没问题,它们将在下一次尝试中处理),但有一个changeSet已部分执行并标记为未完成。这是潜在的问题。下次 Mongock 运行时,它将看到该变更集处于待处理状态,并且将从头开始执行它。如果您没有相应地设计您的changeLogs/changeSets,您可能会遇到一些意外的结果,因为该changeSet 涵盖的数据处理的某些部分已经发生,并且还会再次发生。
\n这种情况需要以某种方式得到缓解。要么借助事务等机制,要么借助考虑到这一点的changeLog/changeSet 设计,或者两者兼而有之。
\nMongock 目前提供带有 \xe2\x80\x9call 或无 \xe2\x80\x9d 的事务,但它并没有 \xe2\x80\x99t 真正有帮助,因为它每次都会从头开始重试,并且可能最终陷入无限循环。下一个版本 5 将提供每个变更日志和变更集的事务,再加上良好的组织,这是正确的解决方案。
\n\n 归档时间: |
|
查看次数: |
807 次 |
最近记录: |