阿里的druid 监控

摘要:
Druid为过滤器链模式提供了扩展的API。您可以编写自己的Filter来拦截JDBC中的任何方法。您可以在其上执行任何操作,例如性能监视、SQL审计、用户名密码加密、日志等。Druid提供用于监视的内置StatFilters、用于日志输出的Log Series Filters和用于防御SQL注入攻击的WallFilters。阿里巴巴内部实现了CirceFilter用于数据库密码加密,DragonStatFilter用于Web和Spring的关联监控。目前,只有Druid和JBossDataSource实现了ExceptionSorter。Druid、DBCP、Proxool和JBoss符合LRU。

Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。

Druid支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。 

Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。

优点:

首先,强大的监控特性,通过Druid提供的监控功能,可以清楚知道连接池和SQL的工作情况。 

  • 监控SQL的执行时间、ResultSet持有时间、返回行数、更新行数、错误次数、错误堆栈信息。
  • SQL执行的耗时区间分布。什么是耗时区间分布呢?比如说,某个SQL执行了1000次,其中0~1毫秒区间50次,1~10毫秒800次,10~100毫秒100次,100~1000毫秒30次,1~10秒15次,10秒以上5次。通过耗时区间分布,能够非常清楚知道SQL的执行耗时情况。
  • 监控连接池的物理连接创建和销毁次数、逻辑连接的申请和关闭次数、非空等待次数、PSCache命中率等。
阿里的druid 监控第1张


其次,方便扩展。Druid提供了Filter-Chain模式的扩展API,可以自己编写Filter拦截JDBC中的任何方法,可以在上面做任何事情,比如说性能监控、SQL审计、用户名密码加密、日志等等。 

Druid内置提供了用于监控的StatFilter、日志输出的Log系列Filter、防御SQL注入攻击的WallFilter。 

阿里巴巴内部实现了用于数据库密码加密的CirceFilter,以及和Web、Spring关联监控的DragoonStatFilter。 

阿里的druid 监控第2张


第三,Druid集合了开源和商业数据库连接池的优秀特性,并结合阿里巴巴大规模苛刻生产环境的使用经验进行优化。 

    • ExceptionSorter。当一个连接产生不可恢复的异常时,例如Oracle error_code_28 session has been killed,必须立刻从连接池中逐出,否则会产生大量错误。目前只有Druid和JBoss DataSource实现了ExceptionSorter。
    • PSCache内存占用优化对于支持游标的数据库(Oracle、SQL Server、DB2等,不包括MySql),PSCache可以大幅度提升SQL执行性能。一个PreparedStatement对应服务器一个游标,如果PreparedStatement被缓存起来重复执行,PreparedStatement没有被关闭,服务器端的游标就不会被关闭,性能提高非常显著。在类似“SELECT * FROM T WHERE ID = ?”这样的场景,性能可能是一个数量级的提升。但在Oracle JDBC Driver中,其他的数据库连接池(DBCP、JBossDataSource)会占用内存过多,极端情况可能大于1G。Druid调用OracleDriver提供管理PSCache内部API。
    • LRU是一个性能关键指标,特别Oracle,每个Connection对应数据库端的一个进程,如果数据库连接池遵从LRU,有助于数据库服务器优化,这是重要的指标。Druid、DBCP、Proxool、JBoss是遵守LRU的。BoneCP、C3P0则不是。BoneCP在mock环境下性能可能还好,但在真实环境中则就不好了。
1、maven配置
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.0.23</version>
</dependency>
 
 
二、web.xml配置

<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<init-param>
<!-- 允许清空统计数据 -->
<param-name>resetEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 用户名 -->
<param-name>loginUsername</param-name>
<param-value>yitop</param-value>
</init-param>
<init-param>
<!-- 密码 -->
<param-name>loginPassword</param-name>
<param-value>123456</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>

