阿里巴巴 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%,触发告警,如下图:

总结

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

相关推荐
严文文-Chris19 分钟前
MySQL逻辑架构有什么?
数据库·mysql·架构
一只栖枝42 分钟前
Oracle OCP知识点详解2:yum 等服务的搭建
数据库·oracle·开闭原则·yum·ocp·服务搭建
wapicn991 小时前
查看手机在线状态,保障设备安全运行
java·网络·数据库·python·php
程序员三藏2 小时前
Selenium三大等待
自动化测试·软件测试·数据库·python·selenium·测试工具·测试用例
闪电麦坤953 小时前
SQL:Constraint(约束)
数据库·sql
观无3 小时前
.NET-EFCore基础知识
数据库·.net
^_^ 纵歌3 小时前
mongodb和clickhouse比较
数据库·clickhouse·mongodb
旅行的橘子汽水4 小时前
【C语言-全局变量】
c语言·开发语言·数据库
pwzs4 小时前
缓存不只是加速器:深入理解 Redis 的底层机制
数据库·redis·缓存
A尘埃4 小时前
电商中的购物车(redis的hash类型操作)
数据库·redis·哈希算法