阿里巴巴 Druid 可观测性最佳实践

Druid 介绍

阿里巴巴的 Druid 是一个开源的数据库连接池、SQL 解析、监控和扩展功能的工具集合。它不仅是一个高性能的数据库连接池,还提供了强大的监控和管理功能,帮助开发者更好地管理数据库连接、优化 SQL 查询以及监控数据库性能。

在可观测场景中,通常会接入 APM 调用链路和数据库的监控指标, 在 APM 中我们可以看到 SQL 的执行时间,在数据库可观测中可以看到审计日志中的慢 SQL 以及数据库的一些性能指标,如连接数、cpu 、内存等。 但应用到数据库之间的的执行过程是由连接池完成的,连接池可能会出现连接数配置不合理导致 SQL 执行排队、连接池设置过大导致数据库性能瓶颈等, 因此,对连接池的可观测变得非常重要。

观测云

观测云是一款专为 IT 工程师打造的全链路可观测产品,它集成了基础设施监控、应用程序性能监控和日志管理,为整个技术栈提供实时可观察性。这款产品能够帮助工程师全面了解端到端的用户体验追踪,了解应用内函数的每一次调用,以及全面监控云时代的基础设施。此外,观测云还具备快速发现系统安全风险的能力,为数字化时代提供安全保障。

部署 DataKit

DataKit 是一个开源的、跨平台的数据收集和监控工具,由观测云开发并维护。它旨在帮助用户收集、处理和分析各种数据源,如日志、指标和事件,以便进行有效的监控和故障排查。DataKit 支持多种数据输入和输出格式,可以轻松集成到现有的监控系统中。

登录观测云控制台,在「集成」 - 「DataKit」选择对应安装方式,当前采用 Linux 主机部署 DataKit。

数据采集

DataKit 配置

DataKit 安装完成后,可以自定义开启采集器,本集成需要开启如下两个采集器。

  • 开启 StatsD 采集器
bash 复制代码
# 开启采集器
cp /usr/local/datakit/conf.d/statsd/statsd.conf.sample /usr/local/datakit/conf.d/statsd/statsd.conf
# 重启 Datakit
datakit service -R
  • 开启链路采集
bash 复制代码
# 开启采集器
cp /usr/local/datakit/conf.d/ddtrace/ddtrace.conf.sample /usr/local/datakit/conf.d/ddtrace/ddtrace.conf
# 重启 Datakit
datakit service -R

客户端配置

以 Java Demo 应用为例,采集调用链路和 Druid 连接池指标。Demo 项目中连接池配置如下:

ini 复制代码
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.url=jdbc:mysql://xx.xx.xx.xx:3306/test?useSSL=false
spring.datasource.druid.username=root
spring.datasource.druid.password=*******
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=20
spring.datasource.druid.test-on-borrow=true
spring.datasource.druid.validation-query=SELECT 1

接入 APM ,配置采集 jmx ,应用启动增加如下参数,启动命令如下:

ini 复制代码
java \
-javaagent:/xxx/dd-java-agent.jar \
-Ddd.agent.port=9529 \
-Ddd.service=demo \
-Ddd.jmxfetch.check-period=1000 \
-Ddd.jmxfetch.enabled=true \
-Ddd.jmxfetch.config.dir=/xxx/ \
-Ddd.jmxfetch.config=druid.yaml \
-jar xxxx.jar 

dd-java-agent.jar Guance 版下载地址:

less 复制代码
wget -O dd-java-agent.jar 'https://static.guance.com/dd-image/dd-java-agent.jar'

其中 -Ddd.jmxfetch.config.dir 和 -Ddd.jmxfetch.config=druid.yaml 需要把 druid.yaml 放到 Java 启动可以读取到的地址。 druid.yaml 内容如下,无需修改:

yaml 复制代码
init_config:
  is_jmx: true
  collect_default_metrics: true

