从关系数据库迁移到大数据

时间:2017-06-12 02:36:14

标签: mysql performance google-cloud-platform analytics bigdata

目前,我在Google云端平台上托管了一个应用程序,该应用程序提供网络分析并提供会话活动(点击,下载等),并将该网络活动与网络注册联系起来。

目前我们将所有点击和会话配置文件数据存储在MySQL中并使用SQL查询生成聚合和每用户报告,但随着数据量的增长,我们看到真正的减速在查询响应中,这反过来减慢了页面加载时间。

在调查我们可以解决这个问题的方法时,我们已经研究了Google Cloud Platform上可用的工具,如Dataproc和Dataflow以及NoSQL解决方案,但是,我很难理解如何将我们当前的解决方案应用于任何这些解决方案。

目前,我们对数据模式的概念如下:

User table
- id
- name
- email

Profile table (web browser/device)
- id
- user id
- user agent string

Session table
- id
- profile id
- session string

Action table
- id
- session id
- action type
- action details
- timestamp

根据我的研究,我对什么是最佳解决方案的理解是将动作数据存储在NoT数据库解决方案中,如BigTable,它将数据提供给DataProc或DataFlow等生成报告的解决方案。但是,鉴于我们当前的架构是一个高度关系的结构,似乎删除了转向NoSQL解决方案的选项,因为我的所有研究表明您不应该将关系数据移动到NoSQL解决方案。

我的问题是,我对如何正确应用这些工具的理解是什么?或者有更好的解决方案吗?是否有必要考虑远离MySQL?如果没有,有哪些解决方案可以让我们在后台预处理/生成报告数据?

3 个答案:

答案 0 :(得分:5)

假设sessionsactions表值未更新且仅插入。最好的方法是将数据库分成两部分。保留userprofile表的MySQL数据库,并使用actionssessions {/ 3}}。{/ p>

这样你就有了以下几点:

  • 最大限度地减少您必须在任何一方进行的更改量(数据提取和提取)
  • 您将显着降低数据存储成本
  • 查询时间将显着改善
  • 在你知道它之前,你将处于大数据领域,而BigQuery只是它的解决方案

BigQuery是最好的方式。但是,如果您有太多额外的资源和时间,您可以考虑将其存储到NoSQL数据库中,然后使用DataFlow在其上运行管道作业来提取分析数据,您将再次需要将其存储在数据库中以进行查询。

答案 1 :(得分:3)

一些问题/潜在解决方案:

  1. 资料!如果相同的查询颠覆了数据库,那么优化查询或缓存最常用页面的某些结果可以帮助卸载处理。同样适用于数据库设置,RAM等
  2. 您的数据库有多大?如果它小于64GB,那么扩展到数据库可以放入RAM的更大的服务器可能是一个快速的胜利。
  3. 您的数据如何使用?如果它纯粹用于历史数据,则可能会将您的点击次数降低到查找表中,例如。每周或每周每位用户的操作。如果数据每5分钟/小时整理一次,那么下载原始数据并在本地处理它也可以正常工作。
  4. 你可以反规范,例如。将用户代理|会话|操作类型|详细信息|时间戳合并为一行,但可能会增加存储要求和查找时间。
  5. 或者,更多的规范化也可以提供帮助。将用户代理字符串分解为自己的表将减少该表的数据要求,并可能加快速度。
  6. 您的数据似乎可以被用户拆分/分片,因此这可能是另一种选择。
  7. 通常,解决这些问题的最快方法是尝试针对您的特定工作负载,例如:您可以在具有合理RAM量的开发机器上执行多少典型请求(或随机仪表板)(或启动服务器/创建不同的测试数据库)。

    此外,如果您主要习惯于关系数据库,那么切换时会有一些开销(特别是对于前沿解决方案),因此您需要相当确定成本超过您之前的收益切换,或一次切换一点,这样你可以切换回来,如果它没有成功。再次,测试有帮助。

答案 2 :(得分:0)

如果可行,请不要存储大量数据!

相反,在数据到达时汇总(聚合)数据块,然后存储摘要。

优点:

  • 可能需要十分之一的磁盘空间;
  • 报告速度可能快10倍,
  • 可以在现有的RDBMS中完成。

缺点:

  • 您无法改进其他摘要。 (好的,你可以保留原始数据并重新开始;无论如何,这可能会更好。)
  • 更多代码复杂性。
摘要表的

Discussion