高并发( 6M/s)日志数据如何准实时入库( MySQL)

2016-03-03 13:55:42 +08:00
 iyaozhen

目前已经使用 filebeat+logstash 将线上的实时请求日志推送到了 Redis ( list 数据结构做队列) 中。但现在的处理瓶颈卡在了从 Redis 里面取数据做聚合然后入库这步了。

因为数据聚合处理使用的是 Redis 的 hash 数据结构做计数器,需要和 Redis 有几次交互,单个脚本的处理速度为 0.03M/s (已经优化过了),开 200+ 个进程数据聚合这块应该是抗的住的。

一开始使用的方案是每个脚本缓存数据然后达到一定数量(比如 10w 行)后批量解析然后 insert 入库,但因为用的是myisam存储结构(这里有两个原因: 1.机器磁盘不大节省空间 2.数据需要做统计 count(*)等操作用的比较多),写入数据时会锁表,后来又分库( 4 个库)分表( 100 个表)。这个解决方案抗了一段时间后数据量增长又不行了( redis 队列里面的数据处理没有增加快)。

后来想想批量解析和入库这里比较耗时间会阻塞脚本继续读取 Redis 中的数据。就想把解析入库的操作异步出来,这时想了一个办法是把 10w 行日志写文件,然后把文件的路径放到另一个队列里面去,起一些脚本解析文件入库。但我还是想得太简单了,数据量太大了,写的文件太多直接把测试虚拟机的 inode 用完了,机器直接蒙逼了。当然可以 50w 、 100w 行写一次文件,但这感觉不是根本的解决之道,还会带来其它问题(比如单个脚内存消耗过大)。

我感觉我这些解决方法还是太落后了,不知道大神们有没有什么解决方案。

PS :脚本是用的 PHP , Python 、 Go 都可以,不过我感觉这个问题应该不是语言的问题。
为了防止我跑偏,说一下核心需求:准实时根据请求参数等聚合统计数据(用于了解线上实时情况做监控),较低延迟( 30min 内)将这些数据入库(每个日志都带有 logid ,用于定位问题)。

18744 次点击
所在节点    程序员
60 条回复
hanwujibaby
2016-03-03 17:44:34 +08:00
redis 在内存占用率比较高的情况下不太稳定,切到 kafka 之类的,数据的聚合可以在内存中算,不用放到数据库中再聚合。看下 spark 或者 storm 吧。
9
2016-03-03 19:13:36 +08:00
数据入 es ,用 es 的 api 做统计,统计后的数据入回 mysql ,不要直接入库到 mysql ,这是坑啊
publicAdmin
2016-03-03 19:20:48 +08:00
对的。楼上 @9 的方案和我们之前处理方式一样。 用户打点数据,个人觉得你直接丢 mysql 无形中在给你自己增加压力,入库读库都存在风险,何不如丢类似于 es / hdfs/ influxdb 之类的天生自带索引查询的。
wusuopuBUPT
2016-03-03 19:38:15 +08:00
这种场景已经不适合 mysql 了,我们的数据处理流程是:
flume 采集->kafka 队列->ETL 清洗->HDFS 存储->Hive 查询->BI 系统
wusuopuBUPT
2016-03-03 19:39:57 +08:00
上面是离线(非实时)的方案, 实时系统也在调研,一般会在 kafka 后面接入 storm/spark 做流式实时计算
a591826944
2016-03-03 19:47:07 +08:00
之前做过类似的。不过不是日志。。就是用户的点击数据。
因为是 http 请求。 php 接收 -> rabbitMQ -> storm -> mysql
每天 3 亿左右 。。没达到你那么高。。。
RangerWolf
2016-03-03 21:09:52 +08:00
我这边的解决方案是 Cassandra 集群~ 一开始不熟悉的话在设计表结构上是个大坑
熟悉之后,还需要配上 Spark 集群来进行计算。 当然两边的配合又是一个大坑
在搜索的时候,还需要让 Cassandra 加上 lucene 插件,不是官方推荐的 Solr

想简单可以试试 Cassandra 官网推广的 DSE 。 初创企业(年利润 300M 美刀以内)没有 license 的问题~

最高试过 3.9W 写请求 /s

不知道你说的 6M/s 是大小 6MB 还是 600W 的写请求~ 如果是后者,爱莫能助啦~
chendahui007
2016-03-03 21:31:30 +08:00
以前搞过 ELK , 之前用 mongo ,也用过 mysql ,都不合适,建议 E 。 E 够强大,适合存储日志,如果用上 kafka ,还可以订阅日志
tabris17
2016-03-03 21:36:03 +08:00
其实我在想,用 zmq 自己写一个分布式日志处理程序也不是太复杂
lujiajing1126
2016-03-03 21:51:18 +08:00
elk 。。队列可以选 kafka 。事实查询用 e 。同步写到 hbase 也可以做离线分析。。似乎用 storm 的也有
xhat
2016-03-03 23:32:07 +08:00
为什么没人提到 leveldb ?
msg7086
2016-03-04 02:00:14 +08:00
1) 换 innodb ,切换成单表单文件模式
2) 改掉刷日志模式 https://wiki.phoenixlzx.com/page/MySQL
3) 考虑上混合 SSD 阵列,或者直接上 SSD 。
zuo
2016-03-04 02:59:14 +08:00
既然用上了 logstash 为什么不一步到位 输出到 Elasticsearch ,可以满足你后期的日志查询。做分析可以顺便把日志输出到 hdfs ,然后在结合 spark 或者 hadoop
cobopanda
2016-03-04 09:27:29 +08:00
用 ES 试试吧
firefox12
2016-03-04 11:15:51 +08:00
如果数据库本身不是问题的话, 插入是美问题的。
但是你 6M/s 按照你的量

6*3600*24 /1024 每天 500G, 数据库会迅速垮掉 ,完全是个错误的设计。

如果是在线查 log 的话, es 会好一点。 这种应用用 mysql 去做 并不好,统计应该靠应用去做。
gushan
2016-03-08 14:39:47 +08:00
日志数据直接存储 MySQL 在后期扩展还是有问题的,可以考虑下阿里云日志服务。
1 )提供了简单接入客户端( https://yq.aliyun.com/articles/3228?spm=5176.team4.teamshow1.37.faH93Z
2 )日志收集到服务端后提供多种消费方式:数据通道(类 Kafka )/数据投递( ODPS 、 OSS-组合 E-MapReduce Spark )/实时搜索( https://help.aliyun.com/document_detail/sls/user-guide/overview.html
wujunze
2016-06-09 21:06:01 +08:00
Spark 你值得拥有!
sumonian
2017-12-01 14:09:40 +08:00
elk 值得你拥有
jemygraw
2018-07-11 18:51:39 +08:00
你前端不应该用 redis,应该用 kafka。或者直接用七牛日志平台吧。
PoetAndPoem
2019-02-20 15:51:07 +08:00
@xgdyhaiyang 你好,那轮子中文介绍打不开,不知道怎么使用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/260806

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX