提高EBS快照支持卷的I / O速率

我正在使用一个系统,为了灾难恢复的目的,每个卷需要一组42个每日EBS快照。 EBS卷被聚合到一个RAID卷中。 通过在拍摄快照期间冻结文件系统来拍摄一组一致的快照。 每个单独的数量只有2个TiB。

在灾难恢复testing期间,发现从应用数据(PostgreSQL数据库,许多大型表)中复制超过24小时的应用数据(PostgreSQL数据库,许多大表),从快照创build的EBS快照支持的卷中复制到新的非快照支持卷支持卷。 由于在不同的子树上同时工作了8个rsyncs,所以在副本中具有相当的并行性。

如果数据没有被复制到新的EBS卷上,那么基于PostgreSQL的应用程序就像蜂蜜一样运行了很多天,据推测,直到EBS卷的块已经被弄脏,所以它们现在直接在EBS卷上,而不是来自快照。

通过这种方式,从一组非快照支持的EBS卷到另一个卷的相同数据的副本只需要几个小时,而使用类似规模的“真实”硬件就可以less得多。

为什么我会看到快照支持的卷和普通卷之间的这种极端的性能差异?

我的假设是,它正在写拷贝,所以干净的块,因为快照必须单独提取保持不变。 如果有大量的快照支持这个卷,那么大概有一些困难,快速find它出现在最近的快照中的块并获取它。

有没有什么办法可以强制AWS从快照中有效且线性地预先填充整个新的EBS卷,而不是像实际上似的那样进行懒惰的写入时复制?

任何其他的想法解决这个? 如果恢复需要一天以上的时间,DR的一组快照则不太有用。

从恢复的卷阅读应该是足够的。

从现有快照创build卷时,会在后台加载,以便您可以立即开始使用它们。 如果您访问尚未加载的数据,则卷会立即从Amazon S3下载所请求的数据,然后继续在后台加载剩余的数据。

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSSnapshots.html

有趣的是,看起来像使用dd顺序“强制读取”比从文件系统中读取更多的随机读取要好,但是你当然可以同时执行这两个操作 – 继续安装并开始执行无论你需要如此,也可以用dd从块设备中读取和丢弃。

这种明显的区别是有道理的,特别是如果EBS快照基础架构实际上不将快照块存储在“块”大小(4096字节)的块中。 这似乎是一个相当低效的devise,每兆字节需要数千个操作。

如果您以不同的偏移量开始进行多个顺序读取,它可能会进一步改善恢复。 未经testing,但gnu dd显然可以“跳过”块,并从头开始阅读。

但是,你绝对不需要创build“新鲜”卷。 一旦块被读取加载,它们就在EBS中,而不是来自快照。

如果有大量的快照支持这个卷,那么大概在快速find最近的快照并获取它的快照时会遇到一些困难。

它支持它有多less快照应该无关紧要。 数据不会“存储”在快照中。 每个快照都包含完整的logging,我将随便地调用指向构成它的所有数据块的“指针”(不仅仅是更改的数据块),而且可能是存储在快照基础结构使用的后备存储(S3)中的位置。

如果从同一卷中获取快照A,B和C,然后删除快照B,则从A更改为B但不更改为B的所有块仍可用于恢复快照C,但是,当你删除快照B时,它们不是从字面上从B移到C.

删除快照时,EBS会使用引用计数清除不再需要的块的后备存储。 未被任何快照引用的块在后台通过多步骤处理,首先将它们标记为不需要,这会停止为它们计费,然后在几天后真正删除它们,因为它们是真正的在recount = 0已被确认。 资源。

因此,最初为恢复的卷提供块的快照数量不应有任何影响性能的原因。