如何备份AWS EC2实例/临时存储?

19

我的数据库保存在/mnt目录下,使用ec2实例提供的临时存储。使用ec2 api工具进行备份需要卷ID,但是在aws控制台中我只能找到8GB根存储的卷ID。

如果我想备份临时存储,该怎么办?有没有其他备份实例存储的替代方案?


嘿@Smita,你成功备份了EBS上的EC2实例存储吗?(我现在几乎遇到了同样的问题) - Jadav Bheda
4个回答

32
首先,除非您确切知道自己在做什么并准备始终具有时点备份等措施,否则您不应该将任何具有持久价值的内容存储在Amazon EC2中的短暂存储器上。您的问题似乎表明您可能对临时存储的概念、Amazon EC2 Instance StorageAmazon EBS之间的差异以及数据安全和备份要求方面的重大影响存在误解。
临时存储将在停止/启动循环中丢失并且通常会消失,因此绝对不要把任何有价值的东西放在那里,即只放置可随意丢失或轻松重建的临时数据,例如交换文件或计算过程中使用的严格临时数据。当然,您可能会在那里存储巨大的索引,但必须准备好在存储由于任何原因(实例重新启动,硬件故障等)被清除后重建这些索引。

  • 这是Eric Hammond在您应该在Amazon EC2上使用EBS引导实例中总结的许多原因之一,其中概述了两种存储概念的历史和差异,并评估了临时存储的少数可能剩余的好处(主要是丰富和免费)。

问题/解决方案

这些解释应该能够澄清为什么您无法使用仅适用于EBS卷(即EBS快照)的机制备份临时存储卷。因此,您可以通过您选择的常规操作系统级备份工具备份前者,其中Duplicity是一个流行的选择,可选地支持Amazon S3,例如在我对Easiest to use backup software for live linux server的回答中提到。

谢谢您的澄清。另外的解决方案确实非常有帮助 :) - Smita

7
短暂存储,或称实例存储,就像一个 /tmp 文件夹,其中的内容在重新启动后会消失。当然,短暂驱动器内容不会在软重启时被销毁,但应该将其视为已销毁,因为您无法真正控制或预测实例何时会死亡。
这已经指出过了。
我想指出的是,如果您创建和配置适当的 AMI,则仍然可以使用短暂存储来大幅提高(读取)吞吐量,只要您还保留 EBS 驱动器用于实际存储。
目前我正在使用 Linux(Ubuntu Tahr)实例与 bcache。这主要是因为 bcache 内核支持相对较新(如果我没记错的话,第一个带有 bcache 的内核版本是 3.10),而且您肯定希望使用尽可能新的内核。此外,Tahr 是 Ubuntu 的下一个 LTS 版本,在我的项目即将上线时它已经发布了最终版 ;)
Bcache在默认配置下,允许您享受临时存储的读取速度,同时提供EBS的持久性:它使用快速缓存设备(临时SSD)来加速慢速设备(EBS),通过缓存设备进行写入(即同时写入临时缓存和EBS)。
这意味着,如果一个实例崩溃或停止,您仍然可以直接挂载EBS卷而无需使用缓存,并像使用EBS卷一样访问所有数据。您还可以重新配置已清除的临时设备,并将它们重新配置为EBS的缓存,以便重新享受非常快速的读取和查找。
我的特定设置是两个EBS设备,在mdadm中以条带模式组成+两个ephemeral SSD设备也以相同方式组成。然后,我使用临时阵列作为缓存,使用EBS阵列作为“备份”设备来配置它们。EBS驱动器可以是任何大小,并且您始终可以扩展它们(EC2有点棘手,因为您必须创建当前EBS卷的快照,然后基于该快照创建新的更大的卷,您不能调整现有的EBS卷的大小)。
当然,您需要创建一个脚本,在实例启动时运行,以配置临时存储并将其附加为缓存设备到您的EBS备份设备。我建议阅读并尝试使用mdadmbcache
值得一提的是,使用Cassandra压力测试工具,我使用EBS卷与临时驱动程序bcached获得了更好的读取性能,而不仅仅是条带化临时驱动程序。这是因为bcache中使用的算法非常聪明。
使用临时驱动器作为缓存还可以减少网络流量,并且具有成本效益,因为它减少了对EBS的I/O,从而减少了您的每月账单。
还请注意bcache提供的不同类型的缓存。
  1. 回写:将SSD用作读/写设备,并仅在需要从高速缓存中驱逐页面时写入备份设备。这对于EC2临时设置有用,因为它会在崩溃或停止时使备份设备无法使用。
  2. 直写:所有写操作都同时写入高速缓存和备份。这确保备份设备始终与高速缓存设备一样更新,并且可以始终在没有高速缓存设备的情况下使用。对于EC2非常有用。
  3. 旁路写:所有写操作直接写入备份设备,并且在未来某个时间发生数据读取请求之前不会写入高速缓存设备。只有读取才会被缓存到高速缓存设备上。这与直写一样安全,并且在您知道您的写操作不太可能在不久的将来被读取时非常有用。这避免了用不太常请求的数据填充高速缓存设备,以便为请求频率更高的数据腾出更多空间。一些例子可以是文件上传服务器、您写入大量日志数据的系统等。如果您知道整个数据集明显大于临时存储的大小,则这很可能是许多用例中最有效的选项。

