LiquiBase 和 Kubernetes 数据库滚动更新
LiquiBase and Kubernetes database rolling updates
假设我有一个架构为 v1 的数据库,以及一个与该 v1 架构紧密耦合的应用程序。即,如果数据库中的记录与实体 类.
不匹配,则会抛出 SQLException
我应该如何部署更改数据库模式的更改,并部署具有竞争条件的应用程序。即用户在应用程序中查询不再存在的字段。
这个问题实际上并不是 kubernetes 特有的,它发生在任何有多个服务器的系统中——kubernetes 只是让它更靠前和更靠前,因为翻转是多么的自动。你问题中的 "tightly coupled" 是这里 真实 问题的死角。
也就是说,"answer" 实际上将取决于以下哪种心智模型更适合您的团队:
- 不要让两个连续的模式相互矛盾
- 使用 "maintenance" 页面来阻止 pods 的流量,直到它们完全推出
- 只需接受
SQLException
并为消费者添加更好的重试逻辑
我们使用第一个,因为 kubernetes 的推出融入了我们的工程文化,我们知道 pod-old 和 pod-new 将同时 运行因此模式更改需要增量和向后兼容至少一代 pods.
然而,有时我们只是接受这样做的工程工作比特定重大更改将产生的 500 多成本,因此我们欺骗并将副本缩小到较低水平,然后推出并警告我们的监控团队会有例外,但它们会过去。我们可以做到这一点,部分原因是客户端内置了重试逻辑。
假设我有一个架构为 v1 的数据库,以及一个与该 v1 架构紧密耦合的应用程序。即,如果数据库中的记录与实体 类.
不匹配,则会抛出 SQLException我应该如何部署更改数据库模式的更改,并部署具有竞争条件的应用程序。即用户在应用程序中查询不再存在的字段。
这个问题实际上并不是 kubernetes 特有的,它发生在任何有多个服务器的系统中——kubernetes 只是让它更靠前和更靠前,因为翻转是多么的自动。你问题中的 "tightly coupled" 是这里 真实 问题的死角。
也就是说,"answer" 实际上将取决于以下哪种心智模型更适合您的团队:
- 不要让两个连续的模式相互矛盾
- 使用 "maintenance" 页面来阻止 pods 的流量,直到它们完全推出
- 只需接受
SQLException
并为消费者添加更好的重试逻辑
我们使用第一个,因为 kubernetes 的推出融入了我们的工程文化,我们知道 pod-old 和 pod-new 将同时 运行因此模式更改需要增量和向后兼容至少一代 pods.
然而,有时我们只是接受这样做的工程工作比特定重大更改将产生的 500 多成本,因此我们欺骗并将副本缩小到较低水平,然后推出并警告我们的监控团队会有例外,但它们会过去。我们可以做到这一点,部分原因是客户端内置了重试逻辑。