instances:
  - jvm_direct: true
    name: duird-DruidDataSource-monitoring
    collect_default_jvm_metrics: false
    collect_default_metrics: false
    refresh_beans: 60
    conf:
      - include:
          bean_regex: "com.alibaba.druid:type=DruidDataSource,id=\d+"
          tags:
            pool: druid
          attribute:
            MaxActive:
              metric_type: gauge
              alias: druid.max_active
            ConnectCount:
              metric_type: gauge
              alias: druid.connect_count
            WaitThreadCount:
              metric_type: gauge
              alias: druid.wait_thread_count
            ActivePeak:
              metric_type: gauge
              alias: druid.active_peak
            InitialSize:
              metric_type: gauge
              alias: druid.initial_size
            ConnectErrorCount:
              metric_type: gauge
              alias: druid.connect_error_count
            ActiveCount:
              metric_type: gauge
              alias: druid.active_count
            CloseCount:
              metric_type: gauge
              alias: druid.close_count
            PoolingCount:
              metric_type: gauge
              alias: druid.pooling_count
            RecycleCount:
              metric_type: gauge
              alias: druid.recycle_count
            CreateCount:
              metric_type: gauge
              alias: druid.create_count
            DestroyCount:
              metric_type: gauge
              alias: druid.destroy_count
            CommitCount:
              metric_type: gauge
              alias: druid.commit_count
            RollbackCount:
              metric_type: gauge
              alias: druid.rollback_count              
            MaxWait:
              metric_type: gauge
              alias: druid.max_wait
            MinIdle:
              metric_type: gauge
              alias: druid.min_idle
            MaxIdle:
              metric_type: gauge
              alias: druid.max_idle

关键指标

指标 描述 用途
active_count 当前正在被使用的连接数。 反映当前正在执行数据库操作的连接数量。如果该值接近 max_active,可能需要增加连接池的大小
active_peak 活跃连接数的历史峰值。 记录连接池在运行期间达到的最高活跃连接数,用于评估系统在高并发场景下的压力。
close_count 被关闭的连接数量。 统计连接池中被显式关闭的连接数,通常用于监控连接的生命周期。
commit_count 提交的事务数量。 统计通过连接池提交的事务数量,用于评估数据库操作的频率。
connect_count 成功建立的连接总数。 统计连接池中成功创建的连接数量,反映连接池的使用情况。
connect_error_count 连接失败的次数。 统计连接池中因各种原因(如网络问题、数据库不可用)导致连接失败的次数。
create_count 创建的连接数量。 统计连接池中实际创建的连接数,与 connect_count 类似,但更侧重于连接池内部的创建操作。
destroy_count 销毁的连接数量。 统计连接池中被销毁的连接数,通常是因为连接超时或达到最大使用次数。
initial_size 连接池初始化时创建的连接数。 配置项,指定连接池启动时初始化的连接数量。
max_active 连接池中允许的最大活跃连接数。 配置项,限制连接池中同时活跃的连接数,防止资源耗尽。
max_idle 连接池中允许的最大空闲连接数。 配置项,限制连接池中空闲连接的数量,避免过多的空闲连接占用资源。
max_wait 连接池中获取连接的最大等待时间 配置项,指定客户端在获取连接时的最大等待时间。如果超过这个时间,会抛出超时异常。
min_idle 连接池中允许的最小空闲连接数。 配置项,确保连接池中始终有一定数量的空闲连接,以便快速响应请求。
pooling_count 当前空闲的连接数。 反映连接池中未被使用的连接数量,用于评估连接池的资源利用率。
recycle_count 回收的连接数量。 统计连接池中被回收(重新利用)的连接数,反映连接池的复用情况。
rollback_count 回滚的事务数量。 统计通过连接池回滚的事务数量,用于评估事务的失败情况。
wait_thread_count 当前等待获取连接的线程数。 反映当前有多少线程正在等待连接池分配连接。如果该值持续较高,可能需要调整 max_activemax_wait

场景视图

登录观测云控制台,点击「场景」 -「新建仪表板」,输入 "Druid", 选择 "Druid 监控视图",点击 "确定" 即可添加视图。

监控器(告警)

  • 服务连接池排队获取连接数过多

简要描述:检测指标 wait_thread_count , 5分钟内平均值超过5则触发警告,如下图:

  • 服务连接池连接失败出现频率过高

简要描述:检测指标 connect_error_count , 出现错误的次数大于1个/秒,则触发告警,如下图:

  • 服务服务连接池使用率告警

简要描述:检测指标 active_count/max_active ,当使用率超过80%,触发告警,如下图:

总结

这些指标提供了连接池运行状态的全面视图,帮助开发者和运维人员监控和优化数据库连接池的性能。通过合理配置和监控这些指标,可以确保连接池在高并发场景下高效运行,同时避免资源浪费和性能瓶颈。

相关推荐
r i c k几秒前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦14 分钟前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL1 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·1 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德1 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫2 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i2 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.2 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn2 小时前
【Redis】渐进式遍历
数据库·redis·缓存
橙露2 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot