我有一个使用关系 DBMS 的现有系统。由于各种内部原因,我无法使用 NoSQL 数据库。
该系统将获取一些将使用 Kubernetes 和 Docker 部署的微服务,目的是进行滚动升级以减少停机时间。后端数据层将使用现有的关系型 DBMS。微服务将遵循良好实践并在 DBMS 上“拥有”它们的数据存储。与此相关的一个大问题似乎是如何处理跨此管理数据库的结构。我做了我的研究:
- https://blog.philipphauer.de/databases-challenge-continuous-delivery/
- http://www.grahambrooks.com/continuous%20delivery/continuous%20deployment/zero%20down-time/2013/08/29/zero-down-time-relational-databases.html
- http://blog.dixo.net/2015/02/blue-turquoise-green-deployment/
- https://spring.io/blog/2016/05/31/zero-downtime-deployment-with-a-database
- https://www.rainforestqa.com/blog/2014-06-27-zero-downtime-database-migrations/
所有的讨论似乎都停留在添加/删除列和数据迁移这一点上。没有讨论如何管理存储过程、 View 、触发器等。
该应用程序是用 .NET Full 和 .NET Core 编写的,以 Entity Framework 作为 ORM。
有没有人对如何使用作为完整生产系统的关系 DBMS 进行持续交付有任何见解?回到绘图板了吗?因为使用关系 DBMS 对于滚动更新来说“太难”了吗?
附言。尽管这是一个持续交付问题,但我也用 Kubernetes 和 Docker 做了标记,因为这将是用于事物的编排/容器方面的底层技术。
最佳答案
以下所有内容均假设我正确理解“滚动更新”的含义及其后果。
它与“关系 DBMS”几乎没有关系(如:完全没有关系)。包含 XML 的平面文件会让您面临完全相同的问题。您的“滚动更新”将不可避免地导致(希望是短暂的)服务器端组件(例如数据库)必须与“版本 0”以及(客户端组件)的“版本 -1”交互的)你的系统。
此处“相容性理论”(*) 介入。“工作系统”是这样一种系统,其中提供的服务集是所需服务集的超集(也许是真超集)。因此,如果“提供的服务”永远不会减少并且“所需的服务”永远不会扩展,则可以保证向后兼容性。然而,后者通常是当前“版本 0”移动到“-1”并且新的“当前版本 0”添加到混合中时总是发生的情况。所以结论是,“滚动更新”在理论上是可行的,只要在服务器端提供的“服务”只被扩展,并且总是以这样的方式成为,并且总是保持,所需服务的超集(当前正在使用的任何版本)客户端。
这里的“服务”要理解为非常抽象的东西。它可能指的是一种保证,例如,如果此表的这一行中的列 X 的值为 Y,那么我将使用计算出的键在另一个表中找到另一行-因此,可以保证其他行的列值满足这个或那个条件。
如果该“保证”作为客户端(新版本)的期望(即要求)引入,则您必须在服务器端执行某些操作才能遵守。如果该“保证”当前提供但相互矛盾的保证被引入作为客户端(新版本)的期望,那么根据定义,您的滚动更新方案将无法实现.
(*) http://davidbau.com/archives/2003/12/01/theory_of_compatibility_part_1.html
还有第 2 部分和第 3 部分。
关于docker - 如何实现滚动更新和关系数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51243156/