1
我知道这篇文章已经发表8年了,但是真是一篇好文章!现在你可以动态调整EBS磁盘的大小,并且有许多新的实例类型具有广泛的实例存储(r5d、m5d、r5ad、m5ad、r6id、m6id、r6gd、m6gd)。这些选项使您的文章真正有价值,以提高性能。现在唯一困难的部分是编写cloud-init脚本,在重新启动时自动设置bcache。你有什么要分享的吗? - site80443
1
@site80443 当然可以 :) 就像你说的那样,已经过去8年了,所以我记不太清楚了。当时我是一家初创公司的少数合伙人,但现在这家公司已经不存在了,所以我很自信地分享我找到的代码。这是一种“不想被付款、探索和学习、没有时间、也想玩得开心”的代码,所以我预计会有些头痛和困惑,甚至可能会出现面掌声。但是请随意查看。我已经尽力删除了它,虽然这并不重要,因为所有服务器现在都已经停止运行,但如果您发现任何未删除的内容,请告诉我:https://github.com/DanielSmedegaardBuus/ec2-craycray-redacted - DanielSmedegaardBuus
1
虽然我不使用node、nginx或cassandra(我使用LAMP),但我在那个仓库中发现了很多有用的东西,特别是脚本和注释。非常感谢!另外,我已经通过电子邮件向您发送了看起来未经编辑的信息。 - site80443

2
如果您能够配置软件RAID镜像,您可以将EBS支持的磁盘附加到实例上,配置镜像,然后等待复制完成。我已成功使用此方法将“临时的”数据移动到EBS中,因为我已经创建了实例(而且我不想关闭和重启)。
当您在EBS上拥有数据时,请使用EBS映像进行备份。
当您在不同的相同实例上运行多个数据副本,但只需要将其中一个持久化到EBS时,这种方法特别有效(在我的情况下,使用Couchbase服务器,CB数据位于临时驱动器上,但其中一个实例被映射到EBS,以便我的集群上的所有数据最终都存储在EBS中)。

1
任何文件级备份解决方案(不基于EBS快照)都可以备份您的临时存储。尽管如此,您应该考虑何时使用临时存储,并有充分的理由将其用于持久数据。
对于某些应用程序,例如Cassandra,这是推荐的配置。在这种情况下,您的备份解决方案将主要从临时存储中转储数据到将被拍摄快照或直接到S3的EBS卷中。在某些情况下,您可以定义复制并确保所有临时设备中的数据也被复制到EBS卷中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接