如何准备生产网站中的数据丢失?

时间:2011-05-10 16:57:09

标签: ruby-on-rails ruby-on-rails-3 heroku backup data-loss

我正在构建一个快速投入生产的应用程序,我担心由于黑客行为,一些愚蠢的个人错误(如运行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 个答案:

答案 0 :(得分:6)

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

  1. 多站点。如果火灾,洪水,Osama Bin Laden或者Whathaveyou袭击了Heroku使用的亚马逊(或者是Salesforce?)数据中心,您希望确保您的数据在其他地方是安全的。
  2. 将数据持续复制到单独的站点(或多个站点)。这意味着在一个站点上写入数据库的每个事务都会在几秒钟内复制到另一个站点上的镜像数据库。大多数RDBMS都有机制让你像这样进行主从复制。
  3. 对于您在数据库之外的文件系统上放置的任何内容都是如此,例如图像,XML配置文件等.S3是一个很好的解决方案 - 它们会将所有内容复制到多个数据中心。
  4. 创建数据库的定期(每日左右)转储并单独存储(例如在S3上),我不会受到伤害。这有助于您从传播到从DB的数据损坏中恢复。
  5. 自动执行数据恢复过程。您希望这在您需要时才能正常工作。
  6. 测试一切。理想情况下,您希望自动执行测试过程并定期运行它以确保备份可以恢复。 Netflix Chaos Monkey就是一个极端的例子。
  7. 我不确定你是如何在Heroku上实现这一切的。对于大多数公司来说,一个完整的解决方案仍然无法实现 - 我们在我们自己的数据中心(一个在美国,一个在欧盟)运行,并且成本高达数百万美元。根据80-20规则工作 - 正在进行的备份到一个单独的站点,加上经过充分测试的恢复计划(持续测试您从备份中恢复的能力)覆盖了您所需的80%。

    至于支持用户,最好的解决方案就是在发生故障时及时,真实地进行沟通,确保不丢失任何数据。如果您的用户为您的服务付费(即您不支持广告),那么您可能应该有SLA。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

除了Hartator的回答:

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

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

  • 为您的源代码使用一个好的版本控制系统,例如GIT中

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

  • 让您信任的人检查您的防火墙设置以及系统的安全性

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

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

答案 3 :(得分:0)

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

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

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

如果您可以并行运行两个应用程序副本,则可以自动执行此练习并根据您的数据丢失容限定期复制(例如每小时一次)。