ClickHouse v23.12.5.81-stable 版本发布解析:S3/GCP 容错回退、tzdata 更新与一组关键稳定性修复

ClickHouse v23.12.5.81-stable 版本发布解析:S3/GCP 容错回退、tzdata 更新与一组关键稳定性修复 ClickHouse v23.12.5.81-stable 版本发布解析S3/GCP 容错回退、tzdata 更新与一组关键稳定性修复【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本文基于 ClickHouse 仓库中归档的 v23.12.5.81-stable 版本发布日志changelog完整梳理该版本相对 v23.12.4.15-stable 的全部变更并结合同仓库中的 Docker 入口脚本、压缩编解码与数组函数等源码文件对其中若干关键修复做实现层面的佐证帮助运维与开发者理解 23.12 这条 LTS 分支在这一版中的具体收益。1. 版本概览根据 v23.12.5.81-stable 发布日志当前版本v23.12.5.81-stable构建提交a0fbe3ae813对比基线v23.12.4.15-stable构建提交4233d111d20变更类别Improvement2 项、Build/Testing/Packaging Improvement1 项、Bug Fix19 项、CI Fix or Improvement6 项以及若干不进入用户 changelog 的内部提交。这是一个典型的 23.12 分支补丁版本没有新功能New feature与破坏性变更Breaking Change全部变更围绕“把已知问题修干净”展开重点覆盖 S3/云对象存储读取、查询执行器崩溃、压缩编解码缓冲区安全与 Keeper 运维四类场景。2. ImprovementS3 读取的 GCP 回退与 tzdata 时区数据更新2.1 S3 文件拷贝的 GCP 容错回退本版本 backport 了改进项Copy S3 file GCP fallback to buffer copy in case GCP returnedInternal ErrorwithGATEWAY_TIMEOUTHTTP error code上游 PR #60164对应问题 #60290作者 Maksim Kita。其背景是ClickHouse 在访问 S3 兼容存储此处特指 GCP时优先走高性能的 GCPcopyObject类直拷路径但当 GCP 端返回 HTTPGATEWAY_TIMEOUT且错误信息为Internal Error时直拷会失败。该修复的行为是检测到这类特定错误后自动降级fallback为“先下载到本地 buffer、再上传”的 buffer copy 路径避免整次拷贝失败。对使用该能力的场景S3Queue、url/s3表引擎文件操作、跨 bucket 移动数据等而言这是一个纯收益的可用性增强在 GCP 偶发网关超时时原本直接报错的拷贝现在可以自行完成。2.2 更新 tzdata 到 2024a本版本 backport 了Update tzdata to 2024a上游 PR #60768问题 #60830作者 Raúl Marín。tzdata 是 IANA 时区数据库ClickHouse 将其中 2024a 修订版的数据打入发行版。该修订主要包含对历史时区偏移与 DST夏令时规则的回溯更正。对使用DateTime、Timestamp及 IANA 时区名如ZoneInfo做跨时区换算的查询升级到该版本可保证时区转换与 2024a 数据库保持一致避免因时区数据陈旧产生偏移差异。3. Build/Testing/PackagingDocker 容器 initdb 脚本强制重跑开关本版本 backport 了打包改进项上游 PR #59808问题 #59883作者 Alexander Nikolaev如果你希望每次ClickHouse 容器启动时都重新执行 initdb 初始化脚本需要设置环境变量CLICKHOUSE_ALWAYS_RUN_INITDB_SCRIPTS。该行为在仓库的官方 Docker 入口脚本中可以直接验证。docker/server/entrypoint.sh 中的逻辑为CLICKHOUSE_ALWAYS_RUN_INITDB_SCRIPTS${CLICKHOUSE_ALWAYS_RUN_INITDB_SCRIPTS:-} function init_clickhouse_db() { # checking $DATA_DIR for initialization if [ -d ${DATA_DIR%/}/data ]; then DATABASE_ALREADY_EXISTStrue fi # run initialization if flag CLICKHOUSE_ALWAYS_RUN_INITDB_SCRIPTS is not empty or data directory is empty if [[ -n ${CLICKHOUSE_ALWAYS_RUN_INITDB_SCRIPTS} || -z ${DATABASE_ALREADY_EXISTS} ]]; then RUN_INITDB_SCRIPTStrue fi ... }从脚本结构看初始化脚本/docker-entrypoint-initdb.d/目录默认只在数据目录为空首次初始化时执行一旦数据目录data存在即判定DATABASE_ALREADY_EXISTStrue此后重启不再执行。设置CLICKHOUSE_ALWAYS_RUN_INITDB_SCRIPTS为非空值后判断条件中的第一项恒为真从而强制每次启动都走初始化流程。需要注意的前提与限制这是官方 Docker 镜像入口脚本的行为与自编译部署无关强制重跑 initdb 脚本意味着重复执行其中的建库/建表/导入语句脚本本身需要保证幂等例如使用CREATE TABLE IF NOT EXISTS否则可能因对象已存在而报错初始化阶段入口脚本会先以--listen_host127.0.0.1只监听本机启动 server并通过http_port的/ping端点探测就绪默认最多重试 1000 次、单次 1 秒超时可用CLICKHOUSE_INIT_TIMEOUT调整就绪后才对外提供端口。典型用法示例仅说明容器启动方式不修改仓库docker run -d \ --name clickhouse \ -e CLICKHOUSE_ALWAYS_RUN_INITDB_SCRIPTS1 \ -v ./initdb:/docker-entrypoint-initdb.d \ clickhouse/clickhouse-server4. Bug Fix 逐项解析本版本共收录 19 项用户可见的 Bug Fix。按影响域分组解读如下。4.1 S3 / 云对象存储相关Fix_max_query_size_for_kql_compound_operatorPR #60534Yong Wang修正 KQL 复合运算符如| extends管道组合场景下max_query_size设置不生效的问题超长 KQL 查询现在会正确受该限制约束。Hide sensitive info for s3queuePR #60233Kseniia Sumarokovasystem.s3queue相关输出不再泄露敏感信息如访问凭据片段属于安全加固类修复。Prevent setting custom metadata headers on unsupported multipart upload operationsPR #60748Francisco J. Jurado Moreno禁止在部分不支持自定义元数据头的分片上传multipart upload操作上设置自定义 metadata header避免请求被存储端拒绝。Remove recursion when reading from S3PR #60849Antonio Andelic从源码结构看这是对 S3 读取路径中递归实现的消除降低大文件读取时的调用栈深度与出错面属于稳定性加固。4.2 读取缓冲与并发解析Fix error Read beyond last offset for AsynchronousBoundedReadBufferPR #59630Vitaly Baranov修复异步有界读取缓冲在边界条件下误报 “Read beyond last offset” 的问题。AsynchronousBoundedReadBuffer是 ClickHouse 读取大文件尤其是本地磁盘与对象存储时的异步读缓冲实现该报错在正常读取尾部数据时可能误触发本修复消除了这一误报。Fix deadlock in parallel parsing when lots of rows are skipped due to errorsPR #60516Kruglov Pavel并行解析parallel parsing用于加速 TSV/CSV 等多行格式的读取在大量行因格式错误被跳过时会出现死锁。典型触发场景是导入含脏数据的文件时线程卡死本版本已修复。4.3 查询引擎、解析器与崩溃修复Fix parsing of partition expressions surrounded by parensPR #59901János Benjamin Antal修复分区表达式被括号包裹如PARTITION BY (toYYYYMM(ts))中的嵌套括号写法时解析错误的问题涉及建表语句与分区裁剪相关路径。Fix optimize_uniq_to_count removing the column aliasPR #60026Raúl Marínoptimize_uniq_to_count优化会把uniq(x) AS name改写为count实现但改写后列别名丢失导致结果列名错误。本版本保留别名。Fix query start time on non initial queriesPR #59662Raúl Marín修正非初始查询即管道中非首个处理阶段产生的查询信息的 query start time 记录影响system.query_log等处的时间口径。Fix crash with different allow_experimental_analyzer value in subqueriesPR #60770Dmitry Novik当主查询与子查询的allow_experimental_analyzer设置取值不一致时会导致崩溃本版本修复该组合下的崩溃。Fix crash when using input() in INSERT SELECT JOINPR #60765Kruglov PavelINSERT INTO ... SELECT ... JOIN input()组合会触发崩溃已修复。Reduce the number of read rows fromsystem.numbersPR #60546JackyWoosystem.numbers引擎在部分查询路径下会读取远多于实际需要的行数本修复减少了无效读取降低此类查询的开销。4.4 函数与聚合函数崩溃Fix cosineDistance crash with NullablePR #60150Raúl MaríncosineDistance对Nullable类型列计算时崩溃本版本修复。Fix crash in arrayEnumerateRankedPR #60764Raúl MarínarrayEnumerateRanked在特定输入下崩溃。该函数实现位于 src/Functions/array/arrayEnumerateRanked.cpp可结合该文件查看排序枚举的实现细节。4.5 压缩编解码安全修复Fix buffer overflow in CompressionCodecMultiplePR #60731Alexey Milovidov修复多重压缩编解码器CompressionCodecMultiple即列定义中CODEC(MULTIPLE(...))的编解码器中的缓冲区溢出。该实现对应 src/Compression/CompressionCodecMultiple.h这是本版本中安全级别最高的一项修复——缓冲区溢出通常意味着数据损坏甚至不可预期行为使用MULTIPLE压缩组合如CODEC(ZSTD(1), LZ4)多层嵌套的表在 23.12 分支上应升级到本版本。4.6 消息队列与 Keeperrabbitmq: fix having neither acked nor nacked messagesPR #59775Kseniia SumarokovaRabbitMQ 消费路径中存在部分消息既未被 ack 也未被 nack 的悬挂状态会导致消费停滞或消息重复语义混乱本版本修复。Fix Keeper reconfig for standalone binaryPR #61233Antonio Andelic修复 ClickHouse Keeper独立二进制standalone 模式即不通过 server 进程以keeper模式运行下reconfig重配置操作失效的问题影响 Keeper 集群成员变更场景。Fix_kql_issue_found_by_wingfuzzPR #59626Yong Wang修复由 wingfuzz 模糊测试发现的 KQL 翻译/解析问题。4.7 SQL/JSON 清理Remove nonsense from SQL/JSONPR #60738Alexey Milovidov清理SQL/JSON输入格式中的异常/无效处理逻辑减少该格式在畸形输入下的歧义行为。5. CI 与内部变更摘要以下变更不直接影响用户使用但体现该版本在构建与测试基础设施上的动作CI Fix or Improvement 类均为 backport将 PR #60408 的改动解耦拆分#60553Mikhail f. Shiryaevarm64 与 amd64 的 Docker 构建任务因任务名相同互相覆盖报告增加aarch64/amd64后缀区分#60554Max K.调试并修复markreleaseReady发布标记流程#60611Mikhail f. Shiryaev其余三条为内部工具链修复#61022、#61183、#61185。NO CL ENTRY不进入用户 changelog回退了 “CI: do not reuse builds on release branches”#59979Max K.即恢复了发布分支上的构建复用行为。NOT FOR CHANGELOG / INSIGNIFICANT内部提交CI 脚本重构把 ci 专用逻辑从 job 脚本迁入 ci.py#58516Make ZooKeeper actually sequentially consistent#59735Alexander Tokmakov从提交标题看这是对 Keeper/ZooKeeper 协议层顺序一致性行为的内部修正发布分支构建报告修复#59797、mark release ready修复#59994Ability to detect undead ZooKeeper sessions#60044Alexander Tokmakov新增对“僵尸” ZooKeeper 会话的检测能力测试中检测 io_uring 支持#60373Azat KhuzhinCancel PipelineExecutor properly in case of exception in spawnThreads#60499Kruglov PavelspawnThreads抛异常时正确取消PipelineExecutor避免执行器资源泄漏移除一个待修复的坏测试#60547加速 cctools 构建#61011。6. 升级建议与适用前提结合上述变更可以给出如下务实结论强烈建议升级的对象使用CODEC(MULTIPLE(...))多重压缩的部署缓冲区溢出修复通过 GCP 作为 S3 后端做文件拷贝/迁移的部署GATEWAY_TIMEOUT 回退依赖 2024a 时区规则的时区敏感业务tzdata 更新;使用system.numbers、KQLKusto 查询语言语法、S3Queue、RabbitMQ 消费、standalone Keeper 的部署。适用前提本版本属于 23.12 LTS 分支的稳定补丁版本变更全部为修复与改进无新功能与破坏性变更若你正运行 v23.12.4.x 系列直接滚动升级到 v23.12.5.81-stable 即可获得全部上述修复。验证入口升级后可用SELECT version()确认版本号对 4.1 节中的崩溃类修复如cosineDistanceNullable、arrayEnumerateRanked、括号分区表达式建议用升级前的复现查询回归验证一次。本文所有事实性陈述均可在仓库内对应文件交叉核对发布日志本体见 docs/changelogs/archive/v23.12.5.81-stable.mdDocker 初始化逻辑见 docker/server/entrypoint.sh压缩编解码与数组函数实现分别见 src/Compression/CompressionCodecMultiple.h 与 src/Functions/array/arrayEnumerateRanked.cpp。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考