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

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

TL;TR

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

详细信息

我有一个“Windows Server 2008”实例“EC2“在亚马逊 AWS 上有两个EBS 卷和系统驱动程序C:D:

在驱动程序上C:运行操作系统,在D:驱动程序上运行网络服务,我只需要备份D:

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

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

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

每次请求时,此应用程序都会将一些文件(会话文件和日志文件)写入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 任务中每晚执行的批处理文件,例如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 /Q D:\dir\flag\read_only_mode.txt

(更多信息Windows 同步Amazon CLI

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

我是 AWS 新手,如果有任何其他建议,我们将不胜感激!

对不起,我的英语不好

答案1

理论上,对于您的 EBS 快照持续的,则在开始创建快照时,您无需运行任何有状态的应用程序。遗憾的是,Windows 本身可以被视为有状态的,这可能会造成一些混乱,特别是如果您使用写入缓存。

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

  • 快照过程的“快照”部分是立即完成的,您无需在快照待处理的整个时间内禁用写入。大型卷可能需要数小时才能完成快照,但这只是备份或者复制快照的一部分。只要 Amazon 在此过程中没有断电,最终快照将是快照时磁盘上的数据。
  • 快照是异步拍摄的。因此,命令行工具在创建快照时不应阻塞,并且其返回与快照状态无关。

不过,考虑到所有因素,这通常不会引起重大问题。一致性问题通常很小。让人们感到困惑的主要问题是缓存问题。如果您在操作系统或应用程序中启用了磁盘写入缓存(默认情况下在 Windows 中启用),仅仅因为您认为已将文件写入磁盘,并不意味着文件已完成写入。

另一个让人困惑的主要问题是事务。例如,如果您正在创建一个允许上传文件的网站,那么您的问题将与流程中发生的快照有关。一个常见的例子是数据库记录存在,表明文件“1234”已上传到“d:/files/1234”,但该文件不存在,因为在发生快照时文件尚未完成复制到该位置,但数据库记录已经提交。

人们对此感到困惑的一件事是“一致性”一词,它不是指恢复快照的能力。您始终能够从快照创建卷,问题是您的应用程序是否能够了解它之后的状态。

例如,如果您在 Windows 更新过程中对 Windows 系统驱动器进行 EBS 快照,则最终会发现有些文件已更新,而有些文件未更新。幸运的是,Windows 了解更新过程,应该会注意到更新失败并在启动时处理该问题。

如果您可以编写应用程序,使其不必担心文件部分写入磁盘(您是否关心日志条目是否丢失?),则您不需要使用只读模式。解决文件上传问题的一种方法是将上传文件夹与最终位置(在同一磁盘上)分开。文件上传完成并成功写入后,将文件移动到其静止位置。移动应作为文件“重命名”而不是逐字节复制来执行,并且应立即发生。如果文件从未到达其最终位置,则说明上传失败。

相关内容