Amazon EC2备份策略有限制(可以采取快照或不快照)?

同样的问题已经被提出,但是我需要知道在这种情况下会推荐什么,以便知道我是否在使用EC2的时候错过了一些东西。

一家小型创业公司正在EC2networking上运行他们的业务,并要求我提供关于备份选项的一些build议。 他们目前正在自筹资金,并在可行的情况下尽其所能节约成本。 没有深入研究他们的系统configuration,我将以Web服务器为例。 这是一个简单的networking服务器与数据库。 蹭的是,他们不希望服务器被closures。

一直在做这个设置的人认为他们应该定期转储数据库并存储到S3上,或者创build脚本,在需要时在Amazon上重build一个新的服务器,方法是备份保存configuration信息的select文件夹。 他build议,创build服务器的快照将是浪费,因为他们占用大量的磁盘空间,本质上会有大数据转储之间的数据中断,所以快照会很快过时。

我的想法是拍摄虚拟机的快照,然后定期转储数据库并存储在S3中。 如果他们失去了EC2实例或者像更新渲染那样不可用,他们可以使用快照来build立服务器,并且使用最新的数据库转储来相对快速地备份服务器,而不是从头开始从完全build立一个新实例新的AMI。

我的理解是,拍摄一个EC2实例(或EBS商店)的快照将需要停机时间,这是他们犹豫不决。 我也读过,你应该closures服务器,以保持文件系统的快照时保持一致。 由于它们还没有位于平衡器之后的集群,所以这限制了涉及快照的选项。

编写服务器的脚本,除非我没有意识到亚马逊特有的东西,否则将涉及创build一个Chef或Puppet服务器,可以在EC2上部署新服务器及其相关angular色。 目前,创业公司没有资金来维持这种服务器,现在他们并不需要部署这么多的服务器。

理想情况下,他们将有资金在虚拟平衡器或Amazon平衡器服务之后创build大量服务器,然后逐个取下服务器以执行更新或快照。 现在我更想要做更新,因为如果你正在做数据库的转储,如果系统更新改变了应用程序所依赖的库和服务的closures,这将是无济于事的。

我还假设另一个select是运行一个创buildEBS卷的脚本,将其挂载,并在服务器上运行rsync等大部分文件系统信息到EBS卷,然后压缩并将内容复制到S3,断开卷并将其销毁以节省存储成本,然后执行数据库转储以捕获飞行中的数据,否则将会不一致。 对于他们的一些服务器来说,随着数据库需求的增长,很可能需要保存临时的EBS卷。

正在创build一个VMWare沙箱,以便在更新可以预先testing的环境中重新创build其networking系统,然后将其应用于Amazon的生产系统。 我希望这可以最大限度地减less系统更新会杀死他们的应用程序的可能性。

因此,考虑到在系统上运行一台服务器(数据库和应用程序服务器)的限制,尽可能地缩短停机时间(限制使用快照并使备份过程尽可能“热”在没有把服务器closures的情况下直接创build),我是否在错误的轨道上build议安排时间来创build处于工作状态的EC2实例的快照,并从那里做数据库转储以复制到S3?是否有更好的策略去追求在创build服务器的活动备份,如果快照将创build宕机?

这个问题有一些有趣的地方 – 特别是关于停机的想法。 部分原因是,如果应用程序对宕机时间敏感,那么还必须考虑恢复时间。(作为一个极端的论点,没有备份不需要停机,除非您碰巧需要这些备份,在这种情况下,停机时间可能会接近无限)。

一点关于EBS

EBS卷和快照在块级别上运行 – 即使EBS卷正在使用,也可以在实例运行时执行快照。 但是,只有实际在磁盘上的数据(即不在文件caching中)才会包含在快照中。 这是后一个原因,导致一致的快照的想法。

  • 推荐的方法是分离音量,快照,并重新附加它 – 通常不实际。
  • 下一个最佳select是将写入caching清理到磁盘,冻结文件系统并拍摄快照

