尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ClickHouse v21.2.9.41-stable 版本解析:DNS 兼容、PODArray 内存安全与 6 项关键 Bug 修复

ClickHouse v21.2.9.41-stable 版本解析:DNS 兼容、PODArray 内存安全与 6 项关键 Bug 修复 ClickHouse v21.2.9.41-stable 版本解析DNS 兼容、PODArray 内存安全与 6 项关键 Bug 修复【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse导读本文基于 docs/changelogs/archive/v21.2.9.41-stable.md 展开系统解读 ClickHouse 21.2 分支的维护版本v21.2.9.41-stable对比基线 v21.2.8.31-stable的改进、Bug 修复与构建/测试相关变更。该版本聚焦三类实际问题Alpine 镜像中 DNS 类函数的可用性、PODArray这一核心容器的内存安全加固、以及分布式查询、quorum 写入、LIVE VIEW 与统计函数在窗口函数场景下的稳定性。阅读本文后你将掌握该版本每个变更的触发场景、修复原理并能结合仓库源码理解 ClickHouse 底层容器设计与统计函数实现。说明该 changelog 文档头部保留了FIXME标记属于上游归档版本变更日志的原始格式遗留正文所有条目均以对比 v21.2.8.31-stable 的形式列出并给出了对应的上游 PR 编号。一、版本概览与变更总览v21.2.9.41-stable 是 ClickHouse 21.2 系列的一个稳定维护版本变更按类别划分如下类别条目数核心主题Improvement改进2Alpine 下 DNS 函数兼容PODArray 缓冲区溢出隐患修复Bug FixBug 修复6quorum 写入、表函数作为列、分布式 map 函数、MergeTree 反向读取行数统计、LIVE VIEW 并发 DROP/CREATE、窗口函数中的统计函数崩溃Build/Testing/Packaging构建/测试/打包1允许在 gdb 断点下启动被修改的二进制NOT FOR CHANGELOG / INSIGNIFICANT2epoll_wait 的 EINTR 处理FileDictionarySource 绝对路径修复其中 Bug Fix 共 6 项是本次发布的主体每项修复均以 Backported in ...向后移植的形式标注了所属的跟踪 issue 与原 PR便于追溯修复链路。二、Improvement环境适配与容器内存安全2.1 FQDN 与 DNS 相关函数在 Alpine 镜像中正常工作变更内容getFQDN等 DNS 相关函数在 Alpine 镜像中可正确工作上游 PR #20336。背景与原理Alpine 基于 musl libc其主机名/FQDN 解析行为与 glibc 存在差异容易导致getFQDNOrHostName等函数在容器内返回异常结果。从仓库源码看FQDN 解析逻辑集中在 src/Common/getFQDNOrHostName.cpp 与 src/Common/getFQDNOrHostName.h该模块在 ClickHouse 中被广泛使用——例如 ZooKeeper 会话参数解析src/Common/ZooKeeper/ZooKeeperArgs.cpp依赖主机名构建连接标识。本次修复正是为了让这类依赖主机名解析的组件ZooKeeper、Keeper 通信、系统表展示等在 Alpine 基础镜像下也能获得正确结果。实战提示若你的 ClickHouse 运行在 Alpine/Distroless 等基于 musl 的容器中并发现系统表中主机名字段异常或 ZooKeeper 连接标识异常建议升级到包含本修复的版本。2.2 PODArray 元素大小与 16 字节对齐不匹配时的缓冲区溢出隐患变更内容当PODArray以既不是 16 的约数也不是 16 的倍数的元素大小实例化时理论上可能发生缓冲区溢出当前发布版本中不存在实际触发的 Bug上游 PR #21533。源码级解读PODArray是 ClickHouse 的核心动态数组容器定义于 src/Common/PODArray.h。与std::vector不同它不对元素做零初始化并通过模板参数pad_right/pad_left在数组尾部/头部预留额外字节以支持非对齐 SIMD 的乐观读写pad_right在数组末尾多分配若干未使用字节用于 SIMD 指令的越界安全读写pad_left在第 0 个元素之前分配内存向上取整到整数个元素并零初始化第 -1 个元素便于将偏移数组高效转换为长度数组。从源码可以看到对齐策略/// Round padding up to an whole number of elements to simplify arithmetic. static constexpr size_t pad_right integerRoundUp(pad_right_, ELEMENT_SIZE); /// pad_left is also rounded up to 16 bytes to maintain alignment of allocated memory. static constexpr size_t pad_left integerRoundUp(pad_left_, std::lcm(ELEMENT_SIZE, 16));即pad_left会向上取整到ELEMENT_SIZE与 16 的最小公倍数以保证 16 字节对齐同时伴随static_assert约束pad_left不得超过内置空数组大小、且必须是元素大小的整数倍。当ELEMENT_SIZE与 16 既不整除也不被整除时padding 计算与 SIMD 访问边界可能产生不一致从而在极端情况下导致越界。本次修复即是对这一理论隐患的防御性修正。由于PODArray被 ClickHouse 几乎所有执行路径列存储、聚合状态、排序缓冲等依赖这类容器级修复对整体内存安全具有重要意义。三、Bug Fix6 项稳定性修复逐一拆解3.1 quorum 写入在quorum_parallel1下的去重干扰修复内容修复了quorum_parallel1时由于数据去重deduplication机制干扰导致 quorum 插入不再是真正 quorum 的罕见 Bug上游 PR #18215。原理分析quorum 写入依赖 ZooKeeper 记录插入批次写入方需等待多数副本确认后才返回成功。当quorum_parallel1时并行度被收敛为 1此时若副本侧对重复块做了去重判定认为块已存在而跳过会导致实际写入副本数达不到 quorum 阈值但客户端却可能得到成功响应。该修复保证了即使在并行度受限场景下quorum 语义依然严格成立。对依赖 quorum 写入做强一致同步如跨机房双写后读取校验的业务这是值得关注的一项修复。3.2 表函数 view 被用作列时的合法性检查修复内容新增检查——表函数view是否被当作列使用是对上游 PR #20350 的补充上游 PR #21465。原理分析view表函数在 ClickHouse 中允许对子查询结果做进一步加工。此前检查未覆盖将 view 作为列引用的非法写法可能在语法解析与语义分析阶段产生误导性错误信息甚至异常行为。本次修复在解析/分析层补齐了合法性校验让非法用法得到明确的错误提示。3.3 分布式查询中的map函数修复内容修复函数map在分布式查询中的使用问题上游 PR #22588。原理分析map(key, value, ...)用于构建 Map 类型。在分布式表查询时查询会被下发到各分片执行后再做结果合并map函数在此过程中可能因类型推断或序列化路径不完整而失败或返回错误结果。本修复保证了map在remote、分布式表等场景下的一致行为。涉及Map类型的跨节点聚合查询应关注此修复。3.4 MergeTree 反向读取时的近似总行数统计修复内容修复从 MergeTree 反向读取order by ... desc或逆序遍历时 approx total rows 计数错误的问题上游 PR #22726。原理分析ClickHouse 在执行查询时利用索引与 marks 文件估算总行数用于进度显示与并行任务切分。反向读取时读取方向与 mark 扫描方向相反若进度统计仍按正向累加会导致估算行数与实际扫描行数不一致进而影响LIMIT优化与任务调度。该修复保证了正反向读取的进度统计一致性。3.5 LIVE VIEW 的并发 DROP/CREATE 挂起修复内容修复实验特性 LIVE VIEW 中TemporaryLiveViewCleaner在并发 DROP/CREATE 临时 LIVE VIEW 时可能挂起的问题上游 PR #22858。原理分析LIVE VIEW 用于对表变更做实时推送实验性功能临时 LIVE VIEW 由TemporaryLiveViewCleaner负责清理。当同一名称的临时视图被并发地 DROP 与 CREATE 时清理线程与创建线程可能在共享的注册表/互斥锁上形成竞态导致查询线程永久等待。修复通过调整锁粒度或注册时机消除了挂起可能。使用 LIVE VIEWENABLE_EXPERIMENTAL_LIVE_VIEW的部署建议升级。3.6 窗口函数中的mannWhitneyUTest与rankCorr崩溃修复内容修复mannWhitneyUTest与rankCorr配合窗口函数window functions使用时发生的崩溃上游 PR #22876。源码级解读这两个函数位于统计类聚合函数族src/AggregateFunctions/AggregateFunctionMannWhitney.cpp实现 Mann-Whitney U 检验其状态结构MannWhitneyData继承自StatisticalSample支持 TwoSided/Less/Greater 三种备择假设并实现与 SciPy 行为一致的秩与结tie校正计算src/AggregateFunctions/AggregateFunctionRankCorrelation.cpp实现 Spearman 秩相关系数。两者均在 src/AggregateFunctions/registerAggregateFunctions.cpp 中注册。崩溃根因在于统计函数的状态由变长采样数组构成窗口函数如OVER子句执行时需要对这些状态做复制/移动而此前实现未正确处理窗口框架的局部化状态管理导致越界访问。修复后统计检验可安全用于... OVER (...)窗口计算。正在使用 A/B 检验 窗口聚合组合分析的场景应升级到包含本修复的版本。四、Build/Testing/Packaginggdb 调试与二进制完整性校验的取舍修复内容允许在 gdb 中修改二进制后正常启动。此前版本若在启动前设置 gdb 断点服务器会因完整性校验失败而拒绝启动上游 PR #21258。原理分析ClickHouse 二进制内置了针对自身代码段的自检机制防止被篡改/修补运行而 gdb 设置断点会在代码段写入 int3 指令导致自检发现不一致并拒绝启动。本修复调整了校验时机或豁免策略使调试器场景断点打断不再与完整性自检冲突。注意这仅放宽了被调试器修改的启动限制并未削弱正常运行时的完整性保护。对需要深入调试 ClickHouse 服务端的开发者而言该修复显著改善了 gdb 体验。五、NOT FOR CHANGELOG基础设施级细节修复变更日志末尾的两条不进变更日志/无足轻重条目同样值得关注条目位置/影响说明epoll_wait 中的 EINTR 检查PR #20958事件循环当进程被信号打断时epoll_wait返回EINTR而非继续阻塞。补上检查可避免将信号中断误判为事件循环异常提升长连接与网络层健壮性FileDictionarySource 绝对文件路径修复PR #22822字典加载修复了文件字典file类型 Dictionary在绝对路径下的解析问题保证FILE(path)风格字典配置在各类路径写法下都能正确加载六、升级建议与验证方式综合来看v21.2.9.41-stable 属于低风险维护版本建议以下场景优先升级运行在 Alpine/musl 基础镜像的部署获得 DNS/FQDN 修复依赖 quorum 插入做同步确认的高可用写入链路使用分布式表 Map 类型、或**在窗口函数中做统计检验mannWhitneyUTest/rankCorr**的分析任务使用实验性 LIVE VIEW或需要 gdb 深入调试 server的团队。验证方式升级后可通过SELECT version();确认版本为21.2.9.41并针对上述场景编写回归 SQL如分布式map构造、rankCorr(col1, col2) OVER (...)、Alpine 容器内SELECT getFQDN();进行冒烟测试。涉及 quorum 与 LIVE VIEW 的行为验证可参考 tests/queries 下对应的.sql/.reference测试对运行 stateless 测试框架复现。结语作为 21.2 分支的稳定维护版本v21.2.9.41-stable 聚焦于环境兼容性 容器内存安全 关键路径正确性三大主题。其变更虽然条目不多但每一项都对应着真实的线上故障场景从 Alpine 镜像的 DNS 解析到PODArray这一全库核心容器的对齐隐患再到统计函数在窗口框架下的崩溃。结合 src/Common/PODArray.h 与 src/AggregateFunctions 等源码阅读本文涉及模块可以更深入理解 ClickHouse 在底层数据结构与统计聚合上的工程权衡。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表