使用 MongoDB 进行网站分析的数据库结构

Database structure for website analytics using MongoDB

提问人:RichW 提问时间:12/14/2011 更新时间:12/14/2011 访问量:2648

问:

我开始在MySQL中为我正在从事的一个项目开发一个网站分析系统,但很快意识到它不足以满足我的需求(在可扩展性、速度等方面)。在做了相当多的研究之后,MongoDB不断成为很好的候选者,我唯一的问题是我没有这方面的经验,也不知道高性能/大小MongoDB数据库的最佳实践,就像我对MySQL所做的那样。

当用户访问网站时,需要记录标准信息(IP、浏览器信息、网站ID、URL、用户名)。它还需要记录用户访问的每个后续页面(当前时间戳、url)。如果用户离开网站并在 10 天后返回,则需要记录该访问,并记录该用户是回访用户(由其用户名标识)。

除了记录多个网站的访问(查看每秒添加的 500 条记录)之外,它还需要具有报告功能。我擅长生成图表等,但我需要知道如何有效地从数据库中提取数据。我希望能够提供显示每 15 分钟活动的图表,但如果更实用,一个小时就足够了。

正如一方所认为的那样,如果它将来能够进行实时报告就好了,但这超出了当前项目的范围。

现在我已经在 http://blog.mongodb.org/post/171353301/using-mongodb-for-real-time-analytics 上阅读了这篇文章,但它没有提到任何关于高流量网站的信息——据我所知,它可能只能处理几千条记录。我是遵循该帖子的概念并直接从该集合中提取报告,还是预先分析数据并将其存档到单独的集合中会更好?

对数据插入、数据库结构和报告的任何想法将不胜感激!

MongoDB的

评论


答:

6赞 mnemosyn 12/14/2011 #1

(MySQL)不足以满足我的需求(在可扩展性、速度等方面)

井。。。Facebook似乎在很大程度上使用了MySQL。说到NoSQL,我相信它不一定是技术,而是数据结构和算法。


您面临的是潜在的高写入吞吐量的情况。一种非常适合您的问题的高写入吞吐量方法是分片:无论机器有多大,软件效率如何,一台机器可以处理的写入次数都会受到限制。分片将数据拆分到多个服务器,因此您可以写入不同的服务器。例如,用户 A-M 写入服务器 1,用户 N-Z 写入服务器 2。

现在,分片是以复杂性为代价的,因为它需要平衡,跨所有分片的聚合可能很棘手,您需要维护多个独立的数据库等。

这是一个技术问题:MongoDB分片相当简单,因为它们支持自动分片,可以为你做大部分令人讨厌的事情。我不认为你以每秒 500 次插入的速度需要它,但很高兴知道它在那里。

对于架构设计,重要的是要考虑分片键,该键将用于确定哪个分片负责文档。这可能取决于您的流量模式。假设您有一个用户操作一个集市。每年一次,他的网站完全发疯了,但 360 天它是流量较低的网站之一。现在,如果您在 上分片,该特定用户可能会导致问题。另一方面,如果你分片 ,你必须点击每个分片才能获得一个简单的 .CustomerIdVisitorIdcount()

分析部分很大程度上取决于要支持的查询。我想说的是,真正的交易切片和切块是相当具有挑战性的,特别是如果你想支持近乎实时的分析。一种更简单的方法是限制用户的选项,并且只提供一小部分操作。这些也可以缓存,因此您不必每次都执行所有聚合。

通常,分析可能很棘手,因为有许多功能需要关系。例如,群组分析将要求您仅考虑由特定用户组生成的日志条目。对于较小的群组,查询可以解决问题,但如果我们谈论的是数以万计的用户,那就行不通了。您可以只选择随机的用户子集,因为这在统计上应该足够了,但当然这取决于您的具体要求。$in

对于大量数据的分析,Map/Reduce派上用场:它将在服务器上进行处理,Map/Reduce也受益于分片,因为每个分片可以单独处理作业。但是,根据无数因素,这些工作将需要一些时间。

我相信Boxed Ice的博客对此有一些信息;他们肯定有使用 MongoDB 处理大量分析数据的经验。