Druid数据库连接池的详细解析!分析说明数据库连接池Druid的参数配置和基本架构

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云解析 DNS,旗舰版 1个月
简介: 本篇文章中介绍了数据库连接池Alibaba Druid的组成部分以及Druid的作用和基本配置。详细说明了Druid的基本架构,分别介绍了Druid中的实时节点,历史节点,查询节点,协调节点以及索引服务。通过本篇文章的学习,可以对数据库连接池Druid的参数配置和基本架构有清楚的认识。

数据库连接池-Alibaba Druid

  • Druid是JDBC组件,包括三个部分:

    • DruidDriver: 代理Driver,能够提供基于Filter-Chain模式的插件体系
    • DruidDataSource: 高效可管理的数据库连接池
    • SQL Parser: Druid内置使用SQL Parser来实现防御SQL注入(WallFilter),合并统计没有参数化的SQL(StatFilter的mergeSql),SQL格式化,分库分表
  • Druid的作用:

    • 监控数据库访问性能: Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,提升线上分析数据库访问性能
    • 替换DBCP和C3P0: Druid提供了一个高效,功能强大,可扩展性好的数据库连接池
    • 数据库密码加密: 直接把数据库密码写在配置文件容易导致安全问题,DruidDruiver和DruidDataSource都支持PasswordCallback
    • 监控SQL执行日志: Druid提供了不同的LogFilter,能够支持Common-Logging,Log4j和JdkLog,可以按需要选择相应的LogFilter,监控数据库访问情况
    • 扩展JDBC: 通过Druid提供的Filter-Chain机制,编写JDBC层的扩展
  • 配置参数: Druid的DataSource:com.alibaba.druid.pool.DruidDataSource
配置参数 缺省值 说明
name 如果存在多个数据源,监控时可以通过name属性进行区分,如果没有配置,将会生成一个名字:"DataSource-"+System.identityHashCode(this)
jdbcUrl 连接数据库的url,不同的数据库url表示方式不同:
mysql:jdbc:mysql://192.16.32.128:3306/druid2
oracle : jdbc:oracle:thin:@192.16.32.128:1521:druid2
username 连接数据库的用户名
password 连接数据库的密码,密码不出现在配置文件中可以使用ConfigFilter
driverClassName 根据jdbcUrl自动识别 可以不配置,Druid会根据jdbcUrl自动识别dbType,选择相应的driverClassName
initialSize 0 初始化时建立物理连接的个数.
初始化过程发生在:显示调用init方法;第一次getConnection
maxActive 8 最大连接池数量
minIdle 最小连接池数量
maxWait 获取连接时最大等待时间,单位毫秒.
配置maxWait默认使用公平锁等待机制,并发效率会下降.可以配置useUnfairLock为true使用非公平锁
poolPreparedStatements false 是否缓存preparedStatement,即PSCache.
PSCache能够提升对支持游标的数据库性能.
Oracle中使用,在MySQL中关闭
maxOpenPreparedStatements -1 要启用PSCache,必须配置参数值>0,poolPreparedStatements自动触发修改为true.
Oracle中可以配置数值为100,Oracle中不会存在PSCache过多的问题
validationQuery 用来检测连接的是否为有效SQL,要求是一个查询语句
如果validationQuery=null,那么testOnBorrow,testOnReturn,testWhileIdle都不会起作用
testOnBorrow true 申请连接时执行validationQuery检测连接是否有效,会降低性能
testOnReturn false 归还连接时执行validationQuery检测连接是否有效,会降低性能
testWhileIdle false 申请连接时,空闲时间大于timeBetweenEvictionRunsMillis时,执行validationQuery检测连接是否有效
不影响性能,保证安全性,建议配置为true
timeBetweenEvictionRunsMillis Destroy线程会检测连接的间隔时间
testWhileIdle的判断依据
connectionInitSqls 物理连接初始化时执行SQL
exceptionSorter 根据dbType自动识别 当数据库跑出不可恢复的异常时,抛弃连接
filters 通过别名的方式配置扩展插件,属性类型是字符串:
常用的插件:
监控统计用的filter:stat
日志用的filter:log4j
防御sql注入的filter:wall
proxyFilters 类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters是组合关系,不是替换关系

Druid的架构

Druid数据结构
  • Druid架构相辅相成的是基于DataSource和Segment的数据结构
  • DataSource数据结构:逻辑概念, 与传统的关系型数据库相比较DataSource可以理解为表

    • 时间列: 表明每行数据的时间值
    • 维度列: 表明数据的各个维度信息
    • 指标列: 需要聚合的列的数据
  • Segment结构: 实际的物理存储格式,

    • Druid通过Segment实现了横纵向切割操作
    • Druid将不同的时间范围内的数据存放在不同的Segment文件块中,通过时间实现了横向切割
    • Segment也面向列进行数据压缩存储,实现纵向切割
  • Druid架构包含四个节点和一个服务:

    • 实时节点(RealTime Node): 即时摄入实时数据,并且生成Segment文件
    • 历史节点(Historical Node): 加载已经生成好的数据文件,以供数据查询使用
    • 查询节点(Broker Node): 对外提供数据查询服务,并且从实时节点和历史节点汇总数据,合并后返回
    • 协调节点( Coordinator Node): 负责历史节点的数据的负载均衡,以及通过规则管理数据的生命周期
  • 索引服务(Indexing Service): 有不同的获取数据的方式,更加灵活的生成segment文件管理资源
实时节点
  • 主要负责即时摄入实时数据,以及生成Segment文件
  • 实时节点通过firehose进行数据的摄入,firehose是Druid实时消费模型
通过kafka消费,就是kafkaFireHose.
同时,实时节点的另外一个模块Plumer,用于Segment的生成,并且按照指定的周期,
将本周期内生成的所有数据块合并成一个
  • Segment文件从制造到传播过程:
