【问题标题】:Hot vs cold mysql schema migrations and improving speed热与冷 mysql 模式迁移和提高速度
【发布时间】:2015-01-14 13:59:26
【问题描述】:

我最近一直在进行冷迁移...这意味着我在迁移时无法从应用程序级别读取/写入数据库(维护页面)。

这样,结构更改不会发生错误,而且如果负载很大,我也不希望 mysql 在迁移过程中崩溃。

我的结构是每个客户都有自己的数据库。这种方法的唯一缺点是停机时间可能为 15-45 分钟,具体取决于进行了多少更改。

我的解决方案如下:

同时运行 2 个代码副本。我有代码可以检测他们所使用的程序版本,如果他们仍然在旧版本上,则向他们展示旧代码......如果他们在新版本上,则向他们展示新代码

唯一让我害怕的部分是,如果有人在迁移过程中进行拒绝服务攻击,我可能会遇到严重问题。

我现在有大约 360 个数据库。

推荐热法吗?我只是担心中间的拒绝服务或某种 mysql 查询错误,因为它们可能是正在进行的数据更改。我以前确实发生过这种情况,但幸运的是就在我开始迁移之前。

【问题讨论】:

  • 第一件事,如果有人在服务器关闭时试图访问该页面,您可以提供一个页面,上面写着它关闭了一个小时以进行临时维护(所以如果冷更新就好了,如果你这样做了...我之前访问过这样的页面,因为停机时间只有 45 分钟,所以看起来时间不会太长)...第二件事,你为什么要存储数据每个客户端在一个单独的数据库中?每个客户的内容/存储需求是否很大?看起来你应该能够有比这更好的设置。
  • 我有一个销售点系统,每个客户都有自己的数据库,我一个一个地迁移它们。它使每个客户端的所有内容都是独立的,并且易于携带。我测试了我的迁移策略,它似乎工作得很好。大约需要 30-45 分钟,但基本没有停机时间。

标签: mysql database-migration


【解决方案1】:

只有当“新代码库”与“旧数据库版本”100% 兼容时,您的想法才有效,否则它可能会在数据库迁移过程中崩溃。此外,它要求在数据库迁移期间的任何阶段,数据库都永远不会处于不一致状态(可能通过将迁移步骤包装在适当的事务中)。

如果资源允许,我会:

  • 在新的虚拟主机下安装和配置新的代码库,指向新的数据库(见下文)
  • 将“旧”网站置于只读模式
  • 在同一数据库服务器上复制当前数据库
  • 将重复的数据库迁移到新版本
  • 将虚拟主机切换到新的代码库(确保解除维护模式:)
  • 让新版本成熟几个小时,然后丢弃旧代码库、数据库和虚拟主机。

(您甚至可以跳过对虚拟主机的修改,而改用符号链接)

【讨论】:

  • 您能解释一下“在数据库迁移期间的任何阶段,数据库都不会处于不一致状态”的意思。此外,我正在考虑破坏新旧两个代码库。一旦我发现迁移完成,我会将它们切换到新的。
  • 我在考虑事务一致性。很抱歉,目前我无法提出特定于数据库迁移的实际示例。但是出于同样的原因,在应用程序的正常生命周期中需要事务,应用到实时服务器的迁移查询可能需要事务。毕竟,迁移查询与任何其他查询没有什么不同。
  • 简而言之:您的初始方法要求 1. 整个数据库迁移过程是原子的(一个大事务中的所有内容),或者 2. 代码支持数据库可能存在的任何状态,即在迁移之前、期间和之后。我更喜欢 1.,并通过在另一个数据库中执行此操作(我建议的方法在某种程度上手动实现了 database-wide doublewrite-buffer)。
猜你喜欢
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
相关资源
最近更新 更多