数据库 (已解决) 每天 500w 条 log 如何入 mysql 库比较靠谱

iceskysl · 2012年01月14日 · 最后由 lulalala 回复于 2014年10月28日 · 8342 次阅读

我们有个产品,每天差不多500w的业务量,需要对500w做相关的分析,就需要入库~

目前用的是mysql 按月切表定期老化数据,但是导入数据情况比较糟糕~每天导入数据差不多需要20个小时,和MySQL 5000 records/second差距巨大~

尝试过三个方案:

  1. 定期解析日志,直接入库;
  2. 定期解析日志,生成sql,再直接sql入库;
  3. 生成data文件,load到库里

但是效果都不理想~ 没什么大数据处理的经验,大家支招~~~

共收到 27 条回复

你該不會是用 ActiveRecord 生成物件再儲存吧...

mysql load应该是最快的吧,把mysql引擎换成ISAM在load试试, 应该会快点 或者直接上hadoop, hive吧

netcat,多台服务器,同步导入。。

第2种方法,注意每条insert可以同时插入多条记录(比如1千条),500万条数据入库,执行sql应该很快的啊,我感觉应该在几分钟可以完成。如果你的很慢那可能是环境配置或硬件的问题了,可以把问题描述得更详细些,大家好出主意。

#1楼 @xdite 第一种方案类似的思路,但是是sinatra里用sequel入的~

#2楼 @allenwei mysql load速度还不错,但是准备符合mysql load格式的数据还是很慢~

#3楼 @bony 感觉这个是单台性能最佳以后再横向扩展,现在我个人觉得单台性能还比较糟糕,横向解决不了根本问题~

我正好做这方面,第一,你需要挂replication,在slave上分析就可以。 第二,你提到的“日志”,需要分析类型。是如apache log,还是业务类型。你是做数据挖掘,还是只是即时数据的展示。 第三,mysql的优化很关键,可以通过这次问题积累经验。500W数据量很小,不必担心mysql解决不了。

#4楼 @vincent 哦,sql导入的速度还不错,但是准备sql的过程比较慢,过程是这样的:

  1. 准备sql文件 sqlFileName = RAILS_ROOT + "/log/insert.sql." + LOG_POSTFIX_FOR_YESTERDAY sqlfile = File.open(sqlFileName, "w")

  2. 打开日志文件 File.open("../log/apps.log.#{LOG_POSTFIX_FOR_YESTERDAY}").each do |line|

3.提取需要的数据 id, apk_id, ip, client_id, channel_id, uniquely_code ,track = line.split(" : ")[1].split(",")

  1. 生成sql串 sqlInsert = "INSERT logs_downloads.....balalaalala

  2. 写到sql文件里 sqlfile.puts( sqlInsert )

  3. 调mysql直接导入sql

里面还有一些数据的清洗和排重工作~

每天的日志文件差不多500w行,解析生成sql的过程不理想(其中没用数据库操作)~ 难道是我磁盘性能很糟糕~~

补充一下,我是从数据仓库的角度分析你的case的。仅供参考。 http://blog.s135.com/infobright/

#8楼 @xds2000 还没到分析那块,现在再数据导入这个环节~infobright这个有了解,多谢~~

是否可以考虑生成log的时候分为多个文件?比如说app.log.20120113-1,每个文件10万条,这样你可以多任务处理

#12楼 @lanwen 还是没解决掉本质问题~

既然SQL生成这里有瓶颈,那就先简单的Benchmark分析, 看那是那一块费时间.

另外可以尝试一下其它的语言,比如shell

正在Benchmark~

#15楼 @iceskysl 建议不要用ActiveRecord,也不要用Mysql的Innodb。数据库用mysql的Myisam,直接调mysqlimport命令,当时我vmware虚拟机(主机为i5/2g ram)下导入csdn >600w条记录只要1分20秒左右。 http://dev.mysql.com/doc/refman/5.0/en/mysqlimport.html

用Ruby 合并为多条数据一起insert的SQL再导入 用 Myisam

#9楼 @iceskysl 如果跟 MySQL 无关,而是在准备 SQL 这一步(解析 LOG 文本)遇到瓶颈,直接改用 grep 来从日志中抽数据也许会快点吧?

同意楼上 可以用 awk+grep命令来分析log数据,会比用ruby解析快很多,若再不慢的话可能是你硬件问题了~~

#18楼 @ashchan #19楼 @Lucifer 能用mysql底层命令就直接用。尽量少用ruby再做一次封装。

#18楼 @ashchan 了解,目前的思路就这样了~

找到原因了~ 彻底解决了~~~

#23楼 @iceskysl 分享一下原因和解决方法(案)就更好了。

#24楼 @ashchan
原因是我在清洗数据的时候用到了ruby的array中include?方法,而这个方法是直接遍历。。如下图

详细的我在blog大致纪录了下: http://www.iceskysl.com/?p=1106

#25楼 @iceskysl 不错:)谢谢!

感覺可研究一下 fluentd

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册