1.实时节点生产出Segment文件,并且存到文件系统中
2.Segment文件的<MetaStore>存放到Mysql等其他外部数据库中
3.Master通过Mysql中的MetaStore,通过一定的规则,将Segment分配给属于它的节点
4.历史节点得到Master发送的指令后会从文件系统中拉取属于自己的Segment文件,并且通过zookeeper,告知集群,自己提供了此块Segment的查询服务
5.实时节点丢弃Segment文件,并且声明不在提供此块文件的查询服务
历史节点
  • 历史节点再启动的时候:

    • 优先检查自己的本地缓存中是否已经有了缓存的Segment文件
    • 然后从文件系统中下载属于自己,但还不存在的Segment文件
    • 无论是何种查询,历史节点首先将相关的Segment从磁盘加载到内存.然后再提供服务
  • 历史节点的查询效率受内存空间富余程度的影响很大:

    • 内存空间富余,查询时需要从磁盘加载数据的次数减少,查询速度就快
    • 内存空间不足,查询时需要从磁盘加载数据的次数就多,查询速度就相对较慢
    • 原则上历史节点的查询速度与其内存大小和所负责的Segment数据文件大小成正比关系
查询节点
  • 查询节点便是整个集群的查询中枢:

    • 在常规情况下,Druid集群直接对外提供查询的节点只有查询节点, 而查询节点会将从实时节点与历史节点查询到的数据合并后返回给客户端
  • Druid使用了Cache机制来提高自己的查询效率.
  • Druid提供两类介质作为Cache:

    • 外部cache:Memcached
    • 内部Cache: 查询节点或历史节点的内存, 如果用查询节点的内存作为Cache,查询的时候会首先访问其Cache,只有当不命中的时候才会去访问历史节点和实时节点查询数据
协调节点
  • 对于整个Druid集群来说,其实并没有真正意义上的Master节点.
  • 实时节点与查询节点能自行管理并不听命于任何其他节点,
  • 对于历史节点来说,协调节点便是他们的Master,因为协调节点将会给历史节点分配数据,完成数据分布在历史节点之间的负载均衡.
  • 历史节点之间是相互不进行通讯的,全部通过协调节点进行通讯
  • 利用规则管理数据的生命周期:

    • Druid利用针对每个DataSoure设置的规则来加载或者丢弃具体的文件数据,来管理数据的生命周期
    • 可以对一个DataSource按顺序添加多条规则,对于一个Segment文件来说,协调节点会逐条检查规则
    • 当碰到当前Segment文件负责某条规则的情况下,协调节点会立即命令历史节点对该文件执行此规则,加载或者丢弃,并停止余下的规则,否则继续检查
索引服务

除了通过实时节点生产Segment文件之外,druid还提供了一组索引服务来摄入数据

  • 索引服务的优点:

    • 有不同的获取数据的方式,支持pull和push
    • 可以通过API编程的方式来配置任务
    • 可以更加灵活地使用资源
    • 灵活地操作Segment文件
  • 索引服务的主从架构:

索引服务包含一组组件,并以主从结构作为架构方式,统治节点 Overload node为主节点,中间管理者Middle Manager为从节点

  • Overload node: 索引服务的主节点.对外负责接收任务请求,对内负责将任务分解并下发到从节点即Middle Manager.有两种运行模式:

    • 本地模式(默认): 此模式主节点不仅需要负责集群的调度,协调分配工作,还需要负责启动Peon(苦工)来完成一部分具体的任务
    • 远程模式: 主从节点分别运行在不同的节点上,主节点只负责协调分配工作.不负责完成任务,并且提供rest服务,因此客户端可以通过HTTP POST来提交任务
Middle Manager与Peon(苦工):
Middle Manager即是Overload node 的工作节点,负责接收Overload node分配的任务,
然后启动相关的Peon来完成任务这种模式和yarn的架构比较类似

1.Overload node相当于Yarn的ResourceManager,负责资源管理和任务分配
2.Middle Manager相当于Yarn的NodeManager,负责管理独立节点的资源,并且接收任务
3.Peon 相当于Yarn的Container,启动在具体节点上具体任务的执行
相关文章
|
1月前
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
|
1月前
|
消息中间件 资源调度 关系型数据库
如何在Flink on YARN环境中配置Debezium CDC 3.0,以实现实时捕获数据库变更事件并将其传输到Flink进行处理
本文介绍了如何在Flink on YARN环境中配置Debezium CDC 3.0,以实现实时捕获数据库变更事件并将其传输到Flink进行处理。主要内容包括安装Debezium、配置Kafka Connect、创建Flink任务以及启动任务的具体步骤,为构建实时数据管道提供了详细指导。
58 9
|
1月前
|
安全 Nacos 数据库
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改。本文详细探讨了这一问题的原因及解决方案,包括限制公网访问、使用HTTPS、强化数据库安全、启用访问控制、监控和审计等步骤,帮助开发者确保服务的安全运行。
40 3
|
1月前
|
PHP 数据库 数据安全/隐私保护
布谷直播源码部署服务器关于数据库配置的详细说明
布谷直播系统源码搭建部署时数据库配置明细!
|
1月前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
58 2
|
1月前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
50 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
Tokenformer:基于参数标记化的高效可扩展Transformer架构
本文是对发表于arXiv的论文 "TOKENFORMER: RETHINKING TRANSFORMER SCALING WITH TOKENIZED MODEL PARAMETERS" 的深入解读与扩展分析。主要探讨了一种革新性的Transformer架构设计方案,该方案通过参数标记化实现了模型的高效扩展和计算优化。
114 0
|
23天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
61 2
|
2月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
72 0
|
2月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
57 0