如何在多租户应用程序中更新所有租户的所有架构?
Posted
技术标签:
【中文标题】如何在多租户应用程序中更新所有租户的所有架构?【英文标题】:How update in a Multi Tenant app all schema of all tenants? 【发布时间】:2011-02-27 09:37:28 【问题描述】:我正在开发一个多租户应用程序。我选择了“共享数据库/单独架构”方法。
我的想法是有一个默认架构(dbo
),并在部署此架构时,对租户的架构进行更新(tenantA
、tenantB
、tenantC
);换句话说,就是制作同步模式。
如何将租户的架构与默认架构同步?
我使用的是 SQL Server 2008。
【问题讨论】:
【参考方案1】:首先需要的是一个表或其他机制来存储模式的版本信息。如果没有别的,那么您可以将您的应用程序和架构绑定在一起。没有什么比针对错误模式的应用程序版本更痛苦的了——失败、损坏数据等。
如果版本不正确,应用程序应拒绝或关闭 - 如果版本不正确,您可能会受到一些反击,但可以保护您免受数据库损坏有价值数据的真正糟糕的一天。
您需要一种方法来跟踪更改,例如 Subversion 或其他东西 - 您可以从 SQL 导出初始架构。从这里开始,您将需要一种机制来使用 SQL 比较之类的好工具来跟踪更改,然后跟踪架构更改并匹配目标数据库中版本号的更新。
我们将每个增量保存在我们构建的升级实用程序下方的单独文件夹中。此实用程序登录服务器,读取版本信息,然后应用数据库中下一个版本的转换脚本,直到在其子文件夹中找不到更多升级脚本。这使我们能够将数据库升级到当前版本,无论它有多旧。如果有租户独有的数据转换,这些将变得棘手。
当然,您应该始终对写入外部文件的数据库进行备份,最好使用人类可识别的版本号,以便在脚本出错时找到并恢复它。最终它只会计划弄清楚如何恢复和恢复。
我看到新的 VS 2010 中有某种模式升级工具,但我没有使用它。这也可能对您有用。
【讨论】:
我正在考虑使用像 Migrator.Net 或 RikMigrations 这样的框架。因此,我可以在我的构建服务器中创建一个获取最新版本的构建并执行一个检查和更新我的模式的命令。我看到的一个问题是,当应用程序有很多租户时,更新模式的过程会很慢而且很危险。你认为呢?谢谢迈克 如果您可以在维护窗口期间关闭应用程序,这是最好/最简单的。不用担心数据更新等。您可以有多个实例备份和迁移到您的 sql 服务器。我们所做的是设置一个前门页面,而不是将特定版本的用户重定向到特定的服务器/路径。如果身份验证请求进来并且他们的数据库被标记为升级中,我们将他们重定向到“停机维护”页面并且不将它们传递给应用程序。一旦为他们备份,他们可以从身份验证重定向到具有新版本的服务器 我查看了 rikMigrations。我看到的遗憾是它没有办法使用 SP 或视图,可能是因为当任何 DDL 代码执行时这些更新。我们在当前脚本中包含删除所有这些工件的代码,然后为新架构重建它们。【参考方案2】:据我所知,没有同步模式的神奇命令。您需要使用一种工具 - 内置或购买(查看 Red Gate's SQL Compare 和 SQL Examiner - 您需要调整它们以比较不同的模式)。
不过,仅仅同步通常是一件棘手的事情。如果添加了一列,是否还需要用数据填充该列?如果您将一列拆分为两个新列,则必须有类似的转换代码。
我的建议是非常仔细地跟踪您针对 dbo 架构运行的任何脚本,并确保它们在适当的时候也针对其他架构运行。然后,您可以使用 SQL Compare 之类的工具作为偶尔的健全性检查来查找任何意外差异。
【讨论】:
我的想法是自动化这个过程。使用像 Red Gate 的 SQL Compare 这样的程序,该过程是手动的。谢谢。 实际上,SQL Compare 有一个 API 以及命令行功能,所以如果它只是保持结构同步并且(无论你使用哪种方法,这里都是重要的部分)如果你能想出关于同步如何工作的明确定义的规则,那么您应该能够使用 SQL Compare 将其自动化。以上是关于如何在多租户应用程序中更新所有租户的所有架构?的主要内容,如果未能解决你的问题,请参考以下文章
在多租户应用程序中如何检查应用程序在 Azure 门户中注册的租户数据?
在多租户应用程序中动态设置 Flask-SQLAlchemy 数据库连接