目前,我在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?如果没有,有哪些解决方案可以让我们在后台预处理/生成报告数据?
答案 0 :(得分:5)
假设sessions
和actions
表值未更新且仅插入。最好的方法是将数据库分成两部分。保留user
和profile
表的MySQL数据库,并使用actions
和sessions
{/ 3}}。{/ p>
这样你就有了以下几点:
BigQuery是最好的方式。但是,如果您有太多额外的资源和时间,您可以考虑将其存储到NoSQL数据库中,然后使用DataFlow在其上运行管道作业来提取分析数据,您将再次需要将其存储在数据库中以进行查询。
答案 1 :(得分:3)
一些问题/潜在解决方案:
通常,解决这些问题的最快方法是尝试针对您的特定工作负载,例如:您可以在具有合理RAM量的开发机器上执行多少典型请求(或随机仪表板)(或启动服务器/创建不同的测试数据库)。
此外,如果您主要习惯于关系数据库,那么切换时会有一些开销(特别是对于前沿解决方案),因此您需要相当确定成本超过您之前的收益切换,或一次切换一点,这样你可以切换回来,如果它没有成功。再次,测试有帮助。
答案 2 :(得分:0)
如果可行,请不要存储大量数据!
相反,在数据到达时汇总(聚合)数据块,然后存储摘要。
优点:
缺点: