我正在构建一个快速投入生产的应用程序,我担心由于黑客行为,一些愚蠢的个人错误(如运行rake db:schema:load
或rake db:rollback
)或其他情况我们可能会在一个数据库表甚至整个系统中丢失数据。
虽然我发现很可能上述情况会发生,但如果它没有做好准备,我将会失职。
我正在使用Heroku的PG备份(本月将替换为其他内容),我还运行自动每日备份到S3:http://trevorturk.com/2010/04/14/automated-heroku-backups/,成功生成.dump
个文件。
在生产应用上处理数据丢失的正确方法是什么?
.dump
文件?如果系统的一小部分被命中,我可以进行选择性恢复吗?答案 0 :(得分:6)
完整的DR(灾难恢复)解决方案需要以下内容:
我不确定你是如何在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项目。
如果您可以并行运行两个应用程序副本,则可以自动执行此练习并根据您的数据丢失容限定期复制(例如每小时一次)。