临时数据存储设计

时间:2016-07-15 06:29:05

标签: database-design architecture

我有一个网络抓取应用程序。用户启动“报告” - 他们想要抓取哪些数据点。数据点可以是1或100K数据点。有许多用户发起这些报告。有多个爬网服务器在抓取数据点。然后将这些数据点发送到中央服务器。中央服务器收集所有数据点,并且当收集报告的所有(足够)数据点时,生成报告(excel)并将其传递给客户端。

现在我们需要一个数据存储来存储抓取时的各个数据点。然后,当爬网完成时,我们需要查询所有这些数据点并构建报告。该报告是最终产品,生成报告后,我们无需存储已爬网的数据;至少不是为了满足客户需求。附注:已爬网的数据存档到数据仓库中。

目前,我们使用SQL存储这些抓取数据点,因为正在进行抓取。过程是:将所有crwaling数据转储到SQL中 - >爬网完成后(可能需要几个小时),从SQL回读属于报告的爬网数据 - >定期清除SQL,例如清除超过x天的数据。 SQL服务器遇到了可伸缩性问题 - 爬行数据点太多。我们每天获得大约100M的数据点;每个记录只有几KB。这样每天大约有400 GB的数据。

所以我们正在探索几种替代方案,对这些做出一些评论会很有帮助:

  1. 将抓取数据存储在本地CSV文件中。爬网完成后,请阅读 返回CSV文件以生成报告。缺点是它 造成单点故障;爬网的服务器 存储的数据可能会下降并使用已爬网的数据 它。
  2. 将SQL替换为其中一种大数据技术;将爬网数据存储到以下之一
    • AWS RedShift:生成报告时,查询报告数据很容易。我倾向于这个。
    • 大表:插入物很容易;但鉴于它是一个键值存储, 获得100K左右的个人记录是多么容易 从DB生成报告的时候?
    • DynamoDB
  3. 将抓取数据存储到某个文件服务器的文件中

1 个答案:

答案 0 :(得分:0)

您可以将数据存储在Cassandra中,然后将数据ETL到Redshift并构建针对Redshift的报告应用程序。这样,您可以确保在摄取数据时没有单点故障,并且您还可以灵活地通过ETL格式化或转置数据。

谢谢, Jayadeep