关于应用程序的 Deployment 与 Database Changes, 诸位在实际中是如何处理的?
通常情景下, 此方案尚可行, 且所有同事也已熟知 flyway 的优缺点, 这个方案也成为了 Project 里的一个”传统”.
然而, 有一些情况, 采取这个方式就显得比较棘手. 比如, 在 database 的修改中, 有一些语句需要 1-2 小时的时间执行. 例如, 重建 index 或者新建一些无 default 的 col. 如果仍然依仗 flyway 来处理这些语句, 那么 deployment 以后, app 的启动时间将会 1-2 小时之久. 这是不能接受的一个情况. 所以现在对这种情况只有在开发的时候, 发现有这种可能的语句, 不放在 flyway 脚本中, 而是单独出来, 放在一个地方, 然后弄一个 ticket (we are using JIRA heavily), 在需要 release 的时候人工来执行这些语句, 之后再进行 app 的 deployment.
还有一个问题就是, database changes 包含 rename, del column 这种, 就会更加麻烦. 目前我们是尽量避免这种操作, 如果确实需要, 就只 add new, 然后等下一次 deployment 之日, 再进行 delete 操作. 因为我们采用 rolling deployment, 当前的 deployment 如果失败,比如有错误或者超时, 不会影响现在正在运行的 pods (我们使用 openshift) . 但是如果有 database 结构的删除操作, 当前运行的 pod 就会不正常.这个也是不能接受的. 我们要尽量实现用户角度不察觉的 release.
我觉得当前采取的各种措施都不是自动化的, 很多人工参与因素. 应该不是最优的. 我能想到的稍微(可能)好一些的方案是 2 个数据库的热切换, deployment 在 A, running pod 在 B, 然后数据再同步. 可是这个对于我们现在是不可行的, 因为数据量确实大, 没办法双份热切换.
不知道各位有没有类似的问题, 是如何处理的. 特别是有 database 结构删除操作和较为耗时的数据库语句的情况.
先行感谢.