docker - 如何实现滚动更新和关系数据库?

标签 docker kubernetes relational-database continuous-deployment

我有一个使用关系 DBMS 的现有系统。由于各种内部原因,我无法使用 NoSQL 数据库。

该系统将获取一些将使用 Kubernetes 和 Docker 部署的微服务,目的是进行滚动升级以减少停机时间。后端数据层将使用现有的关系型 DBMS。微服务将遵循良好实践并在 DBMS 上“拥有”它们的数据存储。与此相关的一个大问题似乎是如何处理跨此管理数据库的结构。我做了我的研究:

所有的讨论似乎都停留在添加/删除列和数据迁移这一点上。没有讨论如何管理存储过程、 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/

相关文章:

amazon-ec2 - 如何在不使用弹性 beantalk 或 ec2 容器服务的情况下在 aws 上部署 docker 容器

azure - 将 Azure 磁盘附加到 AKS pod 时出现权限错误

php - 将用户表的架构从旧设计更改为新设计

linux - 使用 docker for mac 在 docker 容器中公开 TTY 设备

azure - 如何在Azure上链接docker容器?

google-cloud-platform - ERROR : (gcloud. beta.container.clusters.create) ResponseError : code=400, message=v1 API 无法用于访问 GKE 区域集群

linux - linux如何将数据包转发给k8s服务

mysql - 这有意义吗/如何在(MySQL)数据库之间共享数据?

MySQL 关系数据库,具有每个用户独有的大型数据集

docker - 无法为 windows 安装 docker