这里有个有趣的地方就是,在上述两种情况下,您都不需要等待快照完成重新挂接/解冻并恢复写入磁盘 – 一旦快照已经启动,您的数据将与该时间点保持一致。 通常这只需要几秒钟的时间,您的磁盘被写入locking。 此外,由于大多数数据库都以合理的方式在磁盘上构build文件,因此插入对现有块的影响很小,从而最大程度地减less了添加到快照中的数据。

考虑备份的重点

EBS卷已经在可用区域内复制 – 所以内置了一定程度的冗余。如果您的实例终止,您可以简单地将EBS卷附加到新实例,并且(在经过缺乏一致性之后)恢复到您的位置离开。 在很多方面,这使得EBS卷很像一个不一致的快照,只要你可以访问它。 也就是说,大多数EC2用户可能都记得2011年初EBS卷的级联失败 – 多天内无法访问卷,有些用户也丢失了数据。

RAID1

如果您试图防止EBS磁盘发生故障(确实发生),您可以考虑使用RAID1设置。 由于EBS卷是块设备,因此可以轻松使用mdadm将其设置为所需的configuration。 如果其中一个EBS卷不符合规格要求,则很容易手动使其失效(之后将其replace为另一个EBS卷)。 当然,这也有不利的一面 – 每次写入的时间增加,对性能变化的敏感性增加,I / O成本增加一倍(单方面,而不是性能方面),对于更广泛的AWS故障没有真正的保护(去年的一个常见问题是无法分离处于locking状态的EBS卷),当然还有失败时磁盘的不一致状态。

S3FS

某些应用程序(绝对不适用于数据库)的选项是将S3挂载为本地文件系统(例如,通过s3fs)。 这很慢,缺乏文件系统所期望的某些function,并且可能不像预期的那样工作(最终的一致性)。 这就是说,为了简单的目的,例如使得上传的文件跨实例可用,这可能是有好处的。 很明显,这不适用于任何需要良好读/写性能的事情。

MySQL bin-log

另外一个特定于MySQL的选项可能是使用bin-log。 您可以设置第二个EBS卷,它将存储您的bin-log(以最大限度地减less添加的写入对数据库的影响),并将其与任何数据库转储结合使用。 你甚至可以用s3fs来做到这一点,如果性能是可以忍受的,那么它可能是有价值的(尽pipersync可能会比直接使用s3fs更好,你一定会压缩你所能做的)。

但是,我们再一次回到了有目的的想法。 考虑以上build议会发生什么情况:

  • EBS卷无法访问:
    • RAID1 – 无用,因为你无法访问数据
    • bin-log – 没用,除非你把它导出到S3 – 可能是延迟,但如果你这样做
  • 实例意外终止:
    • RAID1 – 您的磁盘可用,但不一致,您的数据库可能会自行从不一致中恢复
    • bin-log – 你的数据应该是可访问的,尽pipe你可能需要查看最后几个事件
  • 有人以root身份运行DROP DATABASE:
    • RAID1 – 你有一个不存在的数据库的两个完美的副本
    • bin-log – 你应该能够重放事件直到命令之前,所以你应该没问题

所以确实,RAID1基本上是无用的,而bin-log时间太长了 – 在某些情况下都可能有优点,但远非备份的想法。

快照

需要注意的是,快照是差分的,只存储包含数据的实际块(并被压缩)。 与EBS卷不同的是,如果您拥有20GB的卷,但只能使用1GB,则您仍然需要为“预置”存储(20GB)收费。 有了快照,你只需要支付你使用的费用。 如果快照之间没有数据变化,则(理论上)不收费。 (快照收取PUTS / GETS和使用的存储)。

另外,我强烈build议您的应用程序数据(包括数据库)不要存储在您的根卷(您可能已经安装)上。 其中一个优点是,希望根卷的变化最小,这意味着它的快照可以不那么频繁(或者将有最小的变化),从而降低成本和易用性。

