【问题标题】:Multi-tenant website, separate databases - how to roll out schema/shared data updates?多租户网站、独立数据库 - 如何推出模式/共享数据更新?
【发布时间】:2012-01-14 20:57:09
【问题描述】:

我们有一个多租户系统,每个租户都有一个单独的数据库(但具有相同的架构和应用程序代码)。我们如何才能最好地向租户推出更新?部署过程是自动化的,但我并不特别喜欢在每个租户数据库运行任何更新脚本时让整个系统脱机? (特别是如果一个租户由于系统中的数据而出现一些意外问题 - 显然这是我们的目标)。

人们为此成功使用了哪些策略?如果我改为在单独升级的单独网站实例上运行每个租户 - 将会有更多的维护开销,但升级时可能会遇到更大的灵活性问题?不确定从长远来看哪个可能会减轻痛苦?谢谢。

【问题讨论】:

  • 从您的问题描述来看,您的设置似乎是单租户,而不是multi-tenant setup
  • @Gruber 数据库实例是独立的,但只有一个应用程序实例 - 可能只是进入语义,以确定这是否是真正的多租户?

标签: database deployment multi-tenant


【解决方案1】:

我们处理这个问题的方法:

  • 有两个实例,一个运行旧代码,一个运行新代码
  • 开始(显然)所有租户站点都指向旧版本
  • 循环租户(可能自动)
  • ....复制数据库到临时
  • ....在数据库副本上运行更新
  • ....清洗、漂洗、重复直到数据转换成功
  • ....用临时转换的数据库测试新代码
  • ....删除临时数据库
  • ....使租户站点脱机
  • .... 在真实数据库上运行更新(这应该可以工作,除非最后一分钟的更改引入了新问题)
  • ....将租户站点指向新代码/转换后的数据库的组合
  • 结束循环

到目前为止,这一直运作良好,事实上它经常拯救我们的培根:问题往往会出现在前几个租户中,这可能会提示新代码中的一两个错误修复。

【讨论】:

  • 如何处理切换过程中发生的数据库更新?复制数据库需要时间。我们通常在升级过程中将应用程序置于只读模式
  • 第一次(复制到临时数据库)我们只是复制(mysqldump 和朋友),任何不一致都将被视为更新/检查脚本的一部分。第二次(真正的切换)我们让这个租户的应用离线。
  • 如何将用户路由到新实例?
  • 我们将旧的网络服务器配置为代理到新的。
猜你喜欢
  • 2014-01-16
  • 2012-12-14
  • 2019-05-18
  • 2014-03-21
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 2013-10-11
相关资源
最近更新 更多