30亿日志,检索+分页+后台展示,你是否遇到过更奇葩的需求?

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 一个数据库查询日志,前台页面显示的问题。

沈老师,你好,想请教一个数据库查询日志,前台页面显示的问题。 需求(1)按照某些特定检索条件查询日志;(2)通过前台Web页面查询并显示相关日志信息;(3)检索需求包含用户,时间段区间,类型等特定字段;
image.png

希望做到

(1)查询速度尽可能快;(2)支持分页查询; 
目前方案日志信息存储在Oracle中,根据日期对Oracle做了分区处理,每天生成一个分区表,每个分区表中的数据总量大概在1000W左右。在相关查询字段例如用户,类型上建立索引,来满足不同维度的查询需求。 潜在问题跨分区的查询,求记录总数(计算分页时的查询),耗时要3-4分钟,请问有什么优化方法么? ==问题描述完== 这个需求还是非常变态的,通常日志会进行过滤/结构化/汇总,放入数据仓库,建立业务宽表,宽表上的查询,一般不会具体查一行一行的记录。 如果要支持检索,并一行一行在Web后台进行展示,至少要解决几个方面的问题(1)存储问题;(2)检索问题;(3)扩展性问题(数据量扩展,检索字段扩展); 一、存储问题
是否可以用关系型数据库存储日志?如果日志格式固定,检索条件固定,是可以的。 例如:

2019-08-11 23:19:20 uid=123 action=pay type=wechat money=12

可以转化为表:

t_log(date, time, uid, action, type, money)

然后在相关字段上建立索引,以满足后台查询与展示的需求。   数据量太大,怎么解决? 按照题目描述,日数据量大概在1000W级别,1年的数据量大概在36Y级别。
如果用Oracle存储,1000W为一个分区表 一年需要365个分区,跨分区的查询性能较低,不太合适。   改为1个月一个分区 单分区3Y记录,大部分分区无写操作(插入,修改,删除),只有索引上的读操作,读写性能基本能抗住。一年12个分区,性能比365个分区好很多。   虽然本例的日志可以结构化(将日志转化表),由于数据量太大,其实关系型数据库不太适用,可以用 适合更大数据量的ES或者Hive来存储   二、检索问题 日志格式固定,检索条件固定,如果用关系型数据库或者Hive存储,可以 在相关字段上建立索引 ,来满足查询需求。   如果用ES来存储,其内部用倒排表实现, 天然支持检索   三、扩展性问题   数据量扩展 不管用Oracle,ES还是Hive来存储,它们的区别只是单实例/单集群存储容量不一样, 如果数据量无限扩展,本质上的解决方案还是“水平切分”
  需要注意的是,尽量不要使用自带的“分区表”来扩展,而在业务层自己拆分。

检索字段扩展 如果日志不是标准化的,检索字段也不是固定的,那就麻烦了,那就变成了也“搜索引擎”的问题。   此时使用ES是更为合适的,不过结合无限的数据量,最终可能需要自己实现存储于检索引擎(类似于百度,存储容量无限,检索字段不固定)。

总结

结合本例,日志量大,模式固定,建议:

(1)最建议, 使用Hive存储,使用索引 的方式实现日志后台检索需求; (2)如果扩展性要求稍高,可以 使用ES实现存储与检索,使用水平扩展 来存储更大的数据量;   希望上述思路对星官有帮助,经验有限,也欢迎大家贡献更多更好的方案, 思路 比结论重要。

本文转自“架构师之路”公众号,58沈剑提供。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
7月前
|
运维 监控 数据挖掘
应用研发平台EMAS产品常见问题之将阿里后台的日志落到我们后台失败如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
|
7月前
|
弹性计算 前端开发 Serverless
Serverless 应用引擎操作报错合集之在阿里云函数计算中,调用了FC函数但是没有执行或者报错,并且在FC函数后台也看不到调用记录日志如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
算法 数据安全/隐私保护
Daily-Blog项目后台日志(中)
Daily-Blog项目后台日志(中)
102 0
|
7月前
|
Java Unix 数据库连接
Mybatis【结果集映射、日志、分页】
Mybatis【结果集映射、日志、分页】
|
Java 数据库连接 Apache
mybatis日志、分页,注解、lombok
mybatis日志、分页,注解、lombok
70 0
|
存储 数据安全/隐私保护
Daily-Blog项目后台日志(下)
Daily-Blog项目后台日志(下)
135 0
|
XML NoSQL 前端开发
Daily-Blog项目后台日志(上)
Daily-Blog项目后台日志(上)
71 0
|
SQL 算法 关系型数据库
慢查询日志和深度分页问题
慢查询日志和深度分页问题
|
存储 JSON 运维
【Go】基于 Gin 从0到1搭建 Web 管理后台系统后端服务(一)项目初始化、配置和日志(下)
【Go】基于 Gin 从0到1搭建 Web 管理后台系统后端服务(一)项目初始化、配置和日志(下)
|
存储 JSON 监控
【Go】基于 Gin 从0到1搭建 Web 管理后台系统后端服务(一)项目初始化、配置和日志(上)
【Go】基于 Gin 从0到1搭建 Web 管理后台系统后端服务(一)项目初始化、配置和日志(上)