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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
全局流量管理 GTM,标准版 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月前
|
运维 监控 持续交付
微服务架构解析:跨越传统架构的技术革命
微服务架构(Microservices Architecture)是一种软件架构风格,它将一个大型的单体应用拆分为多个小而独立的服务,每个服务都可以独立开发、部署和扩展。
317 36
微服务架构解析:跨越传统架构的技术革命
|
3天前
|
测试技术 双11 开发者
一文分析架构思维之建模思维
软件里的要素不是凭空出现的,都是源于实际的业务。本文从软件设计本源到建模案例系统的介绍了作者对于建模的思维和思考。
|
4天前
|
关系型数据库 分布式数据库 数据库
瑶池数据库大讲堂|PolarDB HTAP:为在线业务插上实时分析的翅膀
瑶池数据库大讲堂介绍PolarDB HTAP,为在线业务提供实时分析能力。内容涵盖MySQL在线业务的分析需求与现有解决方案、PolarDB HTAP架构优化、针对分析型负载的优化(如向量化执行、多核并行处理)及近期性能改进和用户体验提升。通过这些优化,PolarDB HTAP实现了高效的数据处理和查询加速,帮助用户更好地应对复杂业务场景。
|
27天前
|
机器学习/深度学习 存储 人工智能
基于AI的实时监控系统:技术架构与挑战分析
AI视频监控系统利用计算机视觉和深度学习技术,实现实时分析与智能识别,显著提升高风险场所如监狱的安全性。系统架构包括数据采集、预处理、行为分析、实时决策及数据存储层,涵盖高分辨率视频传输、图像增强、目标检测、异常行为识别等关键技术。面对算法优化、实时性和系统集成等挑战,通过数据增强、边缘计算和模块化设计等方法解决。未来,AI技术的进步将进一步提高监控系统的智能化水平和应对复杂安全挑战的能力。
|
1月前
|
存储 关系型数据库 MySQL
double ,FLOAT还是double(m,n)--深入解析MySQL数据库中双精度浮点数的使用
本文探讨了在MySQL中使用`float`和`double`时指定精度和刻度的影响。对于`float`,指定精度会影响存储大小:0-23位使用4字节单精度存储,24-53位使用8字节双精度存储。而对于`double`,指定精度和刻度对存储空间没有影响,但可以限制数值的输入范围,提高数据的规范性和业务意义。从性能角度看,`float`和`double`的区别不大,但在存储空间和数据输入方面,指定精度和刻度有助于优化和约束。
165 5
|
1月前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
2月前
|
弹性计算 持续交付 API
构建高效后端服务:微服务架构的深度解析与实践
在当今快速发展的软件行业中,构建高效、可扩展且易于维护的后端服务是每个技术团队的追求。本文将深入探讨微服务架构的核心概念、设计原则及其在实际项目中的应用,通过具体案例分析,展示如何利用微服务架构解决传统单体应用面临的挑战,提升系统的灵活性和响应速度。我们将从微服务的拆分策略、通信机制、服务发现、配置管理、以及持续集成/持续部署(CI/CD)等方面进行全面剖析,旨在为读者提供一套实用的微服务实施指南。
|
2月前
|
SQL 数据可视化 数据库
多维度解析低代码:从技术架构到插件生态
本文深入解析低代码平台,从技术架构到插件生态,探讨其在企业数字化转型中的作用。低代码平台通过图形化界面和模块化设计降低开发门槛,加速应用开发与部署,提高市场响应速度。文章重点分析开源低代码平台的优势,如透明架构、兼容性与扩展性、可定制化开发等,并详细介绍了核心技术架构、数据处理与功能模块、插件生态及数据可视化等方面,展示了低代码平台如何支持企业在数字化转型中实现更高灵活性和创新。
60 1
|
2月前
|
SQL 数据可视化 数据库
多维度解析低代码:从技术架构到插件生态
本文深入解析低代码平台,涵盖技术架构、插件生态及应用价值。重点介绍开源低代码平台的优势,如透明架构、兼容性与扩展性、可定制化开发,以及其在数据处理、功能模块、插件生态等方面的技术特点。文章还探讨了低代码平台的安全性、权限管理及未来技术趋势,强调其在企业数字化转型中的重要作用。
|
2月前
|
存储 边缘计算 安全
深入解析边缘计算:架构、优势与挑战
深入解析边缘计算:架构、优势与挑战
86 0

热门文章

最新文章