我想将我的网站转移到新主机。我已将所有内容移至那里,但希望在 DNS 指向新名称服务器时尽量减少数据库损失。
我怎样才能做到这一点?
更多细节:
将文件和数据库转移到新主机。
将 DNS 记录更改为新的名称服务器,需要一些时间来更新!
我需要:将旧服务器上的站点指向新服务器上的新数据库,这样任何新数据都不会丢失!
答案1
我经常进行这些迁移。不停机是很难的,但停机时间很短或几乎不可察觉是可能的。一般的想法是:
- 做一个热备份将原始服务器的整个文件系统复制到新服务器;这是原始服务器仍在工作时的完整工作副本(在 LAMP 服务器:在原始服务器上运行 mysqldump,然后通过 rsync 将整个文件系统传输到目标服务器)
- 1/ 将origin 处于只读模式(
shell> mount -remount o,ro /path/to/fs
+mysql> flush tables with read lock
)如果应用程序处理得当,或 2/显示维护页面 - 做一个冷增量备份即重新转储 SQL 并仅传输自热备份以来修改的内容。使用 rsync,成本仅取决于目标上的 inode(文件)数量,因为必须对它们进行修改测试;这很少是带宽问题。根据我的经验,在具有 100 - 500k inode 的 1 - 10 GB 站点上,此增量备份需要 1 秒到 1 分钟。
- 设置原点的反向代理将所有流量重定向到新目标。您已完成,如果出现问题,您可以在几秒钟内回滚(删除原始服务器上的反向代理部分)。显然,您已经准备好配置,因此只需简单调用
apachectl graceful
即可应用它。 - 如果一切顺利,您可以完成迁移并更新您的 DNS(我通常在 24 小时后执行此操作)。然后等待流量停止从原始服务器流出(通常再过 24-48 小时)。
细节比较棘手,但当你的工作是你自己并且习惯了它时,它实际上很容易。除了知道如何运行“rsync”、“mysqldump”以及在 Apache 中用几行代码设置反向代理之外,你就大功告成了。
通常,您必须调整一些与原始服务器和目标服务器不同的内容(例如主机名)。在这种情况下,我编写了一个小脚本,自动执行备份部分和“修复”(使用 sed、perl 等)。您rsync -a --delete
可以使用相同的脚本进行热备份和冷备份。
这件事的好处是你不依赖 DNS。根据我的经验,DNS 托管总是很糟糕,或者几乎不受网站所有者的控制。许多 DNS 提供商的 DNS 更新是不可预测且不可调试的。大多数缓存 DNS 服务器都会忽略或破坏 TTL。您会遇到这个有趣的时间窗口,许多人看不到使用相同名称的同一服务器,这会造成非常糟糕的客户关系。将 DNS 排除在外对我来说是一个巨大的胜利(除非我可以直接托管 DNS 区域,然后我就可以 100% 控制,但那是另一回事)。
答案2
实现零停机非常困难,但尽量减少停机时间却相对简单。
设置站点与单独的数据存储同时运行,对旧系统进行快照,切换 DNS 记录,然后当您对 DNS 更改已传播感到满意时,将自旧站点快照以来积累的数据迁移到新站点。
允许从旧系统访问新系统的数据存储,后台同步新站点存储,禁用新旧站点的处理,重新同步数据以使其恢复在线,切换 DNS 以指向新站点,并(同时)更改旧站点以使用新存储
为新站点设置备用域名(例如 new.example.com 以及 www.example.com),但不允许在新名称上进行任何事务处理。后台将存储同步到新箱或复制快照。禁用旧机器上的所有事务处理,然后重新同步数据。在新机器上启用事务处理(两个名称)配置旧机器,以便将所有 HTTP 请求重定向到新机器上的新名称,并在两个系统的 HTML / 逻辑层中重写所有硬编码 URL,以使用 new.example.com 代替 www.example.com。一旦不再使用旧机器,将 URL 恢复为 www.example.com
这不是一件小事,但使用正确的工具,它应该能够自动完成大部分工作。如果您使用数据库序列生成器/MySQL 的自动增量列,那么您将需要一个防止冲突的计划。
答案3
我以前的做法是在两个数据库之间进行主↔主复制。这样,无论传入流量到达哪个实际服务器,数据库更新都会在两个服务器上进行。
复制是一个非常深入的主题,无法在这里完全涵盖,并且在 DNS 更新之前您现在也没有足够的时间,但无论下一步是什么,这都是一个好主意。
答案4
我是这样做的:
- 在旧主机上进行完整备份
- 将其备份上传至新主机。
- 在更改名称服务器之前,我将数据库从旧主机上传到新主机。
- 已更改名称服务器。
- 在旧主机上制作了“建设中主页”。
大约 2 小时后,域名就指向了新主机。