ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Databend Common:分布式数据库公共基础设施模块全景解析

Databend Common:分布式数据库公共基础设施模块全景解析 Databend Common分布式数据库公共基础设施模块全景解析【免费下载链接】databendData Agent Ready Warehouse : One for Analytics, Search, AI, Python Sandbox. — rebuilt from scratch. Unified architecture on your S3.项目地址: https://gitcode.com/GitHub_Trending/da/databend导读Databend 是一个基于 Rust 构建的 Data Agent Ready Warehouse统一架构于自有 S3 之上其代码库采用大规模 workspace 组织方式而src/common正是承载全部共享基础设施的公共层。本文以仓库中的 src/common/README.md 为核心骨架逐模块拆解 Databend Common 的职责边界、核心 API 与实现原理并结合源码给出可直接查阅的模块路径与关键类型。读完本文你将掌握 Databend 公共层每个模块解决什么问题、在哪里实现、被哪些上层组件依赖的完整地图也能以此为线索深入任意子 crate 的源码细节。Databend Common 在整体架构中的定位Databend 的 Rust workspace 被划分为若干顶层目录src/common公共基础设施、src/meta元数据服务、src/query查询引擎、src/binaries可执行程序等。其中src/common承担了地基角色——它不是单一 crate而是一组彼此独立、按职责划分的子 crate每个子目录都包含自己的Cargo.toml与src/源码。以 src/common/base/Cargo.toml 为例可以看到 workspace 化的组织方式crate 名为databend-common-base版本、作者、许可证均继承自 workspace并通过features提供可裁剪能力如jemalloc、memory-profiling、tracing开关。这种一模块一 crate的划分保证了上层查询引擎、元数据服务只需按需依赖编译粒度更细模块边界也更清晰。原文档将公共层划分为 12 个核心模块本文将逐一展开模块一句话职责对应仓库路径base运行时、线程池、内存分配器、区间映射src/common/basebuilding构建与内部环境准备src/common/buildingcache内存/磁盘缓存 trait 与基础 LRU 实现src/common/cacheexception错误处理与回溯src/common/exceptiongrpcgRPC 客户端工具封装src/common/grpchashtable线性探测哈希表group by / joinsrc/common/hashtablehttp通用 HTTP 处理器健康检查、Profile、优雅停机src/common/httpio二进制序列化与反序列化src/common/iometricsPrometheus 指标采集初始化src/common/metricsstorage存储相关类型与函数src/common/storagetracing日志与追踪src/common/tracing说明目录中还存在cloud_control、column、compress、frozen_api、license、statistics、telemetry、timezone、vector、version等未在 README 中展开列出的子目录它们是公共层的延伸组成本文不作展开可在仓库中按需查阅。base运行时、线程池、分配器与 rangemapbase是 Databend Common 中最核心、最庞大的模块原文档将其职责概括为 runtime, pool, allocator and rangemap。从 src/common/base/src/lib.rs 的模块声明可以看到它的完整构成runtime异步运行时封装containersfixed_heap与ttlhmapTTL 哈希表mem_allocator内存分配器jemalloc / std / tracker / global / profilingbase基础工具barrier、semaphore、shutdown_signal、singleton_instance、progress、select、watch_notify、net、profiling 等rangemap区间映射以及headers、hints、http_client、obfuscator、vec_ext等运行时封装runtimeruntime模块通过 src/common/base/src/runtime/mod.rs 导出大量基础能力这是理解 Databend 并发模型的关键入口全局运行时GlobalControlRuntime、GlobalIORuntime、GlobalQueryRuntime分别管理控制面、IO 与查询三类异步运行时任务派生spawn、spawn_named、spawn_local、spawn_blocking、try_block_on、block_on等覆盖同步/异步、本地/阻塞场景线程模型Thread与ThreadJoinHandle以及线程级追踪器ThreadTracker、TrackingGuard内存统计GLOBAL_MEM_STAT、MemStat、MemStatBuffer、ParentMemStat配合set_alloc_error_hook实现分配失败时的钩子处理执行统计与性能ExecutorStats、PerfCounters、QueryPerf、ProfilePoints、QueryTimeSeriesProfile等为查询性能观测提供支撑崩溃与异常辅助CatchUnwindFuture、catch_unwind、defer、dump_backtrace、get_all_tasks。其中defer提供类似 Godefer的延迟执行能力dump_backtrace/get_all_tasks则服务于任务回溯与排障。内存分配器mem_allocatormem_allocator目录src/common/base/src/mem_allocator包含jemalloc.rs、std_.rs、global.rs、tracker.rs、default.rs、profiling.rs配合 src/common/base/Cargo.toml 中的jemalloc与memory-profilingfeature可以看到 Databend 对内存分配采取的策略默认走 jemalloc并可通过 feature 开启其统计与 profiling 能力依赖tikv-jemalloc-sys/stats、profiling、unprefixed_malloc_on_supported_platforms。同步原语与区间映射base子目录src/common/base/src/base提供了barrier同步屏障、semaphore信号量、shutdown_signal停机信号、singleton_instance单例、watch_notifywatch 通知、progress进度跟踪等并发与生命周期原语containers中的fixed_heap与ttlhmap则分别对应固定容量堆与带 TTL 的哈希表。rangemap提供区间映射结构是文档明确点名的能力之一通常用于区间的查询、合并与覆盖判断。building构建环境准备building模块src/common/building原文档定位为 sets up the environment for building components and internal use即为 Databend 各组件的构建与内部使用准备环境。它的源码规模很小3 个.rs文件属于构建期辅助基础设施仓库根目录还有配套的构建脚本目录 scripts/setup如dev_setup.sh、run_build_tool.sh、rust-toolchain.toml与之呼应共同保证在标准 Linux 开发环境下能够一键就绪并编译整个 workspace。cache内存/磁盘缓存 trait 与 LRU 实现cache模块src/common/cache提供了统一的缓存抽象。从 src/common/cache/src/lib.rs 可以看到它导出了三个核心概念pub use cache::Cache; pub use cache::lru::LruCache; pub use hashbrown::DefaultHashBuilder; pub use mem_sized::MemSized;Cachetrait定义了内存缓存与磁盘缓存的统一接口上层如查询引擎的物化视图缓存、存储层缓存只需面向 trait 编程便可自由切换缓存实现LruCache基于 LRU最近最少使用淘汰策略的基础实现是最常用的默认缓存MemSized用于度量缓存条目占用内存大小的 trait是缓存容量控制与淘汰决策的基础DefaultHashBuilder复用hashbrown的哈希构造器保证缓存键散列的性能与稳定性。这一设计的价值在于Databend 的缓存场景横跨内存与磁盘通过统一的Cachetrait 抽象调用方无需关心底层是纯内存 LRU 还是磁盘缓存。exception错误处理与回溯exception模块src/common/exception是 Databend 错误体系的发源地其入口 src/common/exception/src/lib.rs 导出ErrorCodeDatabend 的核心错误码类型所有内部错误都归一化为带错误码的错误对象ResultT与ErrorCodeResultExt统一的结果别名与错误码转换扩展支持把各类底层错误映射到 Databend 错误码体系StackTrace/set_backtrace/USER_SET_ENABLE_BACKTRACE错误回溯的采集与控制用于诊断错误发生的调用链ErrorFrame/display_error_stack错误帧与堆栈展示服务于错误信息的格式化输出SerializedError错误的序列化形态保证错误可跨进程如查询节点与元数据服务之间传递。该模块还包含error_code_groups错误码分组、context.rs上下文增强等实现文件src/common/exception/src整体构成了错误码 上下文 回溯的立体错误处理体系。grpcgRPC 客户端工具封装grpc模块src/common/grpcwraps some of the utility code snippets for grpc即封装 gRPC 场景下的通用工具代码入口 src/common/grpc/src/lib.rs 导出RpcClientConf与RpcClientTlsConfiggRPC 客户端配置与 TLS 配置Databend 各组件间的内部 RPC 连接统一通过它构造DNSResolver/DNSService/ConnectionFactoryDNS 解析服务与连接工厂负责对远端地址做解析并建立连接TcpKeepAliveConfigTCP 保活配置保证长连接在弱网环境下的稳定性IN_PROCESS_GRPC_SCHEME/is_in_process_grpc_address进程内 gRPC 寻址支持——Databend 支持以特殊 scheme 直接走进程内通道避免本机组件间通信的额外序列化开销。这一封装让查询节点与元数据节点、集群节点之间的 RPC 行为DNS、TLS、保活、进程内直连保持统一与可配置。hashtable为 group by 与 join 而生的线性探测哈希表hashtable模块src/common/hashtable是 Databend 查询引擎性能的关键依赖之一。原文档明确指出它是线性探测linear probe哈希表主要服务于group by聚合与join场景。根据仓库内 src/common/hashtable/src/README.md 的说明该实现是从 ClickHouse 的 C 实现移植而来——项目组在比较多种哈希表实现后认为 ClickHouse 的实现最适合 OLAP 场景高吞吐、低延迟、内存友好因此在 Rust 中重写为独立库。其源码构成src/common/hashtable/src包括hashtable.rs/table0.rs/table1.rs核心哈希表与多级表结构lookup_hashtable.rs面向查找优化的变体partitioned_hashtable.rs分区哈希表服务于并行聚合string_hashtable.rs/short_string_hashtable.rs/stack_hashtable.rs针对字符串键与栈上小表的专用实现keys_ref.rs/row_ptr.rs键引用与行指针抽象container.rs/traits.rs/utils.rs容器、trait 与工具函数。这些变体共同支撑聚合与 join 在不同数据形态整型键、字符串键、分区并行下的高性能查找。http健康检查、CPU/内存 Profile 与优雅停机http模块src/common/http是一个通用 HTTP 处理器入口 src/common/http/src/lib.rs 导出HttpShutdownHandlerHTTP 服务的启动与优雅停机处理器保证进程退出时 HTTP 请求能被平滑收尾healthhealth::*健康检查端点供探活与负载均衡使用debugdebug::*CPU / 内存 profile 相关端点用于线上诊断时抓取运行时性能画像HttpError与errorsHTTP 层的错误类型。原文档点名的三项核心能力——health check、cpu/memory profile、graceful shutdown——都可以在 src/common/http/src 目录下找到对应实现文件。该模块是所有对外暴露 HTTP 接口的组件如 query 服务的 management 接口的公共底座仓库中 src/query/service 与 scripts/ci/deploy 下的部署脚本也围绕其端点组织健康检查。io二进制序列化与反序列化io模块src/common/iofocus on binary serialisation and deserialisation是 Databend 数据读写的基础设施。从 src/common/io/src/lib.rs 可以看到其覆盖面远超序列化本身基础读写binary_read/binary_write、cursor_ext、number、position、stat_buffer序列化框架bincode_serialization与borsh_serializationborsh是一种紧凑的二进制序列化格式bytes依赖也在 src/common/base/Cargo.toml 中作为基础类型出现位图bitmap.rs提供HybridBitmap含HYBRID_MAGIC、HYBRID_VERSION、HYBRID_HEADER_LEN、HYBRID_KIND_SMALL/LARGE、LARGE_THRESHOLD等常量与bitmap_contains、bitmap_has_any、bitmap_max/min等函数用于紧凑地表达列级过滤信息数值与字符串格式化decimalDecimal128/256 的显示、escape字符串转义、format_diagnostic、format_settings时间与地理datetime、interval以及geography/geometry含 WKB/EWKB 解析与GEOGRAPHY_SRID、UNKNOWN_SRID、ewkb_to_geo、ewkb_to_bbox等支撑地理数据类型常量与预导入constants与prelude。对于列式存储引擎而言这套二进制读写 位图 紧凑格式的能力正是 Parquet 落盘、列裁剪、表达式过滤等环节的公共依赖。metricsPrometheus 指标体系metrics模块src/common/metricstakes over the initialization of thePrometheusRecorderand owns thePrometheusHandle即统一负责 Prometheus 指标采集器的初始化并持有全局的PrometheusHandle。其入口 src/common/metrics/src/lib.rs 与metrics/子目录实现了指标注册、采样与句柄管理。这与base中prometheus-client、prometheus-parse依赖见 src/common/base/Cargo.toml相衔接——整个 databend 的监控指标都经由 Common 的 metrics 层统一暴露给 Prometheus 抓取仓库中 src/query/service 的各类 metrics 埋点均以此为依赖。storage存储相关类型与函数storage模块src/common/storageprovides storage related types and functions是存储侧的公共类型与函数集合如存储路径、对象键的拼接解析等。它是 src/query/storagesfuse、parquet、iceberg、paimon、stage、system 等各类存储实现与 src/common/io 之间的桥梁层。从源码结构看可以将它理解为存储无关的通用工具 被各存储引擎共享的类型定义具体能力可查阅 src/common/storage/src 目录。tracing日志与追踪tracing模块src/common/tracinghandles logging and tracing是 Databend 日志体系的公共层。从 src/common/tracing/src 目录可以看到其构成config.rs日志配置级别、输出等init.rs/loggers.rs日志系统初始化与多路 logger文件、控制台、远端filter.rs/module_tag.rs日志过滤与模块标签panic_hook.rs/crash_hook.rspanic 与崩溃时的日志钩子保证异常事件被完整记录structlog.rs结构化日志输出 JSON 等结构化格式便于采集分析remote_log.rs远端日志上报query_log_collector.rs/predefined_tables查询日志收集与预定义日志表服务于system.query_log这类可查询的系统表。配合base中的log、tracing相关依赖src/common/base/Cargo.tomlDatabend 将应用日志 结构化日志 查询日志表 崩溃兜底统一收敛在 Common 层上层组件只需初始化一次即可获得完整可观测性。结语一张可随时查阅的公共层地图Databend Common 的设计哲学可以概括为关注点严格分离异步运行时与内存由base统一治理错误形态由exception归一缓存由cache抽象聚合/join 的底层数据结构由hashtable提供网络、监控、日志、序列化分别由grpc、http、metrics、tracing、io各司其职。对开发者而言本文给出的模块清单 关键导出类型 仓库路径组合起来就是一张导航地图遇到并发问题时查 src/common/base/src/runtime遇到错误传播问题查 src/common/exception/src/lib.rs遇到缓存选型问题查 src/common/cache/src/lib.rs遇到数据落盘格式问题查 src/common/io/src/lib.rs。循着这条主线即可逐层深入 Databend 的每一处基础设施实现。【免费下载链接】databendData Agent Ready Warehouse : One for Analytics, Search, AI, Python Sandbox. — rebuilt from scratch. Unified architecture on your S3.项目地址: https://gitcode.com/GitHub_Trending/da/databend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表