AWS EC2实例(Windows Server 2008):每日EBS快照,无需停机

TL; TR

我需要在不停机的情况下备份AWS EBS卷。

在细节上

我在Amazon AWS上有一个“Windows Server 2008”实例“ EC2 ”,两个EBS卷为C:D:系统驱动程序。

C:驱动程序工作的操作系统,在D:驱动程序工程的Web服务,我只需要备份D:

该Web服务是一个Delphi的SOAP应用程序,用于根据请求下载一些文件,例如:

 http://www.example.com/dir/service.dll?filename=foo.zip 

(在这种情况下,Web服务使用位于D:\dir\files\foo.zip文件进行响应)。

在每个请求上,这个应用程序将一些文件(会话文件和日志文件)写入D:\dir\temp\ 。 这是一个问题,因为从AWS文档中获取使用卷的快照并不安全:

您可以拍摄正在使用的附加卷的快照 。 但是,快照仅捕获发出快照命令时已写入Amazon EBS卷的数据。 如果您可以暂停任何写入卷的文件写入快照,则快照应该完成

我的想法是在我的Web服务中实现一个只读模式,基于目录中文件的存在。

 procedure onRequest(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin FReadOnlyMode := FileExists('D:\dir\flag\read_only_mode.txt'); // ... other code 

在每个请求服务检查文件是否存在,如果它存在,服务器进入只读模式,不要写任何东西(没有日志文件,没有会话文件)。

备份策略基于Windows cron任务中每晚执行一个batch file,例如。 backup.bat

 :: 1. stop all web service writes operation echo.>D:\dir\flag\read_only_mode.txt :: 2. Use sync.exe for flush all data to disk D sync.exe d :: 3. Use Amazon CLI for snapshot the volume: aws ec2 create-snapshot --volume-id vol-XXXXXXXXXX --description "D snapshot." :: 4. Remove `read_only_mode` flag: del /F /QD:\dir\flag\read_only_mode.txt 

(有关Windows Sync和Amazon CLI的更多信息)

问题是:我的EBS快照是否一致?

我是新的AWS的任何其他build议表示赞赏!

对不起,我的英语不好

理论上,为了使EBS快照保持一致 ,在创build快照时,您将需要运行没有有状态的应用程序。 可悲的是,Windows本身可以被认为是有状态的,可以使事情变得一团糟,特别是如果你使用写caching。

有几个有趣但令人困惑的部分:

  • 快照过程的“快照”部分是立即完成的,不需要在快照挂起的整个过程中禁止写入。 大量卷可能需要几小时才能完成快照,但这只是快照的备份复制部分。 只要亚马逊在这个过程中没有遭遇断电,最终的快照就是快照时刻磁盘上的数据。
  • 快照是asynchronous获取的。 所以命令行工具在创build快照时不应该被阻塞,而且它的返回与快照状态无关。

然而,所有的事情,这通常不会造成重大问题。 一致性问题通常是一个小问题。 抓住人的主要问题是caching问题。 如果您的操作系统或应用程序启用了磁盘写入caching(默认情况下,它在Windows中),只是因为您认为已经将文件写入磁盘,并不意味着该文件已经完成写入。

抓住人的另一个主要问题是交易。 例如,如果您制作允许上传文件的网站,则问题将与通过该过程的部分途径发生的快照相关。 一个常见的例子就是数据库logging,现有的文件'1234'被上传到'd:/ files / 1234',但是不存在文件的文件在快照发生时还没有被复制到该位置,数据库logging已经提交。

有一点让人感到困惑的是在这个上下文中的单词一致性,它并没有提到恢复快照的能力。 您将始终能够从快照创build卷,问题是如果您的应用程序能够了解之后的状态。

如果你想在Windows更新过程中使用Windows系统驱动器的EBS快照,那么最终会更新一些文件而不是某些文件。 幸运的是,Windows了解更新过程,并且应该注意到更新失败并在启动时处理。

如果你可以写你的应用程序而不用担心文件被部分写入磁盘(你是否在乎日志条目是否丢失?),你不需要使用只读模式。 上传文件的一种方法是使上传文件夹与最终位置不同(在同一个磁盘上)。 file upload完成并成功完成后,将文件移至其rest位置。 移动应该以文件“重命名”的方式执行,而不是逐字节复制,并立即发生。 如果文件永远不会到达最终位置,则说明上传失败。