<filter>
<filter-name>DruidWebStatFilter</filter-name>
<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
<init-param>
<param-name>exclusions</param-name>
<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,*.woff,*.cache.html,*.eot,/druid/*,hosted.html,index.html</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>DruidWebStatFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

 
 
三、spring配置
 

<bean class="com.alibaba.druid.filter.logging.Slf4jLogFilter">
<property name="statementExecutableSqlLogEnable" value="true"/>
</bean>

<bean class="com.alibaba.druid.filter.stat.StatFilter">
<property name="slowSqlMillis" value="3000"/>
<property name="logSlowSql" value="true"/>
</bean>

<!-- 数据源 -->
<bean init-method="init" destroy-method="close">
<!-- 基本属性 url、user、password -->
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="1" />
<property name="minIdle" value="1" />
<property name="maxActive" value="20" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="10000" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="validationQuery" value="SELECT 'x' FROM DUAL" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
<!-- 配置监控统计拦截的filters -->
<property name="proxyFilters">
<list>
<ref bean="stat-filter"/>
<ref bean="slf4j-filter"/>
</list>
</property>
</bean>

 4、配置成功发布项目后,可进入"项目url/druid/login.html"来体检druid强大的监控功能

免责声明:文章转载自《阿里的druid 监控》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇springboot elasticsearch 集成注意事项Mac下使用Wine安装Xshell 4和Xftp 4下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

阿里云DataV可视化使用疑虑及解决方法

1.dataV使用要求 datav访问需要使用高版本chrome浏览器 要60版本以上 如果使用的组件比较多 并且使用3D组件这些 对配置也有一定的要求 大屏最好是图形显卡 以及 16G内存以上 个人电脑的话 最好是游戏性能显卡 以及 16G内存以上 有没有电视可以直接访问dataV发布的url,效果不受影响 目前不定 2.dataV可视化...

Ubuntu 更换阿里云软件源(转)

使用Ubuntu 的apt-get来安装软件是总是因为官方源的速度太慢而抓狂。但是用阿里云的源就很快,下面总结一下如何更换Ubuntu的软件源。 一、备份 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 二、修改 sudo vim /etc/apt/sources.list 将source....

spring boot2.0.4集成druid,用jmeter并发测试工具调用接口,druid查看监控的结果

一、项目介绍(本项目用的编程语言是jdk8,项目源码: https://github.com/zhzhair/mybatis-druid-spring-boot.git)   1.引入pom依赖:   <dependencies>     <dependency>       <groupId>org.springfra...

百度云服务器与域名绑定,设置解析记录

前段时间,百度推送了一条消息,一个很便宜的服务器,我就买了。 很久以前,购买的域名www.ab123.com.cn,放在了阿里云,也就是用了阿里云的DNS。 就这样,一直闲着。 这两天没事,想着能不能做个网站起来。其实就是用已有的index.php文件上传到服务器,看看网站效果。 哎,这不是专业出身的就是难,搞来稿去,还是半成品。 下面开始说重点。 1、登...

跨时代的分布式数据库 – 阿里云DRDS详解

随着互联网时代的到来,计算机要管理的数据量成指数级别的飞速上涨。而我们完全无法对用户数做出准确的预估,我们的系统所需要支持的用户数很可能在短短的一个月内突然爆发式的增长几千倍,数据也很可能快速的从原来的几百GB飞速上涨到了几百个TB。如果在这爆发的关键时刻,系统不稳定或无法访问,那么对于业务将会是毁灭性的打击。 伴随着这种对于系统性能、成本以及扩展性的新需...

配置Struts应用解读Struts应用的两大配置文件

1.引言 关于Struts项目,在以前的文章中我已经做过一些介绍,在此不再赘述。写本文,旨在从纯Struts应用配置的角度深入剖析Struts配置文件在Web应用中的所扮演的角色及其工作机制,以加深对Struts内幕的理解和认知。以期在实际开发项目中灵活应用,提高分析和解决实际问题的能力。 2.进入主题 Struts应用采用两个基于XML的配置文件来配置应用...