同样重要的是,您可以随时删除旧的快照 – 即使它们有区别,也不会影响其他快照。 也就是说,分配给快照的每个块不会被放弃,直到没有仍然引用该块的快照。

定期转储的问题首先是转储之间的时间(可能通过使用MySQL的bin-log来解决)以及恢复的难度。 导入大型转储需要时间,并重放bin-log中的所有事件。 另外,创build转储并不是没有性能影响。 可以说,这样的转储可能需要比快照更多的存储空间。 build立一个EBS卷专为数据库和快照,这是在大多数方面是可取的(也就是说,快照也有一定的性能影响)。

快照和EBS卷的美妙之处在于它们可以在其他实例上使用。 如果您的实例无法启动,您可以将根卷附加到另一个实例来诊断和解决问题 – 或者只是将数据从中复制掉 – 并且可以在几分钟的停机时间切换根卷(停止实例,分离根卷,附加一个新的根卷,启动实例)。 这同样的想法适用于您的数据在第二个EBS卷上。 从本质上讲,你只需从自定义的AMI中启动一个新的实例,并将当前的EBS卷附加到它 – 这有助于最大限度地减less停机时间。

(可以使用两个EBS卷来设置参数(我可能不会推荐它),你可以在同一台服务器(主 – 从)上设置两个MySQL副本,然后closures你的从机来拍摄它的快照EBS量 – 这将是一致的,没有停机时间 – 但性能成本可能不值得)。

AWS有自动调节function – 可以保持不变的实例数量(即使这个数字是1) – 但是你可以从快照中部署 – 所以如果你的快照没有用处,那么前提是没有多大用处。

另外几点 – 您可以从单个快照中部署尽可能多的实例(与EBS卷不同,它只能在任何给定时间连接到单个实例)。 而且,EBS卷被限制在可用区域内使用,而快照可以在区域内使用。

理想情况下,使用快照,如果服务器出现故障,可以使用最后一个快照启动一个新的快照 – 特别是如果将根卷与数据分开,更新不良应该导致最短的停机时间(因为您只需要传输包含您的数据的EBS卷 – 并拍摄它的快照以保留任何可能由于不一致性而被破坏的内容)。

作为一个附带说明,亚马逊表示,自上次快照以来,EBS卷的故障率随着数据量的增加而增加。

最后的build议

  • 使用快照 – 他们是伟大的 – 他们减less宕机远远超过他们造成的
  • 分离数据和根卷,甚至可能将数据库放在自己的卷上,并在必要时进行更新
  • 使用bin日志尽可能保持“热” – 上传(压缩)到S3
  • 确保您实际上从实例获取数据(即使EBS卷上的数据完整无缺,卷本身可能暂时无法访问)。

推荐阅读:

  • 亚马逊在EBS上的页面
  • EBS常见问题解答

(我相信我写得太多了,但是没有说足够的 – 但是希望你find值得阅读的东西)。

可以对实时EBS卷进行快照 ,但必须注意确保文件系统处于一致状态,然后在启动快照时将其冻结。 并非所有的文件系统都允许这样做,尽pipe这绝对是可能的,也是我们自己备份解决scheme的基础。

EBS快照也相当便宜,因为它们只是为了更改数据而收费,数据收费本身是非常合理的。 请记住,这是基于块级别的变化,所以可以相当快地改变。 在快照之间也是如此,只有在快照之间改变的数据被收取。 为了给你一个成本的概念,我们每月支付10美元以下的快照存储,并且每天拍摄快照,保存最近7个日记本和最近几个月的每周快照,并且我们有2个服务器遵循这个scheme(大约20个快照, 20GB硬盘)。

如何便宜廉价的备份解决scheme,如Zmanda云备份? 我们使用它来备份大约6个服务器和1个SQL Server,每月只有大约10美元。 您可以使用自签名证书encryption您的数据,并使用s3来存储数据(因此,如果您从EC2进行备份,则不会收取数据传输费用)。