我刚刚开始使用 S3 来存储托管在 Rackspace 上的 Django 应用程序的图像。我不得不考虑 EC2,因为很明显,在文件上传后将文件移动到 S3 会更快。我必须承认这让我很困惑。
那么,如果我使用实例存储作为前端,我的 Django 代码将驻留在何处?它说如果它重新启动,我会丢失数据,并且我认为我的代码也是我的数据。我是否要安装 EBS 卷来存储代码?
对于 MySQL 后端,我是否使用 EBS 支持的实例和实例存储作为前端,我将在负载开启和关闭时启动和停止。
在启动和关闭新前端时如何实现负载平衡。我之前使用过 nginx,但我猜亚马逊有某种方法可以使这一功能变得多余。
我看到人们提到的所有 EC2 管理命令都在哪里运行?在实例本身上还是在我用于开发和测试的 Windows 机器上?
答案1
有两种存储可以附加到实例:临时存储和弹性块存储 (EBS)。顾名思义,临时存储是临时的 - 并且仅在实例运行时存在(如果实例停止或终止,它将被销毁)。临时存储不能在实例之间“转移”(即从一个实例分离并附加到另一个实例)。实例存储数据在重新启动后仍然存在,而不会停止实例(即从控制台运行重新启动)。EBS 存储独立于实例而存在,并且 EBS 卷可以在实例之间转移(在同一可用区域内)。此外,您可以拍摄 EBS 卷的快照,从而允许对卷内容的压缩映像进行差异(即增量)存储(允许您轻松地在不同区域创建新卷等)。符合临时存储条件的实例无需额外费用即可获得它。另一方面,EBS 存储按 a) 预置量和 b) I/O 使用量计费。
Instance-store 使用 S3 来存储 AMI 数据,并提供临时根以及额外的临时存储。当任务需要大量临时存储,并且只有极少量数据需要永久保留时,这种方法非常有用。通常,临时存储适用于临时文件和交换空间。如果您将数据存储在临时卷上,则可能应在启动时从“主源”复制数据,并且数据(在临时磁盘上)应该没有价值。(例如,如果您正在运行应用程序,则可以将代码存储在外部,在服务器启动时将最新版本下载到临时磁盘,然后在服务器上本地运行该应用程序,所有数据存储在其他地方(例如 EBS、RDS 等))
通常,建议使用 EBS - 既作为根卷,又作为数据存储介质。EBS 允许您轻松更改实例类型、修改根分区大小、备份数据,并且由于您可以将 EBS 卷附加到其他正在运行的实例,因此大大方便了处理问题。使用 EBS,您可以将代码直接存储在 EBS 卷上,并且您所做的任何更改都将保留。此外,您可以将快照附加到实例,这样启动的所有实例在其附加的 EBS 卷上都会有相同的数据(即数据来自快照)。除非您有从实例存储架构中受益的特定需求,否则 EBS 是最佳选择。
(还有另一种选择,但对于代码/数据库来说,这通常不切实际。您可以使用 fuse 将 S3 存储桶挂载为本地文件系统 - 优点是无限的、未配置的存储(即您的文件可以增长而无需预先分配一定量的空间) - 这对于上传、图片等可能是用户贡献的内容非常有用。缺点是性能 - 写入 S3 的速度远不及 EBS 或临时存储,存在明显的滞后,这使得应用程序的核心组件无法接受。)
回顾:代码必须在本地可用 - 要么将其存储在 EBS 上(推荐),要么将其下载到服务器的临时磁盘(即,您的代码被复制到机器上以供使用,但驻留在其他地方)。
对于 MySQL,如果您要管理自己的 MySQL,则需要 EBS 卷,或者可以使用 Amazon 的 RDS。有些人已经注意到,运行自己的 MySQL 服务器可以以更低的成本获得更好的性能。这里使用 EBS 的原因是,维护临时磁盘上运行的不断变化的数据库的最新备份将极其困难。这意味着,如果您使用临时磁盘并且实例崩溃,您将丢失自上次备份以来的所有数据,这通常是不可接受的。数据库实际上不能存储在 S3 上,因为性能不足以实现此目的。
AWS 提供“弹性负载均衡器”,可在您与之关联的实例之间分配负载。它能够在区域之间分配负载,并尝试避免单点故障和单个实例的限制(例如网络 I/O)。它不支持“静态”IP(在 AWS 上称为弹性 IP),因此您必须使用 CNAME 来访问它(即您无法将 ELB 映射到您的根域)。此外,源 IP 通常设置为 ELB IP,这意味着您需要使用“X-Forwarded-For”标头进行日志/分析。如果您愿意,您仍然可以使用 nginx 或 HAproxy 作为负载均衡器,但是请记住,这会导致所有网络流量都通过该单个实例,如果您的应用程序需要高带宽,这通常会成为瓶颈。但是,与 AWS 上的其他所有内容一样,您需要按使用量付费 - ELB 既按其运行时间计费,也按通过它们的数据计费。
最后,AWS 命令可以从任何地方运行 - 它们通过您传递给它们的凭据输入到您的帐户中,并针对特定资源(例如实例、EBS 卷等)运行,因为您将为给定命令指定关联的 ID。只有少数命令(例如捆绑/上传 AMI)需要(本地)访问相关文件,必须从特定计算机(即有权访问所需文件的计算机)运行。即使是引用附加到实例的资源的命令(例如拍摄 EBS 卷的快照)也可以从安装了工具的任何计算机(相关实例、您的开发箱、另一个实例等)运行。
答案2
我会让您轻松一点:始终使用 EBS 启动实例,而忘记实例存储,直到您成为 EC2 专家。
将数据文件保存在附加到实例的单独 EBS 卷上。要运行 MySQL,请阅读我几年前为 Amazon 撰写的这篇文章。示例 AMI ID 已过时,但其余部分仍然是最佳实践。
http://aws.amazon.com/articles/1663
您可以使用 Amazon ELB(弹性负载均衡器)在前端服务器之间分散流量。
EC2 命令行工具大多在本地系统上运行,但在某些情况下,它在实例上运行也是有意义的。只需小心放置 AWS 凭证的位置即可。