Apache Druid PostgreSQL 元数据存储与 PostgreSQL 批量摄入实战指南
数据库OLAP大数据后端【免费下载链接】druidApache Druid: a high performance real-time analytics database.项目地址https://gitcode.com/gh_mirrors/druid6/druid点击查看免费下载Apache Druid 的 Coordinator、Overlord 等服务依赖元数据存储Metadata Store来保存数据源、段、任务、规则等系统状态。本指南以仓库中的 PostgreSQL Metadata Store 官方文档为主体系统讲解如何将 PostgreSQL 配置为 Druid 的元数据存储、如何通过postgresql-metadata-storage扩展加载 SSL 连接参数与表 schema 设置并演示如何利用该扩展自带的 SQL InputSource 直接从 PostgreSQL 批量导入数据同时结合 postgresql-metadata-storage 模块源码与测试说明其底层实现原理。读完本文你将能独立完成「PostgreSQL 安装 → Druid 配置 → SSL 连接 → 批量摄入」的完整闭环。扩展加载把 postgresql-metadata-storage 加入 loadListDruid 以扩展Extension机制隔离第三方依赖PostgreSQL 元数据存储驱动位于独立的扩展模块中必须先加载才能使用。官方文档的加载扩展说明要求将该扩展名加入扩展加载列表druid.extensions.loadList[postgresql-metadata-storage]该配置通常写在common.runtime.properties集群中各节点共享的公共配置中。仓库自带的 common.runtime.properties 默认使用 Derby但已预留了 PostgreSQL 的注释示例可直接取消注释切换#druid.metadata.storage.connector.connectURIjdbc:postgresql://db.example.com:5432/druid #druid.metadata.storage.connector.user... #druid.metadata.storage.connector.password...扩展模块 postgresql-metadata-storage/pom.xml 的核心依赖是org.postgresql:postgresqlJDBC 驱动、org.jdbi:jdbi与commons-dbcp2。从源码结构看驱动类被扩展类加载器隔离加载因此 PostgreSQLConnector 在构造时会显式调用datasource.setDriverClassLoader(getClass().getClassLoader())和setDriverClassName(org.postgresql.Driver)帮助 JDBC 定位驱动。搭建 PostgreSQL 元数据存储环境1. 安装 PostgreSQL文档建议使用系统包管理器安装。若后续升级涉及大元数据表的 schema 变更建议选择支持“即时 ADD COLUMN”instant ADD COLUMN即添加列不重写整表语义的 PostgreSQL 版本以降低升级成本Ubuntu/Debianaptapt-get install postgresqlOS XHomebrewbrew install postgresql2. 创建 druid 数据库与用户在装有 PostgreSQL 的机器上用具备足够权限的账号执行以下命令。创建用户时系统会提示输入密码示例中填写diurdcreateuser druid -P创建由该用户拥有的数据库createdb druid -O druid注意在 Ubuntu/Debian 上若当前账号权限不足可能需要为上述命令加上sudo -u postgres前缀以获得正确的 PostgreSQL 权限。3. 配置 Druid 元数据存储连接将以下参数加入 Druid 配置common.runtime.properties把host替换为数据库实际地址主机名与端口druid.extensions.loadList[postgresql-metadata-storage] druid.metadata.storage.typepostgresql druid.metadata.storage.connector.connectURIjdbc:postgresql://host/druid druid.metadata.storage.connector.userdruid druid.metadata.storage.connector.passworddiurd各参数含义参数说明druid.extensions.loadList声明加载 PostgreSQL 扩展druid.metadata.storage.type元数据存储类型postgresql与扩展内部注册的TYPE常量对应druid.metadata.storage.connector.connectURIJDBC 连接串指向 druid 库druid.metadata.storage.connector.user/.password连接数据库的账号与密码连接串connectURI、用户名与密码由通用的MetadataStorageConnectorConfig解析。密码属于敏感信息仓库默认配置中已将druid.metadata.storage.connector.password列入隐藏属性见 common.runtime.properties 中的druid.server.hiddenProperties防止其在服务状态页等位置泄露生产环境建议改用 Password Provider 管理。类型注册与模块装配在源码层面PostgreSQLMetadataStorageModule 以postgresql为类型名通过 Guice 的PolyBind将MetadataStorageConnector、SQLMetadataConnector、MetadataStorageActionHandlerFactory等接口绑定到PostgreSQLConnector与PostgreSQLMetadataStorageActionHandlerFactory。因此配置中druid.metadata.storage.typepostgresql之后Druid 各服务即可按需注入对应的 PostgreSQL 连接器。配置项详解SSL 与表 Schema在大多数情况下postgresql-metadata-storage的配置项直接映射到 PostgreSQL JDBC 连接属性。官方文档给出了如下配置表属性描述默认值是否必填druid.metadata.postgres.ssl.useSSL是否启用 SSLfalse否druid.metadata.postgres.ssl.sslPassword客户端 key 的 Password Provider 或字符串密码无否druid.metadata.postgres.ssl.sslFactory作为SSLSocketFactory使用的类名无否druid.metadata.postgres.ssl.sslFactoryArg传给 sslFactory 构造函数的可选参数无否druid.metadata.postgres.ssl.sslModesslMode可选值disable、require、verify-ca、verify-full、allow、prefer无否druid.metadata.postgres.ssl.sslCert证书文件的完整路径无否druid.metadata.postgres.ssl.sslKeykey 文件的完整路径无否druid.metadata.postgres.ssl.sslRootCert根证书的完整路径无否druid.metadata.postgres.ssl.sslHostNameVerifier主机名校验器hostname verifier的类名无否druid.metadata.postgres.ssl.sslPasswordCallbackSSL 密码提供器password provider的类名无否druid.metadata.postgres.dbTableSchemaDruid 元数据表所在的 PostgreSQL schemapublic否SSL 参数的源码级映射PostgreSQLConnectorConfig 通过 JacksonJsonProperty解析上述全部 SSL 配置其中sslPassword使用PasswordProvider类型支持密钥托管。当useSSLtrue时PostgreSQLConnector 会把这些配置逐一写入连接池BasicDataSource的PGProperty连接属性例如ssl、sslmode、sslcert、sslkey、sslrootcert等最终透传给 PostgreSQL JDBC 驱动完成 TLS 握手。这意味着你既可以在connectURI里带?ssltruesslmodeverify-full之类的参数也可以统一走上述druid.metadata.postgres.ssl.*配置二者最终作用于同一套驱动属性。dbTableSchema 的作用PostgreSQLTablesConfig 提供了druid.metadata.postgres.dbTableSchema配置默认public。它被 PostgreSQLConnector 用于tableExists检查——通过查询pg_catalog.pg_tables并匹配schemaname dbTableSchema来判定元数据表是否已存在。因此若你希望把 Druid 的元数据表放到非默认 schema 中只需设置该项并确保对应 schema 已创建、连接用户具备相应权限。连接器行为特性从 PostgreSQLConnector 的实现可以观察到该扩展针对 PostgreSQL 的几项专门适配数据类型payload 列使用BYTEA自增主键使用BIGSERIALgetPayloadType()与getSerialType()见 源码 L49-L50。分页语法limitClause生成LIMIT n源码 L150-L154测试类 PostgreSQLConnectorTest 的testLimitClause对此做了校验。Upsert 策略insertOrUpdate在 PostgreSQL 9.5或大版本号大于 9时使用INSERT ... ON CONFLICT ... DO UPDATE对更老的版本则退化为LOCK TABLE ... SHARE ROW EXCLUSIVE MODE配合 CTE upsert源码 L156-L231。并发与重试compareAndSwap捕获 REPEATABLE_READ 隔离级别下的串行化失败SQLSTATE40001并返回false交由上层重试connectorIsTransientException对 SQLSTATE 以08连接类和53资源不足类开头的错误判为瞬时异常源码 L259-L289测试类中的testIsTransientException覆盖了该逻辑。用 PostgreSQL InputSource 批量摄入数据除元数据存储外该扩展还实现了 SQL InputSource 的一个 PostgreSQL 变体支持把 PostgreSQL 中的表直接作为 Druid 批量摄入的数据源。官方文档给出的原生批量任务index_parallel示例完整如下{ type: index_parallel, spec: { dataSchema: { dataSource: some_datasource, dimensionsSpec: { dimensionExclusions: [], dimensions: [ dim1, dim2, dim3 ] }, timestampSpec: { format: auto, column: ts }, metricsSpec: [], granularitySpec: { type: uniform, segmentGranularity: DAY, queryGranularity: { type: none }, rollup: false, intervals: null }, transformSpec: { filter: null, transforms: [] } }, ioConfig: { type: index_parallel, inputSource: { type: sql, database: { type: postgresql, connectorConfig: { connectURI: jdbc:postgresql://some-rds-host.us-west-1.rds.amazonaws.com:5432/druid, user: admin, password: secret } }, sqls: [ SELECT * FROM some_table ] }, inputFormat: { type: json } }, tuningConfig: { type: index_parallel } } }要点说明inputSource.type固定为sqldatabase.type固定为postgresqlconnectorConfig提供 JDBC 连接信息connectURI、user、password。sqls是一个数组可包含多条查询每条查询的结果将被当作一批输入数据。inputFormat使用json即查询结果按 JSON 行解析timestampSpec中时间列示例为ts格式auto表示自动探测。dataSource指定摄入后 Druid 中的数据源名segmentGranularity: DAY表示按天分段rollup: false表示不进行预聚合保留原始明细。底层实现Jackson 模块注册 将PostgresqlInputSourceDatabaseConnector注册为postgresql子类型因此摄入任务中的type: postgresql才能被正确反序列化。该类继承自SQLInputSourceDatabaseConnector复用druid-server中的 SQL 摄入基础能力并同样为驱动设置类加载器PostgresqlInputSourceDatabaseConnector。此外PostgresqlInputSourceDatabaseConnectorTest 对该连接器的序列化与连接配置解析提供了测试覆盖。需要说明的是SQL InputSource 属于摄入侧能力即使 Druid 元数据存储本身选用 Derby/MySQL只要加载了本扩展同样可以使用 PostgreSQL 作为摄入数据源。验证与排错建议检查扩展是否加载启动任一 Druid 服务时观察日志出现Configured PostgreSQL as metadata storage见 PostgreSQLConnector 构造日志即表示连接器装配成功。确认驱动可达若报No suitable driver类错误优先确认druid.extensions.loadList已包含postgresql-metadata-storage且 Druid 已通过bin/start-druid或发行版的 extension 目录实际加载该扩展。验证连接串先用psql或任意 JDBC 客户端以相同connectURI、用户名与密码手工连通数据库排除网络、认证层面的问题。启用 SSL 时按需组合useSSL与sslMode如verify-full时需同时配置sslRootCert确认客户端证书与根证书路径可读。表 schema 异常若tableExists一直判定表不存在或建表失败检查druid.metadata.postgres.dbTableSchema指向的 schema 是否已存在以及连接用户是否具备该 schema 下的建表权限。总结postgresql-metadata-storage扩展同时承担两类职责一是作为 Druid 的元数据存储后端druid.metadata.storage.typepostgresql二是作为 SQL InputSource 的 PostgreSQL 数据库连接器type: postgresql。配置上基础连接参数复用druid.metadata.storage.connector.*SSL 与 schema 则由druid.metadata.postgres.*控制实现上扩展针对 PostgreSQL 的数据类型、UPSERT、事务串行化失败重试与分页语法均做了专门适配测试用例也覆盖了limitClause与瞬时异常判定等关键路径。参照本文的安装、配置与摄入示例即可在生产或开发环境完成 PostgreSQL 元数据存储的落地并顺带获得一条从 PostgreSQL 直通 Druid 的批量数据管道。赞分享数据库OLAP大数据后端【免费下载链接】druidApache Druid: a high performance real-time analytics database.项目地址https://gitcode.com/gh_mirrors/druid6/druid点击查看免费下载相关推荐终极B站会员购抢票神器新手也能轻松掌握的自动化购票完整指南终极B站会员购抢票神器新手也能轻松掌握的自动化购票完整指南 还在为抢不到B站会员购的热门漫展门票而烦恼吗biliTickerBuy是一款开源免费的B站会员购电商RPACANNBot TileLang代码骨架代码骨架模板 生成 example_{op}.py 时的文件结构 python import tilelang from tilelang import DaAI 技能人工智能AI 评测CANNAscend5分钟快速上手全网资源下载神器res-downloader使用全攻略5分钟快速上手全网资源下载神器res downloader使用全攻略 你是否经常遇到这样的情况在微信视频号看到精彩的短视频却无法保存在抖音发现有趣的视频想数据库OLAP大数据后端上一篇Vue Chartkick常见问题解答从安装错误到图表不显示的解决方案合集下一篇FreeMoCap 报错怎么办10分钟速查修复 6 类常见动作捕捉故障创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考