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

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

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

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

尝试过三个方案:

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

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

你該不會是用 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

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