在多个AWS EC2实例之间共享的不断更新的数据库

时间:2019-02-25 21:11:22

标签: database amazon-web-services amazon-ec2

对于一个小型个人项目,我每5分钟抓取一些数据并将其保存在SQL数据库中。到目前为止,我一直在结合使用小型EC2 AWS实例和100GB EBS存储。这对于抓取一直很好,但是由于EC2实例没有足够的内存,因此无法用于分析结果数据。

数据分析只是不定期地进行,因此花24/7拥有一个更大的EC2实例会很浪费,因此我正在寻找更灵活的方法。通过阅读,我了解到:

  • 您不能同时将EBS连接到两个EC2实例,因此无论何时需要进行分析,都无法启动另一个临时大实例。
  • AWS EFS似乎是一种解决方案,但价格昂贵得多,考虑到我有限的知识,我不是100%确信这是理想的解决方案。
  • 像Amazon Athena这样的无服务器选项看起来很棒,但这是基于S3的,它对于需要连续更新(?)的数据是不可行的。

我认为这是AWS相当普遍的用例,因此我希望尝试朝正确的方向获取一些指针。有什么我可以忽略的选项适合我的问题吗? EFS是正确的方法吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

  1. 据我所知,S3和Athena是一个不错的选择。我不确定您是否担心不使用S3,但是一旦您可以将抓取的数据保存在S3中,就可以使用Athena(按查询付费)对其进行分析。

  2. 或者,您可以使用RedShift保存数据并分析与ec2按需定价模型类似的按需服务。

此外,您可以使用Kenisis Firehose,该工具可用于在提取数据时实时分析数据。

答案 1 :(得分:1)

您的搜寻工作人员应将数据存储在Amazon S3中。这样,可以扩展(甚至关闭)工作人员实例,而不必担心数据存储。将过程数据(例如,已刮取的内容,下一步要刮取的位置)保存在DynamoDB这样的数据库中。

当您需要查询保存到Amazon S3的数据时,如果存储为可读格式,则最好使用Amazon Athena (CSV,ORC等)。

但是,如果您需要读取非结构化数据,则您的应用程序可以通过下载和使用文件或将其作为流读取,直接直接访问文件S3 。对于这种类型的处理,您可以启动具有大量资源的大型EC2实例,然后在不使用它时将其关闭。更好的是,将其作为 Spot实例启动以节省资金。 (这意味着您的系统将需要处理可能在中途停止的情况。)

答案 2 :(得分:1)

以前的用户的回答很好。让我们按选项细分。在我看来,您的初始堆栈是您在EC2中安装的自定义SQL数据库。

选项1-RDS只读副本

将数据库移至RDS,这将为您带来很多好处,但是我们正在寻找的主要对象是只读副本,如果您的阅读量有所增长,则可以创建其他只读副本并将其放在负载均衡器之后。此设置是没有太多代码更改的最低要求。

选项2-EFS在EC2实例之间共享数据

使用EFS并非一帆风顺,没有EFS的错误。有些数据库将唯一的ID保存到文件系统,这意味着您无法共享硬盘驱动器。 EFS是一项服务,会给每个读/写操作带来一些延迟。根据您安装的数据库分发的方式,甚至可能无法实现。

选项3-雅典娜和S3

让工作人员保存到S3而不是SQL也是可行的,但这意味着重写您的Web抓取工具。您可以多次在同一键上调用S3-> PutObject,它将覆盖先前的对象。然后,您将需要重写分析工具以查询S3。此选项非常好,并且在“运营成本”方面可能是最便宜的,但这意味着您必须熟悉S3,更重要的是,您需要熟悉Athena。您还需要弄清楚如何为应用程序保存新数据和最佳文件格式。您可以从常规JSON或CSV Blob开始,然后以较低的成本迁移到Apache Parquet。 (有关该声明如何意味着节省的更多信息,请参见此处:https://aws.amazon.com/athena/pricing/

选项4-RedShift

RedShift用于BigData,我要等到查询常规SQL出现问题(每次查询需要几秒钟),然后再开始研究它。当然,它可以让您以便宜的价格进行查询,但是您可能必须设置一个侦听SQL(或由SQL触发)的管道,然后更新RedShift。原因是RedShift会根据您的查询需求进行扩展,并且您可以轻松启动多台计算机以加快查询速度。