16

我正在构建一个快速投入生产的应用程序,我担心由于黑客攻击、一些愚蠢的个人错误(如运行rake db:schema:loadrake db:rollback)或其他情况,我们可能会在一个数据库表甚至整个系统中遭受数据丢失。

虽然我认为上述情况不太可能发生,但我没有做好准备以防万一。

我正在使用 Heroku 的 PG 备份(本月将替换为其他内容),并且我还对 S3 运行自动每日备份:http: //trevorturk.com/2010/04/14/automated-heroku-backups/,成功生成.dump文件。

处理生产应用程序数据丢失的正确方法是什么?

  1. 如果需要,我将如何恢复.dump文件?如果系统的一小部分被击中,我可以进行选择性恢复吗?
  2. 如果无法进行选择性恢复:假设一个表在上次备份 4 小时后丢失数据。结果 => 修复丢失的表是否需要回滚 4 小时的用户活动?有什么好的解决办法吗?
  3. 如果发生这种情况,在不便中支持用户的最佳方式是什么?
4

4 回答 4

6

完整的 DR(灾难恢复)解决方案需要以下内容:

  1. 多站点。如果火灾、洪水、奥萨马·本·拉登或其他什么袭击了 Heroku 使用的 Amazon(或者是 Salesforce?)数据中心,您需要确保您的数据在其他地方是安全的。
  2. 将数据持续复制到一个单独的站点(或多个站点)。这意味着在一个站点上写入您的数据库的每个事务都会在几秒钟内复制到另一个站点上的镜像数据库。大多数 RDBMS 都有机制让您进行这样的主从复制。
  3. 这同样适用于您放在数据库之外的文件系统上的任何内容,例如图像、XML 配置文件等。S3 在这里是一个很好的解决方案——它们为您将所有内容复制到多个数据中心。
  4. 创建数据库的定期(每天左右)转储并将它们分开存储(例如在 S3 上)不会有什么坏处。这有助于您从传播到从数据库的数据损坏中恢复。
  5. 自动化数据恢复过程。您希望它仅在需要时起作用。
  6. 测试一切。理想情况下,您希望自动化测试过程并定期运行它以确保您的备份可以恢复。Netflix Chaos Monkey就是一个极端的例子。

我不确定您将如何在 Heroku 上实现所有这些。对于大多数公司来说,一个完整的解决方案的价格仍然遥不可及——我们在我们自己的数据中心(一个在美国,一个在欧盟)运行它,而且成本高达数百万。根据 80-20 规则工作 - 持续备份到单独的站点,加上经过良好测试的恢复计划(不断测试您从备份中恢复的能力)涵盖 80% 的需求。

至于支持用户,最好的解决办法就是在遇到问题时及时如实沟通,确保不丢失任何数据。如果您的用户为您的服务付费(即您没有广告支持),那么您可能应该有一个 SLA。

于 2011-05-10T18:41:59.773 回答
0

关于备份,您无法确保每次都不会丢失 100% 的数据。最好是在另一台服务器上测试它。您必须至少有两种类型的备份:

  • 数据库备份,例如 pg-dump。转储是唯一的 SQL 命令,因此您可以使用它来重新创建整个数据库、一个表或几行。您会丢失同时添加的数据。

  • 代码备份,例如 git 存储库。

于 2011-05-10T18:06:40.193 回答
0

除了 Hartator 的回答:

  • 如果您的数据库提供复制,请使用复制,例如至少具有一个从属的主/从复制

  • 在从属数据库服务器上进行数据库备份并将它们存储在外部(例如 scp 或 rsync 将它们从您的服务器中取出)

  • 为您的源代码使用良好的版本控制系统,例如 Git

  • 使用可靠的部署机制,例如 Capistrano 并编写您的自定义任务,因此没有人需要手动进行数据库迁移

  • 让您信任的人检查您的防火墙设置和系统的一般安全性

DB-Dump 包含用于重新创建所有表和所有数据的 SQL 命令......如果您只恢复一个表,您可以从转储文件的副本中提取该部分并(非常小心地)编辑它,然后使用修改后的转储文件(一张表)。

始终首先还原到独立机器并检查数据是否正确。例如,您可以使用一台从服务器,如果脱机,然后在本地恢复并检查数据。很好,如果您的系统中有两个从站,那么当您恢复到第二个从站时,剩余的系统仍然有一个主站和一个从站。

于 2011-05-10T18:14:54.577 回答
0

要在 Heroku 上模拟一个相当简单的“全面灾难恢复”,请创建另一个 Heroku 项目并完全复制您的生产应用程序(使用不同的自定义域名除外)。

您可以将多个远程 git 目标添加到单个 git 存储库,以便您可以使用当前的生产代码库。您可以将数据库备份推送到复制的项目,然后就可以开始了。

本练习与真正的灾难恢复相比,唯一缺少的步骤是将您的生产域分配给复制的 Heroku 项目。

如果您有能力并行运行应用程序的两个副本,您可以自动执行此练习,并根据您的数据丢失容限让它定期(例如每小时、每天)自我复制。

于 2011-05-13T07:13:49.447 回答