博主工作的一个项目里用了elk来存储用户操作日志,日志量大概是每天一千万左右的数据,最近服务器的磁盘被塞满了 本想将时间较长的数据删除掉 但当时删除总是出现版本冲突的错误
并且es在单个索引数据达到 亿级以上的时候查询时间也是不乐观的
于是乎博主花了点时间将es的日志数据全部查询出来 准备将这些数据包括以后的日志数据都存储到mysql中 博主的日志都是先全部存入kafka然后再通过logstash消费到es中,现改成用java程序消费日志数据存储mysql中
由于mysql单表的数据查询极限在一千万左右,所以博主做的分表方式如下:
第一.每个月用三十张表存储数据 三十张表的数据存储位置规划是根据用户帐号的信息的hash得来,并且根据用户帐号和查询条件字段做了索引 这样的话 查询时可以大大提高效率 并且查询一个用户的操作记录也只需要查询一张表即可,不过由于是根据年月分表,那么如果跨月查询的话还是需要结合多张表查询 不过根据业务情况 大多出查询情况都是查询月份数据 所以这样做问题不大
当然有些朋友会说 为什么不用hive和hadoop呢?
由于业务上的需求 不适合用非实时性的存储方式 并且查询效率方面并不是很出色
总结来说 es和mysql 存储日志各有各的好处 es的缺点就是比较吃系统配置 语法相对sql而言较复杂(7.x以后或可以用sql插件使用sql查询) 分页查询相对而言比较麻烦, 优点就是查询速度较快,支持分词,性能较好 有比较多的周边组件
mysql的优缺点也很明显:免费 轻巧 当然啦 性能方面肯定不如大型数据库
所以呢 解决问题的办法很多 根据不同的情况去选择合适的,如果公司不缺钱 服务器有的是,可以考虑用elk弄一套日志收集系统 如果怕坑 怕麻烦 还是选择mysql分表 分库存储比较好 ,毕竟博主是掉了elk的坑里