所以,我目前正在写我的学士论文,我的工作是将一个推荐图像配乐的网络服务云化。推荐过程的主要部分是查找一个~40gb的索引文件。索引文件是只读的,读取它应该尽可能快。我还想根据需求自动启动额外的实例。我做了一些研究,有3种可能的方法来实现它
- 增加 ec2 实例的根分区(至约 50gb),将索引文件存储在根分区上并创建 AMI。这种方法的好处是,由于所有内容都包含在 AMI 中,因此可以非常轻松地启动新实例。但我还读到根分区的速度非常慢。
- 将数据存储在 EBS 卷上,创建快照,每当我启动新实例时,我都会从快照创建新的 EBS 卷并将其附加到实例。我认为这是最好的方法,但启动新实例稍微复杂一些
- 将索引文件存储在 S3 上,每当启动新的 ec2 实例时,我都会将文件下载到该实例的临时存储中。这种方法的问题在于,新实例投入运行需要更多时间,而且流量成本也很高。
我还考虑进行 Raid0 设置以提高索引文件的读取性能。那么我应该使用哪种方法?
答案1
这个 Web 服务已经存在了吗?还是你正在制作的?或者……?因为我的答案是根本不将其云化。我会买一台带有 SSD 的优质服务器,以实现最佳读取性能。
但您还必须弄清楚从“云”方面获得了什么。“云”仅允许您在一组希望地理位置分散的数据中心中创建许多实例;即使这样,您也不能保证您的最终用户将获得良好的响应时间(例如,对于亚马逊,如果有人访问您位于纽约数据中心的服务器,而您的客户在澳大利亚,您如何获得一致的性能?)
您的性能瓶颈在哪里?您如何解耦各个元素以提高性能?SSD 可以处理磁盘读取本身。“云”不会神奇地提高性能;它很大程度上是应用程序架构的功能。我还没有测试过,如果有人测试过,我想知道大概的数字,但是当您寻求提高性能时,按需启动各种实例的建议似乎会产生更大的开销,从而损害您的数据库性能。
此外,您可能希望查看缓存中的 @#% ,而您却专注于磁盘。无论您的磁盘性能有多快,您都不会超越一组良好的缓存服务器,以使记录在内存中保持热状态而不是在磁盘上保持冷状态。同样,这是应用程序架构的功能。这是另一个可能对您启动更多 VM 造成伤害的事情;启动 VM 可能会杀死缓存并在缓存“准备好”之前导致滞后,可以这么说。
答案2
评论编号与您上面的选项相对应。
我总是建议将数据放在与根卷不同的 EBS 卷上,但如果它是只读的并且在构建 AMI 时易于获取,那么我可能会破例。我不明白为什么 EBS 根卷应该比任何其他 EBS 卷慢。
如果您正确设置了 AMI,这很容易。请参阅 ec2-register 中设置块设备的选项。Amazon 可以根据快照自动为您创建卷并将其附加到新实例,就像它们对根卷所做的那样。
与区域相关的终端节点中的 EC2 实例和 S3 之间的流量不收费。EBS 卷和 EBS 卷上的 IO 需要收费。
仅仅因为从快照创建的 EBS 卷在从 S3 下载大文件完成之前就可以使用,并不一定意味着 EBS 更快。该卷几乎可以立即接受操作,但在从快照填充块时,您将遇到高 iowait。
根据应用程序的性能要求,您可能会发现需要先“预热” EBS 卷,然后才能将其投入生产。这实际上与从 S3 下载相同。(我很想看看这些选项的一些性能测试。)
所有这些都假设将索引放在磁盘上是正确的做法。为了获得最佳性能,如果您能负担得起足够大的实例,您可以尝试将其全部加载到内存中。另一方面,简单地使用将索引放在磁盘上的高内存实例可能最终会使用操作系统中的标准磁盘缓冲将其加载到内存中。
根据您索引的内容和访问方式,您可能还会查看 SimpleDB、RDS、ElastiCache。
答案3
如果担心速度,我建议使用 InstanceStore 而不是 EBS。
http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html