ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ClickHouse v23.10.1.1976-stable 版本解析:S3Queue 全面重写、新 SQL 函数与倒排索引优化

ClickHouse v23.10.1.1976-stable 版本解析:S3Queue 全面重写、新 SQL 函数与倒排索引优化 ClickHouse v23.10.1.1976-stable 版本解析S3Queue 全面重写、新 SQL 函数与倒排索引优化【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本文基于 ClickHouse 官方变更日志 docs/changelogs/archive/v23.10.1.1976-stable.md 展开逐条解读 v23.10.1.1976-stable 版本commit13adae0e42f对比基线为 v23.9.1.1854-stablecommit8f9a227de1f的全部变更哪些行为发生了不兼容变化、新增了哪些函数与 SQL 能力、性能优化集中在哪些路径以及升级前必须处理的配置项。读完本文你可以在升级该版本时准确评估风险点并能结合源码路径验证每项功能的实现位置。一、版本定位与变更结构该版本是 2023 年 10 月发布的稳定版变更日志按官方惯例分为六个区块区块含义升级关注度Backward Incompatible Change不兼容变更可能直接改变既有行为高升级前必读New Feature新函数、新语法、新存储能力中按需采用Performance Improvement性能优化中Improvement行为改进与增强中低Build/Testing/Packaging Improvement构建与打包改进低自构建者关注Bug Fix官方 stable 版本可见缺陷修复按问题域关注下面按区块逐条解析并在可溯源处给出当前仓库中的源码位置。二、不兼容变更升级前必须了解的 7 个行为变化2.1 S3Queue 引擎完全重写这是本版本最大的架构级变更。S3Queue 存储引擎被整体重写改变了 ZooKeeper 中的状态保存方式减少 ZooKeeper 请求量并在确定状态不会变化的场景下缓存 ZooKeeper 状态S3 轮询策略调整轮询 S3 的频率降低行为更温和TTL 与最大条数限制的维护方式变化被追踪文件的 TTL / max 限制现在由后台进程维护新增系统表system.s3queue与system.s3queue_log用于观察队列状态。对应 PR 为 #54422解决了 issue #54998。从源码结构看S3Queue 相关实现位于src/Storages目录下的 S3Queue 模块升级后可通过新增的两张系统表验证队列运行状态。2.2 不再自动删除损坏数据分片此前 ClickHouse 存在一个自动移除 broken data parts的选项本版本起该选项被移除PR #55184issue #55174。这意味着损坏分片不再被静默清理需要用户显式处理。与此相关的两个配套变化值得注意内存型数据分片in-memory parts不再能从前写日志WAL中恢复。如果此前配置过 in-memory parts升级前必须先将其移除PR #55186后续补丁#55557保证用户引用已删除的 MergeTree 设置时不会落入UNKNOWN_SETTING错误而是给出友好提示——这是对删除损坏分片相关设置后的兼容性补救。2.3 移除 Meilisearch 集成Meilisearch 集成被移除PR #55189。原因是它仅与旧版 0.18 兼容而 Meilisearch 新版本改变了协议导致无法工作。官方同时表示欢迎社区协助将其修复后重新引入。如果你的应用依赖该集成升级前需要改用其他全文检索方案。2.4 directory monitor 更名为 background INSERT目录监控概念被正式更名为background INSERT所有*directory_monitor*前缀设置全部改名为distributed_background_insert*。官方明确说明向后兼容得到保留旧设置名作为别名仍然有效PR #55978。建议在配置中尽早迁移到新名称。2.5 区分 send_timeout 与 receive_timeout网络超时处理中send_timeout与receive_timeout被明确区分开PR #56035此前两者会被混用。对依赖超时行为调优的部署例如慢查询、大结果集拉取可能观察到超时触发时机的差异。2.6 不同单位的 TimeInterval 比较将抛异常对单位不同的时间区间例如IntervalYear与IntervalDay做比较时本版本起将抛出异常PR #56090issue #55942。此前行为是比较底层的数值而忽略单位——如果你的业务代码恰好依赖了这一旧行为升级后需要显式转换为同一单位再比较。三、新特性函数、语法与存储能力3.1 新增标量函数arrayFold对多个等长数组做归约。函数形式为arrayFold(accum - expression, accum_init, array1, ..., arrayn)对 n 个基数相同的数组应用 lambda 函数并将结果累积到累加器中PR #49794。注意合并后参数顺序经过调整arrayFold: Switch accumulator and array argumentsPR #55948累加器与数组参数的相对位置以最终版本为准。实现位于 arrayFold.cpp。arrayRandomSample(arr, k)随机采样。从输入数组中返回 k 个元素的随机样本PR #54391。此前只能通过arrayReduce(groupArraySample(3), ...)之类的较繁琐语法实现。jsonMergePatchJSON 字符串合并。处理 JSON 对象字符串时可将多个 JSON 对象字符串按 RFC 7386JSON Merge Patch语义合并为一个PR #54364后续补丁 #56020 修正了实现细节。实现位于 jsonMergePatch.cpp。byteSwap无符号整数字节序反转。特别是用于内部以无符号整数表示的类型如 IPv4的字节反转场景PR #55211后续 #55607 补充了 16/32 字节整数支持。实现位于 byteSwap.cpp。formatQuery()/formatQuerySingleLine()SQL 字符串格式化。前者返回可能跨多行的格式化查询后者返回不含换行的单行版本PR #55239。两者都可用于在查询中动态生成、美化 SQL 文本。getHttpHeader获取 HTTP 请求头。返回发起请求到 ClickHouse 服务器时所用 HTTP 请求头的值非 HTTP 协议请求或不存在的头返回空字符串PR #54813。需要留意变更日志的 NO CL ENTRY 区块记录了该 PR 曾一度被 revert#56109说明该功能的最终可用性以实际版本二进制中的函数注册表为准升级后可直接SELECT getHttpHeader(Host)验证。3.2 新增聚合函数与组合器lttb聚合函数LTTB 降采样。使用 Largest-Triangle-Three-Buckets 算法对数据降采样专为图表可视化场景设计PR #53145。实现位于 AggregateFunctionLargestTriangleThreeBuckets.cpp。典型用法如SELECT lttb(100)(x, y) FROM measurements-ArgMin/-ArgMax聚合组合器。允许只按最小值/最大值聚合PR #54947并借此将组合器实现整理到独立目录。典型用例是求某指标在组内取极值时的关联字段同时避免argMin(arg, val)中额外排序开销。3.3 新增 SQL 语法与语句SHOW SETTING setting_namePR #55979SHOW SETTINGS的简化版查看单个设置项的当前值、默认值与描述CHECK TABLE ... PART part_namePR #53404CHECK TABLE性能与可用性改进——支持发送进度更新、支持取消并可对指定 part 执行校验SHOW MERGESPR #55815后续 #56124 美化输出查看正在进行的 merge 过程RENAME db.t1 TO db.t2省略TABLE关键字PR #55373分区 DDL 支持查询参数ALTER TABLE t DROP PARTITION等语句可使用{name:Type}参数PR #49516... ACTION PARTITION的参数支持由 #55604 补齐SYSTEM DROP SCHEMA FORMAT CACHE [FOR Protobuf]PR #55064可手动丢弃 Protobuf 等格式的 schema 缓存DESCRIBE行为增强新增describe_include_virtual_columns结果中包含虚拟列与describe_compact_output仅返回列名和类型PR #55129。3.4 输入/输出格式扩展DWARF 输入格式PR #55450从 ELF 可执行文件/库/目标文件读取调试符号典型用途是把 coredump 的符号信息灌入表中做分析Npy 格式PR #55982支持读取 NumPy 数组文件例如SELECT * FROM file(example_array.npy, Npy)3.5 日志引擎的错误处理模式RabbitMQ、NATS 与 FileLog 引擎支持保留解析失败记录PR #55477issue #36035语义与kafka_handle_error_mode对齐引擎设置项出错时填充的虚拟列NATSnats_handle_error_mode_error、_raw_messageRabbitMQrabbitmq_handle_error_mode_error、_raw_messageFileLoghandle_error_mode_error、_raw_record取值为default时解析失败抛异常取值为stream时错误与原始记录写入虚拟列不中断消费。3.6 存储引擎与索引空间填充曲线键的条件下推。若表按空间填充曲线排序例如ORDER BY mortonEncode(x, y)则对参数列的范围条件如x 10 AND x 20 AND y 20 AND y 30可以被用于索引分析PR #55642issue #41195 及更早一系列 issue 的延续。开关设置analyze_index_with_space_filling_curves可启用或禁用该分析已在 Settings.cpp 中注册。倒排索引的max_rows_per_postings_list。倒排索引不再保存匹配行过多的 token以节省空间并避免低效的索引查找PR #55616。旧定义中的density参数控制何时不保存 token被移除替换为更直观的max_rows_per_postings_list默认 64k直接限制 posting list 中允许的最大行号数量。该设置同样在 Settings.cpp 中定义。其他存储侧新能力optimize_trivial_approximate_count_query为 EmbeddedRocksDB 存储启用count()近似并为 StorageJoin 启用 trivial countPR #55806force_optimize_projection_name传入投影名后ClickHouse 会强制校验该投影在查询中至少被使用一次PR #56134issue #55331create_table_empty_primary_key_by_default默认ORDER BY ()的控制开关PR #55899materialized_postgresql_use_unique_replication_consumer_identifier允许多个 MaterializedPostgreSQL 表跟随同一张 Postgres 表默认关闭以保持兼容PR #55145issue #54918外部 HTTP Basic 认证器PR #55199支持将认证委托给外部 HTTP 服务Replicated 数据库引擎引入 replica groupsPR #54421issue #53620。3.7 Keeper 客户端新增两条命令分别由 PR #55485 与 #55898 引入get_all_children_number返回某路径下所有后代节点的数量含间接子节点get_direct_children_number返回某路径下直接子节点的数量。两者配合system.zookeeper可低成本估算子树规模避免拉取完整节点列表。四、性能改进本版本性能条目数量较多按主题归纳如下查询执行与并发query_plan_preserve_num_streams_after_window_functionsPR #50771窗口函数求值后保留流数量使并行流处理可以延续到窗口函数之后小数据量时释放更多 num_streamsPR #53867修复 Context 锁竞争对大量短并发查询的性能有显著提升PR #55121ColumnVector::insertMany/insertManyFrom优化PR #55714IN函数中 set 元素类型与列类型不完全一致时的 cast 函数执行期缓存PR #55712。索引倒排索引创建性能提升 30%std::unordered_map替换为absl::flat_hash_mapPR #55210倒排索引 posting list 在序列化前优化为最小表示按数据重复度可显著降低索引空间占用PR #55069为二级索引的 marks 缓存设置合理的默认大小避免反复加载 marksPR #55654读取 skip 索引时避免不必要的 index granule 重建PR #55683issue #55653。外部聚合与 Map 类型产生大量临时文件时外部聚合的性能PR #55489与内存占用优化PR #54798Map 取值的键位置预测优化实践中同一 Map 列内键结构通常一致可预测下一行键位置以减少比较PR #55929。数据源ORC 下推过滤rowgroup 级别PR #55330Parquet 结构体字段裁剪在部分场景下不生效的问题修复PR #56117RoaringBitmap 序列化前优化PR #55044。五、其他改进Improvement除性能条外Improvement 区块包含大量行为增强择要说明兼容性与生态Kusto 查询语言方言支持的第二阶段PR #42510第一阶段为 #37961多项 MySQL 兼容增强information_schema.tables新增table_rows、information_schema.columns新增extra字段PR #55215toDayOfWeek()/toYearWeek()/toWeek()支持 String 参数PR #55589(add|subtract)(Year|Quarter|...)系列函数支持字符串日期参数PR #55869(add|sub)Date()与加/减运算符支持字符串日期 INTERVALPR #55960。官方明确说明这些改动是为了 MySQL 兼容性并且是 Tableau Online 集成的需要untuple()对命名字段元组的结果列名生成规则变化有别名时列名由 untuple 别名与元组元素别名组合PR #55123。可靠性与易用性async_socket_for_remote模式下分布式查询现在遵守max_threads限制PR #53504此前部分查询可能创建多达max_distributed_connections数量的线程拖垮服务器性能——这是集群环境下容易被忽视的隐患升级可获得直接收益分区内 part 数量超过 1000 时的整体韧性增强可能减少TOO_MANY_PARTS错误PR #55526ReplicatedMergeTree 启动时检查意外 part本地存在但 ZooKeeper 中没有意外 part 移入 detached 目录并尝试恢复祖先 part本版本改为优先恢复最近的祖先而非随机 covered partPR #55645损坏 part 在服务器关闭前打印其磁盘路径PR #56181此前 part 损坏导致服务器无法启动时几乎无从定位是哪个 partdate_time_overflow_behavior设置PR #55696取值ignore/throw/saturate控制 Date/Date32/DateTime64/整型/浮点向日期时间类型转换的溢出行为apply_deleted_mask关闭后可读取被轻量级 DELETE 标记删除的行便于调试PR #55952日志中更完善地隐藏机密信息PR #55089system.parts_columns新增substreams与filenames字段PR #55108system.clusters新增internal_replication字段PR #55377。协议与接口http_write_exception_in_output_format场景下异常输出使用声明的查询格式PR #55739并修复了该设置下错误查询结果的问题PR #56135use_mysql_types_in_show_columns仅影响SHOW COLUMNSPR #55481并新增mysql_map_string_to_text_in_show_columns、mysql_map_fixed_string_to_text_in_show_columns控制String/FixedString输出为TEXT还是BLOBPR #55617异步插入支持原生协议的外部数据此前仅限内联数据PR #54730查询参数在自定义 HTTP handler 下可用PR #55521clickhouse-keeper支持使用内嵌配置运行PR #56086clickhouse-local中删除当前数据库后仍可执行部分查询并切换数据库行为与clickhouse-client一致PR #55853所有字典支持dictionary_use_async_executor设置PR #55839RocksDB 写入性能改进PR #55732Kusto 实现中的竞态条件修复PR #55615。其他值得注意的行为修正直接字典配置 lifetime 字段时在建表期即被拒绝PR #49043issue #27861zookeeper_connection重构并新增xid列PR #50702OPTIMIZE配合optimize_throw_if_noop1时不同 part 投影不同导致的 unknown reason 报错被修复PR #55130投影分析现在仅基于查询计划顶层进行query_plan_optimize_projection设置随之废弃PR #55112按行估计动态调整并行副本数量PR #51692数学减号−字符Unicode 减号在查询中可用PR #54100CSV 格式允许未加引号字符串中包含 CRPR #56046issue #39930minSampleSizeContinous拼写错误修正为minSampleSizeContinuous旧名保留兼容PR #56143。六、构建 / 测试 / 打包改进对自构建与 CI 用户而言本版本包含AVX 构建修复PR #55049此前启用-DENABLE_AVXON -DENABLE_AVX2ON -DENABLE_AVX2_FOR_SPEC_OPON构建时snappy 会因未启用SNAPPY_HAVE_X86_CRC32而报unknown type name __m256i编译错误Docker 初始化逻辑数据库已初始化则跳过重复初始化可修复超大库/多节点环境下 1000 次加载失败后容器无限重启的问题PR #50724Darwin 专用构建任务产出包含子模块源码的资源包可免 checkout 子模块构建PR #51435;包完整性为 tgz 校验 sha512TGZ.sha512 文件只写文件名keeper 使用独立仓库PR #55717从 clickhouse-server 包中独立启动 clickhouse-keeper 的问题解决PR #55226测试侧RabbitMQ 升级至 3.12.6 并改进日志收集PR #55424、集成测试新增instance_env_variables选项PR #55208、s390x 平台的 HDFS 支持PR #56128、jbod balancer 测试去抖动PR #56175。七、缺陷修复Bug Fix该区块修复了 50 个用户可见缺陷按问题域归纳括号内为 PR 号MergeTree / 副本 / Part 管理mutation 中跳过倒排索引文件的硬链接#47663adaptive granularity 下ALTER UPDATE的 skip 索引重算修复#55202S3 上非 zero-copy 的 ReplicatedMergeTree 无法 drop detached partition 的修复#55309SummingMergeTree 的SELECT FINAL中 Nested 列错误合并修复#55276轻量级删除 part 的storage.has_lightweight_delete_parts标记在 part 加载时正确设置DROP_RANGE与已有 block 提交之间的竞态修复least_used JBOD 策略的空闲空间统计错误修复#56030。查询执行与崩溃MergeSortingPartialResultTransform中因remerge()后零块导致的 SIGSEGV#55335CreatingSetsTransform在错误路径上的数据竞争#55338v2 修复 #55786稀疏列上的函数执行#55275与窗口函数#55895修复虚拟列 OR 过滤条件查询的过滤逻辑修复#55418重提版 #55678表函数内子查询求值时标量缺失问题#56057Buffer 表并发 ALTER 与 INSERT 导致 Block structure mismatch#55995最终修复 #56140QueryNormalizer循环别名崩溃修复#55602窗口函数、show databases limit等多项修正。外部系统与格式Iceberg 存储的文件获取与一系列修复改进#55144、#55695;MongoDB 连接问题#55419、ODBC 与 MS SQL Server 交互 Invalid cursor state#55558、MySQL 接口布尔表示#55427与文本协议 DateTime 格式化#55479AvroConfluent 从 schema registry 拉取 schema 的修复#55991Native/ORC 输入格式可能的段错误#55891Arrow 字典列输入输出修复#55989dateTime64ToSnowflake64()非默认 scale 修复#55983精确浮点解析开启时非法字符串转浮点抛异常#55861CTE 含状态函数时禁用谓词下推#55871压缩器在 buffer 未 finalize 时的潜在内存泄漏#55262StorageHDFS 内存泄漏#55370LDAP 授权角色更新死锁#55119与备份死锁#55132accurateCastOrNull()修复重新合入#54629无AS创建的 Distributed 表 DEFAULT 检测修复#55060。八、NO CL ENTRY 与 NOT FOR CHANGELOG 区块说明变更日志末尾两个区块记录了不对外承诺行为的内部提交阅读时应注意NO CL ENTRY区块包含 10 条记录多为Revert 操作例如 Revert Support SAMPLE BY for VIEW#55357、Revert Add function getHttpHeader#56109、Revert Fix output/input of Arrow dictionary column#56150以及 dashboard 单图表按钮、pdqsort 排序优化等回滚。这说明这些特性在本版本内不稳定或被撤回使用相关能力前应在目标版本上实测验证NOT FOR CHANGELOG / INSIGNIFICANT区块约 90 条主要是测试修复、CI 调整、Analyzer/Planner 内部重构、依赖版本提升croaring 2.0.x、curl 8.4、gRPC 多次升级、protobuf 升级等内部提交不影响用户行为。九、升级建议与仓库内验证路径结合本文解析升级到 v23.10.1.1976-stable 前建议按顺序检查S3Queue 用户确认 ZooKeeper 中队列元数据的兼容性与system.s3queue、system.s3queue_log可用性这是最大的行为变化使用过 in-memory parts 的部署升级前移除相关 part 配置WAL 不再能恢复内存 part依赖自动清理损坏 part 的运维流程改为显式处理 broken part并利用新能力——关闭前打印损坏 part 路径Improvement #56181定位问题配置迁移*directory_monitor*→distributed_background_insert*旧名仍作别名保留依赖旧行为的 SQL不同单位 TimeInterval 比较、按底层数值比较的场景需改写验证新能力lttb、arrayFold、arrayRandomSample、jsonMergePatch、byteSwap、SHOW SETTING、SHOW MERGES、DWARF/Npy 格式等均可通过直接执行 SQL 验证实现文件分别位于 src/Functions 与 src/AggregateFunctions 目录设置项定义可查 src/Core/Settings.cpp集群并发短查询场景Context 锁竞争修复#55121与max_threads限流修复#53504升级后可观察 QPS 与延迟指标的改善。变更日志原文含全部 PR 编号与贡献者署名见 v23.10.1.1976-stable 变更日志同目录下的其他归档版本日志可用于做跨版本对比。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表