新手问题 我是否应该使用 mongodb?(即 mongodb 能比 mysql 更好的解决我面临的问题吗?)

ruohanc · June 10, 2013 · Last by rubyu2 replied at May 04, 2014 · 11578 hits

小弟正在尝试写一个类似监控中心的应用。数据量说多不多,说少不少。每天 12W 条数据。数据库大小每天增加 20M.

有了数据自然要从各个维度去分析。从时间维度,机房维度,机器型号维度等等。如果我一次取出 12W 条数据,不说 mysql 在默认配置下查询费时 2s 以上,而在 ruby 中建立如此大的一个数组也要耗费近 10s. 更别说做后续更多的判断和统计逻辑。不敢想象如果我以后要分析一周,一个月的数据会演变成什么样的情况。

于是我冒出了一个 "是不是该试试 mongodb" 的想法,这回我正在通往啃 mongodb 文档的路上,顺便向各位前辈们请教,mongodb 是否能较为快速 (指性能) 的满足我的想法。谢谢啦。

Unknow user #1 June 10, 2013

说名你的程序写有很多需要改进的地方

#1 楼 @hello_little_yy 嗯..要不然也不发新手问题里了么。想不到怎么避免用 ruby 存这么大数组的问题。逻辑有点复杂,只用 sql 语句应该是很难实现了。所以在找一个在数据库层面就能快速筛选目标的方案..

不应该。mongodb 做分析也不是擅长的。压缩你的数据结构,让他们尽量的紧凑,使用 redis 做数据维度的分析。

这种应用场景算是 mongodb 非常适用的,可以试试。可以在插入的统计,即插入的时候同时插入 N 张表。也可以在后台定时做 mapreduce

#3 楼 @jimrokliu #4 楼 @doitian 我明白了,果然是我处理方法有问题。我应该在插入的时候就开始按照统计的维度收集规划数据。按照 @jimrokliu 的意见是用 redis 做。按照 @doitian 的说法就是如果用 mongodb 做 db 的话,它本身就很适合胜任前面 "redis" 的工作。

这样理解的可对?

大数据分析你应该试试别的方案,查查公司的 HBase 的服务

#5 楼 @ruohanc redis 多用于缓存,配合 mongodb 用也可以 ;-)

如果是临时方案,可以用 mongodb 搞,前提是你熟悉类似 mysql 这样关系数据库的设计(否则会把 mongodb 当做避难所,然后在关系数据上掉进坑里)。

如果是希望做一个生命周期超过 1 年的东西,并且暂时不太着急,建议寻求相关工具团队的专业帮助,让他们直接给你需要的东西,详细情况可以上班时候打我手机

CouchDB 吧

#6 楼 @huacnlee 一天才 120K 条记录也叫大数据?

#10 楼 @bhuztez 心别太凶.....至少对单进程的 ruby 来说。处理一天的数据要半分钟,回头如果要处理一个月的那就得 15 分钟了。而且每日的量会慢慢增加..

#8 楼 @fsword 有道理。我用了 mongodb 最后很可能在关系数据上掉在坑里。

#8 楼 @fsword 专业的工具团队指的是数据仓库么....我前天提了 odps 的申请..然后被嫌数据量太小,给拒绝了。T^T

#13 楼 @ruohanc 不是数据分析的专业团队,是机群监控系统的专业团队,长久看是要把这块工作彻底交给别人来做的 PS: 上班的时候怎么不问我?

#14 楼 @fsword 好吧...可是目前看还是要实在一点。

我现在一把处理了 30W 条数据,似乎主要的瓶颈是卡在 ruby 建立 ActiveRecord::Relation 数组里面了,花了好几分钟。这个有啥建议么.... 我现在已经有 96W 行数据了,全部处理一把伤不起啊。

#15 楼 @ruohanc 对于数据分析而言,最重要的是处理的策略(或者说算法),无论用 MySQL 还是 MongoDB 都是一样。 我觉得你让 MySQL 处理数据,而不是加载到 Ruby 里处理会更好。数据应该在 MySQL 里完成计算统计(用 SQL 处理),然后把计算统计的结果放到一张统计表里,Ruby 只展示结果就好了,不需要 Ruby 参与数据的分析计算。

你的问题和数据库无关,而是分析数据的方法不对。

似乎主要的瓶颈是卡在 ruby 建立 ActiveRecord::Relation 数组里面了,花了好几分钟。这个有啥建议么

应该把分析算法推向数据,而不是把数据都拉出来再分析。

在数据分析上面,没有 NoSQL 数据库能和 SQL 数据库的分析灵活性相比的;多维度数据仓库建立维护和分析也是非常成熟的技术了,可以去看看相关文献

#16 楼 @vincent #17 楼 @knwang 能稍微详细点吗.? 直接通过 SQL 拿出结果似乎是不太可能了,逻辑有点怪。比如我现在认为如果两个监控点监控同一个机器,只要有一个监控点认为这个机器可用,那我就简单的认为这个机器是可用的。最后根据这个规则计算个可用率出来。

#19 楼 @ruohanc 不是要从一个 SQL 中直接计算统计结果,而是在一个批处理的 SQL 文件(可能有很多个 SQL,还要生成临时表)定时处理,执行结果生成统计表,Ruby 是直接从统计表里拿结果。 我自己是这么干的。举个简单例子:一个网站,每天有大量的用户登录(大概几十万条记录),需要统计一个月内每天登录的人数。如果直接去登录日志表里做查询估计要半分钟。 我的处理方法是,每天凌晨的时候跑批处理 SQL,把结果放到一个 日登录数据统计表中,Ruby 的程序直接读这个统计表的数据就可以生成数据分析报告了。

#20 楼 @vincent 确实..这是看起来最可行的办法了。

是不是定时监控,记录结果?可以考虑 rrdtool

You need to Sign in before reply, if you don't have an account, please Sign up first.