在 Kubernetes 上使用数据库进行蓝绿部署 - 数据丢失?
Blue green deployment with database on Kubernetes - loss of data?
我是reading about blue green deployment with database changes on Kubernetes.它非常清楚和详细地解释了这个过程是如何工作的:
- 使用新版本部署新容器,同时仍将流量引导至旧容器
- 迁移数据库更改并将服务指向新数据库
- 将流量重定向到新容器并在没有问题时删除旧容器
我有一些问题,特别是关于我们从旧数据库切换到新数据库的那一刻。
在本文的第 3 步中,我们有 person-v1
和 person-v2
服务,它们仍然指向未修改版本的数据库 (postgres v1):
从这张图中,可能需要 person-v2
指向数据库才能建立 TCP 连接,但由于代码和数据库模式之间的不兼容,它可能会失败。但由于所有传入流量仍定向到 person-v1
,这不是问题。
我们现在修改数据库(到 postgres v2)并将流量切换到 person-v2
(文章中的第 4 步)。 我假设数据库迁移和流量切换同时发生?这意味着person-v1
无法与postgres v2通信或person-v2
无法通信在此过渡期间的任何时候使用 postgres v1?因为这显然会导致错误(即在不存在的列中插入数据 yet/anymore)。
如果上述假设是正确的,那么如果在数据库迁移期间将新数据插入到 postgres v1 中会发生什么情况?数据是否有可能因时间不巧而丢失?仅仅因为流量切换与数据库切换同时发生,并不意味着 person-v1
中任何正在进行的进程仍然不能执行数据库语句。在我看来,只要迁移仍在进行中,任何新的 inserts/deletes/updates 都需要传播到 postgres v2。
即使在为应用服务器做蓝绿时,您仍然必须遵循数据库模式兼容性的正常规则。无论您认为一个完整的发布周期是什么,所有架构更改都需要向后兼容。两种服务在切换期间与同一个数据库通信,但由于仔细规划,每个服务都可以理解对方的数据,一切都很好。
I am reading about blue green deployment with database changes on Kubernetes. It explains very clearly and in detail how the process works
这篇文章很有趣。但我不会按照那里的描述进行数据库迁移。蓝绿部署并没有让这变得更容易,你不能自动交换流量,因为副本仍然可能处理旧版本上的请求——你不想削减正在进行的请求。
数据库更改必须以不破坏代码的第一个版本的方式进行。也许这必须分多个步骤完成。
考虑同一个例子,有多个不同的解决方案。例如。首先使用新的列名添加 view,然后部署使用该视图的代码版本,然后更改列名,最后部署使用该视图的较新版本的代码新的列名。或者,您可以 添加 具有新列名的列 除了 旧列名,并让旧版本的代码仍然使用旧列-names 和新版本的代码使用新的列名,最后在 没有 运行 旧代码的副本时删除旧的列名 .
如上所述,滚动升级和蓝绿部署都可以实现
我是reading about blue green deployment with database changes on Kubernetes.它非常清楚和详细地解释了这个过程是如何工作的:
- 使用新版本部署新容器,同时仍将流量引导至旧容器
- 迁移数据库更改并将服务指向新数据库
- 将流量重定向到新容器并在没有问题时删除旧容器
我有一些问题,特别是关于我们从旧数据库切换到新数据库的那一刻。
在本文的第 3 步中,我们有 person-v1
和 person-v2
服务,它们仍然指向未修改版本的数据库 (postgres v1):
从这张图中,可能需要 person-v2
指向数据库才能建立 TCP 连接,但由于代码和数据库模式之间的不兼容,它可能会失败。但由于所有传入流量仍定向到 person-v1
,这不是问题。
我们现在修改数据库(到 postgres v2)并将流量切换到 person-v2
(文章中的第 4 步)。 我假设数据库迁移和流量切换同时发生?这意味着person-v1
无法与postgres v2通信或person-v2
无法通信在此过渡期间的任何时候使用 postgres v1?因为这显然会导致错误(即在不存在的列中插入数据 yet/anymore)。
如果上述假设是正确的,那么如果在数据库迁移期间将新数据插入到 postgres v1 中会发生什么情况?数据是否有可能因时间不巧而丢失?仅仅因为流量切换与数据库切换同时发生,并不意味着 person-v1
中任何正在进行的进程仍然不能执行数据库语句。在我看来,只要迁移仍在进行中,任何新的 inserts/deletes/updates 都需要传播到 postgres v2。
即使在为应用服务器做蓝绿时,您仍然必须遵循数据库模式兼容性的正常规则。无论您认为一个完整的发布周期是什么,所有架构更改都需要向后兼容。两种服务在切换期间与同一个数据库通信,但由于仔细规划,每个服务都可以理解对方的数据,一切都很好。
I am reading about blue green deployment with database changes on Kubernetes. It explains very clearly and in detail how the process works
这篇文章很有趣。但我不会按照那里的描述进行数据库迁移。蓝绿部署并没有让这变得更容易,你不能自动交换流量,因为副本仍然可能处理旧版本上的请求——你不想削减正在进行的请求。
数据库更改必须以不破坏代码的第一个版本的方式进行。也许这必须分多个步骤完成。
考虑同一个例子,有多个不同的解决方案。例如。首先使用新的列名添加 view,然后部署使用该视图的代码版本,然后更改列名,最后部署使用该视图的较新版本的代码新的列名。或者,您可以 添加 具有新列名的列 除了 旧列名,并让旧版本的代码仍然使用旧列-names 和新版本的代码使用新的列名,最后在 没有 运行 旧代码的副本时删除旧的列名 .
如上所述,滚动升级和蓝绿部署都可以实现