企业实战之阿里druid统一监控方案,你了解吗?
前言
相信大家对阿里的druid数据库连接池很熟悉了,在国内使用数据库操作的时候,绝大部分都会引用druid。当然今天不是介绍怎么使用druid,而是分析一下druid的监控。我们先来回顾一下druid是什么吧?
简介
1、Druid是阿里开源的一个JDBC应用组件, 其包括三部分:
DruidDriver: 代理Driver,能够提供基于Filter-Chain模式的插件体系。
DruidDataSource: 高效可管理的数据库连接池。
SQLParser: 实用的SQL语法分析
2、通过Druid连接池中间件, 我们可以实现:
可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
替换传统的DBCP和C3P0连接池中间件。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
数据库密码加密。直接把数据库密码写在配置文件中,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter-Chain机制,很方便编写JDBC层的扩展插件
监控
druid最大的特色就是有相应的监控,可以帮忙我们查看到执行SQL日志,慢SQL语句,执行SQL的性能以及防止SQL注入等功能。
数据源
数据源菜单显示数据库连接池的基本信息,如连接地址、连接类型、最大连接数、最小连接数、初始连接等信息。
可通过逻辑连接打开次数、逻辑连接关闭次数来判断系统中是否存在有连接未关闭的情况(正常情况下打开次数和关闭次数应该一致)
SQL监控
SQL监控显示系统已执行过的每条SQL语句的执行情况。通过执行数、执行时间、最慢时间、事务中、错误数、最大并发、执行时间分布等统计维度来展现。
1、执行数:本条sql语句已执行的次数 2、执行时间:本条sql语句累计执行时间(单位:毫秒) 3、最慢:本条sql语句执行最慢一次的耗时(单位:毫秒) 4、执行时间分布【- - - - - - - -】:这8个 – 分别代表8个耗时区间的次数,从左至右依次是: 0-1毫秒次数、1-10毫秒次数、10-100毫秒次数、100-1000毫秒次数、1-10秒次数、10-100秒次数、100-1000秒次数、大于1000秒次数。
WEB应用
主要统计本应用的并发、请求、事务提交、事务回滚等信息,另外统计了本应用在各操作系统上、各浏览器上的访问次数。
SQL防火墙
分防御统计、表访问统计、函数调用统计、SQL防御统计-白名单、SQL防御统计-黑名单这几项。其中若是涉嫌SQL注入的SQL语句将被拦截,出现在SQL防御统计-黑名单中
请求URL监控
统计了应用中各url的访问次数、请求时间、并发数等信息
编辑切换为居中
添加图片注释,不超过 140 字(可选)
Session监控
显示应用中session的请求时间、请求次数、最大并发等数据
编辑切换为居中
添加图片注释,不超过 140 字(可选)
问题一
我们看到了druid监控功能的强大,也发现了一个重大的问题,如图
编辑切换为居中
添加图片注释,不超过 140 字(可选)
druid控制台是针对每个实例的,不同的实例就有不同的druid控制台;但在生产环境中,会有多个实例,那监控平台会存在多个,那我们运维/开发人员查看的时候就麻烦了,需要打开多个控制台。不能整体查看监控数据。
那怎么解决呢?
源码分析
我们先来看一下druid的监控功能是怎么实现的?
我们看一下DruidDataSource核心类,里面有一个LogStatsThread线程
private LogStatsThread logStatsThread;
在DruidDataSource初始化init方法中,调用了createAndLogThread方法,再看一下createAndLogThread这个方法,在timeBetweenLogStatsMillis属性大于0的时候就实例化LogStatsThread线程。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
再来看一下LogStatsThread线程做了什么
编辑切换为居中
添加图片注释,不超过 140 字(可选)
LogStatsThread线程一直循环调用logStats方法,每次sleep睡眠timeBetweenLogStatsMillis毫秒。那我们就知道这个参数的本质就是每隔多少毫秒去执行logStats方法。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
上面的代码表示,数据监控是存在DruidDataSourceStatValue实例里面,然后statLogger对象进行记录。到底存放到哪里,就由statLogger决定。
druid默认的DruidDataSourceStatLogger接口实现 DruidDataSourceStatLoggerImpl,
可以看到Druid是以Json形式进行日志输出的,具体的数据处理在log(DruidDataSourceStatValue)方法中进行,这个方法也是后续我们需要用到的。
方案一
Druid默认的持久化方式是进行文件记录,如果我们想要自定义监控记录的持久化方式则需要自定义StatLogger,参考以上StatLogger的默认实现,我们可以定义一个简单的StatLogger,如下所示:
)
在这里,我们重写了log(DruidDataSourceStatValue)方法,一个简单的StatLogger就定制完成了,下面需要在dataSource中配置这个statLogger,我们在配置文件中druid节点下加上如下配置:
time-between-log-stats-millis: 60000 stat-logger:
配置过程中发现 stat-logger 对应的是一个 DruidDataSourceStatLoggerAdapter对象,而yml配置文件中仅支持基本数据类型和Map、List等类型,查看源码可以发现,在DruidAbstractDataSource类中有如下定义:
支持直接设置statLogger对象和通过类名设置两种方式,回到配置文件中发现没有类名的这个配置项,如下:
既然通过配置文件不能够直接配置,那么我们就以配置类的方式来配置Druid数据源,新建一个Druid的配置类,如下所示:
其中@ConfigurationProperties表示配置的属性,这里会将配置文件中以spring.datasource.druid为前缀的值映射到DataSource对象的同名属性上,在这个方法中,我们将DatSource的statLogger设置为我们自定义的StatLogger。
这样配置之后,我们就可以看到每隔10秒会做监控数据的持久化了。
问题二
我们再仔细看一下上面的方案,如图
上面的方案会有一些问题
1、如果持久化数据库挂了,就会导致监控数据会丢失 2、在很多实例的时候,都会给数据库进行提交监控数据;会产生高并发问题 3、druid组件和监控持久化有一定耦合关系了。监控持久化业务异常就有可能会影响到druid
怎么解决呢?我们再回来看看druid之前的监控数据方案,druid默认把监控数据记录下日志文件中,这个方案其实已经把监控数据持久化到磁盘上面了,只是日志文件是保存在每个服务实例上面的。那是不是我们只要把这些日志都收集起来,保存到某处,这样是不是也就可以了?
方案二
我们来调整一下方案
这个方案涉及到大数据方面的知识点了,其实也不是太难,大家只要理解架构思路就行了
如上核心思想就是采集日志文件,然后把日志数据发送到消息中间件kafka(这样就起到了削峰作用);再独立开发个持久化服务订阅kafka消息,做持久化业务。
这个方案就解决了之前方案一的问题,又能抗高并发,又能解耦合
方案中有个Flume组件,他的作用就是用来采集文件,然后同步到各个地方,常用到的就是同步到kafka中。
现在大多数Druid配置都是log4j作为logger,但是logback作为新一代的日志框架,我们有理由使用logback配置Druid Filter,之前的配置是:
dataSourceA.filters=stat,wall,log4j
Druid支持配置多种Filter,配置信息保存在druid-xxx.jar! /META-INF/druid-filter.properties下面,具体如下:
我们知道,logback是slf4j的实现类,按照规定格式,改成下面就可以了:
dataSourceA.filters=stat,wall,slf4j
具体logback的配置,这里就不介绍了。
总结
本文介绍了druid的监控数据的统一化管理,可以方便我们开发运维进行监控,虽然我们已经把监控数据都进行了采集,那怎么在界面上面显示,这个就需要报表可视化的方案了,有时间老顾会给大家介绍,谢谢!!!
企业实战之阿里druid统一监控方案,你了解吗?相关推荐
- 【夏目鬼鬼分享】springboot搭建阿里Druid数据源监控
Druid介绍 Druid是一个专为大型数据集上的高性能切片和OLAP分析而设计的数据存储.Druid最常用作为GUI分析应用程序提供动力的数据存储,或者用作需要快速聚合的高度并发API的后端. Dr ...
- 老杨说运维 | 企业数字化转型中,统一监控的必要性
前言:随着企业落地案例越来越多,智能运维从开始时的"点状"场景建设,逐步升级为"体系求变".即企业从转型初期就要思考总体的AIOps体系应当如何建设,选择合适的 ...
- Zabbix 3.0入门到企业实战阅读目录
Zabbix 3.0入门到企业实战阅读目录 第一篇:Zabbix 3.0入门到企业实战一(介绍监控的目的需求) 第二篇:Zabbix 3.0入门到企业实战二(zabbix介绍与安装) 第三篇:Zabb ...
- 注意:阿里Druid连接池监控的两个坑
image 阿里的Druid大家都知道是最好的连接池,其强大的监控功能是我们追求的重要特性.但在实际情况中也有不少坑,说下最近遇到的一个坑吧! 问题1:不断打印error级别的错误日志 session ...
- 阿里云容器Kubernetes监控(七) - Prometheus监控方案部署
前言 Prometheus是一款面向云原生应用程序的开源监控工具,作为第一个从CNCF毕业的监控工具而言,开发者对于Prometheus寄予了巨大的希望.在Kubernetes社区中,很多人认为Pro ...
- 阿里Druid连接池监控的两个坑
转载自 注意:阿里Druid连接池监控的两个坑 阿里的Druid大家都知道是最好的连接池,其强大的监控功能是我们追求的重要特性.但在实际情况中也有不少坑,说下最近遇到的一个坑吧! 问题1:不断打印er ...
- 阿里云sql监控配置-druid
今天我们说说数据源和数据库连接池,熟悉java开发的同仁应该都了解C3PO,在这里不做过多的赘述了,今天我们说的是阿里DRUID,druid是后起之秀,因为它的优秀很快占领了使用市场,下边我们一起来看 ...
- 阿里开源mysql监控_Alibaba-技术专区-开源项目之Druid数据库监控平台
一. 介绍: DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对 ...
- docker swarm集群监控方案cAdvisor+InfluxDB+Grafana实战
docker swarm集群的监控方案很多,cAdvisor+InfluxDB+Grafana方案功能强大灵活.最重要的是这个方案开源.免费.易用,是不花钱版监控方案.参考文档:https://bot ...
最新文章
- Genome Biology | 基于RNA-seq的孟德尔疾病变异分析
- iOS开发小技巧--利用苹果官方API播放视频(方法已经过时,了解一下)
- Windows 2008 R2 SP1部署Exchange2010 SP1(原创)
- Java后台开发Tomcat添加https支持小程序开发过程
- python代码解读软件_5种带你轻松分析Python代码的软件库
- 从一线技术人员到阿里合伙人,主导了去“IOE”,没有他,阿里只能给美国公司打工!...
- spring cloud微服务分布式云架构-config配置自动刷新
- java常用设计模式七:装饰模式
- java对获取的字节数组进行处理
- .NET中的异常处理机制(一)
- 2020 年的第一天,程序员鸭血粉丝又碰上生产事故
- access数据库应用系统客观题_Access制作客观题考试系统的应用
- 计算机里的音乐怎么设置,realtek高清晰音频管理器怎么设置
- EVEREST工具---检测硬件
- Wing-新一代百度大数据查询引擎
- 阿里云的“飞天“是什么?
- 推荐一款开源的电子书格式转换工具
- 计算机职高会考知识,高职考试语文基础知识
- kafka auto.offset.reset / latest / earliest 详解
- vue项目中通过cdn引入资源并配置