伴鱼数据库之慢日志系统

2023-10-09 00:58

本文主要是介绍伴鱼数据库之慢日志系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 背景

伴鱼少儿英语是目前飞速成长的互联网在线英语教育品牌之一,特别在疫情这段时间内,业务量增长近3-4倍。这期间,伴鱼慢日志系统对于帮助我们及时发现数据库性能问题、预防数据库性能风险和维护线上服务稳定性起到了很大的作用。

目前,伴鱼有10套TiDB数据库,20+套MongoDB数据库,近200+数据库实例。日常数据库性能问题处理,需要分析数据库慢日志,由于慢日志分散在多台机器,我们面临日志查询/分析/统计等各种不便。因此,我们设计了伴鱼慢日志系统并满足以下几个要求:

  • 慢日志集中准实时收集

  • 日志查询/分析/统计可视化

  • 慢日志定时报表

  • 慢日志灵活告警

下面详细介绍下伴鱼慢日志系统设计以及系统给我们带来的实实在在的效果。

2. 慢日志系统详解

我们认为数据库的性能问题,绝大部分原因都是由慢SQL导致的,当然像数据库bug、业务异常流量等情况,在伴鱼还是比较少见的。所以,伴鱼慢日志系统主要围绕如何准实时收集分布式TiDB的慢日志、如何快速的做分析统计、定时向业务推送慢日志报表以及如何灵活的告警等方面进行设计。

2.1 准实时集中收集慢日志

我们采用了业界比较成熟的开源日志采集、分析、存储和展示架构,如下图所示。

其中,每个组件的功能如下:

  • filebeat负责增量收集TiDB产生的慢日志,由于filebeat比较轻量,对线上性能基本无影响。

  • kafka负责缓冲存储filebeat采集的原始日志

  • logstash负责把原始日志解析成我们想要的键值对

  • es负责存储经过logstash加工后的数据

  • kibana负责数据的查询/分析/统计的可视化

filebeat采集TiDB的慢日志配置,如下图所示。

原始慢日志经过filebeat采集阶段简单处理后存储到kafka,原始慢日志如下图所示。

存储到kafka的慢日志部分内容格式,如下图所示。

日志存储到kafka后,logstash负责读取其中的慢日志并进行解析,转换成我们想要的kv键值对,如下图所示。

对于TiDB的慢日志,我们重点关注慢日志中的某些字段,比如:

index_name: 语句执行过程中是否用到索引
DB:表示执行语句时使用的database
query_time:表示执行这个语句花费的时间
total_keys:表示Coprocessor扫过的key的数量
process_keys:表示Coprocessor处理的key的数量
sql:执行的sql语句

解析后的数据最终存储到到es,供kibana查询、分析以及统计使用。

2.2 慢日志查询分析统计的可视化

慢日志通过logstash解析入到es后,通过kibana,我们可以把解析的字段作为查询和聚合的条件,很方便的对慢日志数据进行分析统计。

比如我们经常有如下操作:

  • 5分钟内,慢请求分别按照db和table聚合

  • 5分钟内,Process_keys大于5000的慢请求

  • 5分钟内,query_time大于200ms的请求

通过近似数据库表查询操作,我们能对慢日志进行多维度的分析,及时探究线上的性能问题。当然操作远不止这些,研发同学还可以在kibana平台上定制所属业务db慢日志的趋势图、配置告警等。

2.3 定时发送慢日志报表

在伴鱼,通常一个服务对应一个DB,并且要求db名和服务名相同,每个服务有明确的业务负责人(owner) 和服务等级以及所属的具体的业务组,如下图所示。所以根据DB,可以将慢日志告警和报表推送给具体的业务负责人。

基于加工后的慢日志数据,从多种维度,比如集群、库、表、操作类型、慢日志数量、执行总时间、平均响应时间以及最大耗时等维度对慢日志进行分析统计,并生成报表定时发送给研发同学。

2.4 慢日志灵活告警

在伴鱼,一个db对应一个服务,所以告警都是在特定db下设置规则。目前,我们告警时间粒度默认是一分钟(粒度可以灵活控制),主要基于以下三类规则进行告警。

  • 某个db下的请求时间达到100ms且慢日志达到一定数量则告警

  • 某个db下的请求时间达到500ms且慢日志达到一定数量则告警

  • 某个db下的请求Process_keys大于5000且慢日志达到一定数量则告警

告警规则的设置不是一蹴而就的,需要根据不同的业务场景,dba和研发不断的调整,最终达到一个比较合理的阀值。

3. 慢日志系统给带来的收益

目前,我们10个生产TiDB集群,有6个核心集群请求过万,如下图所示。

慢日志系统主要给我们线上服务带来3个收益。

  • 响应延时低,6个请求过万核心集群,999线基本维持在16ms左右,如下图所示

  • 慢日志越来越少,tidb所有集群的慢日志(大于200ms),30分钟内,高峰期条数基本维持在1000以内

  • 故障少,除一次tidb优化器bug导致大表查询故障,影响线上近15分钟外。近半年没有tidb引发的线上故障。

4. 总结

目前,伴鱼慢日志系统在性能问题发现和预防数据库性能风险等方面发挥了很重要的作用。未来,我们将继续挖掘慢日志里的信息,丰富慢日志系统的功能,为伴鱼数据库保驾护航。

这篇关于伴鱼数据库之慢日志系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/169190

相关文章

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

mysql数据库重置表主键id的实现

《mysql数据库重置表主键id的实现》在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了... 目录关键语法演示案例在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,当我们

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Spring Boot 整合 MyBatis 连接数据库及常见问题

《SpringBoot整合MyBatis连接数据库及常见问题》MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射,下面详细介绍如何在SpringBoot项目中整合My... 目录一、基本配置1. 添加依赖2. 配置数据库连接二、项目结构三、核心组件实现(示例)1. 实体类2. Ma

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用