ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

ClickHouse v23.5 版本发布详解:投影生产就绪、S3 生态增强与大规模性能优化

2026/9/15 21:55:53 拓冰建站 浏览量
ClickHouse v23.5 版本发布详解:投影生产就绪、S3 生态增强与大规模性能优化 ClickHouse v23.5 版本发布详解投影生产就绪、S3 生态增强与大规模性能优化【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本文基于 ClickHouse 官方 v23.5.1.3174-stable 版本的完整变更日志见 docs/changelogs/archive/v23.5.1.3174-stable.md系统梳理该版本引入的破坏性变更、新特性、性能改进与修复要点并结合仓库源码验证关键配置与实现细节。读完本文你将掌握 v23.5 中需要关注的升级注意事项、可立即使用的新功能如投影优化开关、查询缓存、Azure Blob Storage 存储引擎、bcrypt 认证以及各核心设置的默认值与调优方法。一、版本概览与升级须知v23.5.1.3174-stable 是 ClickHouse 2023 年的重要稳定版本相比上一版 v23.4.1.1943-stable它涵盖 6 项向后不兼容变更、33 项新特性、22 项性能改进以及数量庞大的细节改进与 Bug 修复。本版本在存储层本地对象存储、marks/primary key 压缩、查询优化投影、grace hash join、并行副本、安全认证bcrypt、密钥展示控制与对象存储生态Azure、GCS、KMS 加密等多个维度都有实质性推进。升级前务必阅读第一部分列出的不兼容变更其中部分改动如 marks 压缩默认开启会影响集群滚动升级策略。二、向后不兼容变更升级必读1. 本地对象存储与 S3 行为对齐本地对象存储local object storage现在与 S3 对象存储行为保持一致修复了 append 相关问题并可配置为独立的存储。该变更是向后不兼容的因为在本地对象存储之上的缓存与旧版本不兼容相关 PR 见变更日志 #48791。升级到 v23.5 后若使用本地对象存储 缓存的组合需重新评估缓存层的兼容性。2. projections投影正式生产就绪投影功能从实验性状态正式转为生产可用。新增optimize_use_projections设置控制 SELECT 查询是否选择投影而旧的allow_experimental_projection_optimization设置已废弃no-op。从源码可以看到该设置的完整定义与别名关系src/Core/Settings.cppDECLARE_WITH_ALIAS(Bool, optimize_use_projections, true, R( Enables or disables projection optimization when processing SELECT queries. Possible values: - 0 — Projection optimization disabled. - 1 — Projection optimization enabled. ), 0, allow_experimental_projection_optimization)要点默认值为1开启可通过optimize_use_projections 0关闭旧设置allow_experimental_projection_optimization作为别名保留兼容历史配置配套设置还包括optimize_use_implicit_projections自动选择隐式投影、optimize_use_projection_filtering用投影过滤 part 范围、force_optimize_projection强制使用投影与preferred_optimize_projection_name优先指定投影名均定义在同一文件中src/Core/Settings.cpp。3. 移除实验性 in-memory data parts实验性的内存数据 parts 功能被移除但数据格式仍被支持相关设置变为 no-op实际会改用 compact 或 wide parts。若你之前依赖min_bytes_to_use_mmap等内存 part 行为请改用 compact/wide 方案。4. 读取文件时允许重排行序parallelize_output_from_storages与input_format_parquet_preserve_order的默认值被修改ClickHouse 现在从文件如 CSV、Parquet读取时可以对行进行重排从而大幅提升性能。如需恢复旧行为保持顺序使用SET parallelize_output_from_storages 0; SET input_format_parquet_preserve_order 1;5. joinGet() 标记为非确定性joinGet()与dictGet()一样被标记为非确定性函数这会影响依赖该函数的物化视图、缓存等场景的正确性判断。6. groupArray 对 Nullable 类型的回退由于二进制兼容性问题groupArray/groupArrayLast/groupArraySample对Nullable类型的支持被回退该改动可能导致TOO_LARGE_ARRAY_SIZE或CANNOT_READ_ALL_DATA错误。三、新特性详解1. 认证与权限体系增强bcrypt 密码认证新增 bcrypt 密码认证类型#34599。源码中 bcrypt 已作为独立认证方式实现见 src/Access/Authentication.cpp 与 src/Access/Common/AuthenticationType.h。默认密码类型CREATE USER u IDENTIFIED BY p语句中密码类型会自动根据服务端config.xml中的default_password_type设置决定。密钥展示控制新增 server/format 设置display_secrets_in_show_and_select与权限displaySecretsInShowAndSelect用于控制表、数据库、表函数、字典的密钥是否在 SHOW/SELECT 中展示。实际生效逻辑在 src/Interpreters/formatWithPossiblyHidingSecrets.cpp必须同时满足上下文设置开启、会话内设置开启且用户被授予对应权限三者缺一不可return context-displaySecretsInShowAndSelect() context-getSettingsRef()[Setting::format_display_secrets_in_show_and_select] context-getAccess()-isGranted(AccessType::displaySecretsInShowAndSelect);users.xml 扩展支持在users.xml中直接指定grants字段和roles字段允许通过配置文件为用户授权和分配角色。2. 对象存储与表函数生态AzureBlobStorage 存储引擎与表函数新增AzureBlobStorage存储引擎和azure_blob_storage表函数#19307支持的功能集与 S3 存储/表函数非常接近。底层实现见 src/Storages/ObjectStorage/Azure/Configuration.cpp 与 src/Disks/DiskObjectStorage/ObjectStorages/AzureBlobStorage/AzureObjectStorage.cpp。urlCluster 表函数新增urlCluster表函数并对所有*Cluster表函数进行了去重重构为所有*Cluster函数签名和 named collections 支持 schema 推断。实现见 src/TableFunctions/TableFunctionURLCluster.cpp。url 表函数虚拟列为url表函数增加_file与_path虚拟列并改进错误信息。gcs 表函数gcs作为s3表函数的别名加入同oss、cosn兼容 Google Cloud Storage。S3 增强支持使用 KMS 密钥的服务端加密S3 表 S3 disk 的header设置支持 S3 严格 parts 大小兼容 Cloudflare R2新增s3_max_inflight_parts_for_one_file设置限制单文件 multipart 上传的并发 parts 数。3. 查询与数据处理新能力generateRandomStructure新增生成随机表结构的函数可与generateRandom表函数配合使用。实现见 src/Functions/FunctionGenerateRandomStructure.h 与 src/Functions/FunctionGenerateRandomStructure.cpp并有对应单元测试 src/Functions/tests/gtest_generate_random_structure.cpp。查询缓存生产可用查询缓存query cache正式可用于生产负载#47977并支持totals/extremes修饰符的查询旧的allow_experimental_query_cache设置被标记为 obsolete 以保持向后兼容。系统表新增system.zookeeper_connection展示 ZooKeeper 连接信息实现在 src/Storages/System/StorageSystemZooKeeperConnection.cppsystem.user_processes展示用户级内存与 ProfileEvents配套SHOW USER PROCESSES查询system.replicas新增zookeeper_name列指示复制表元数据存储于哪个辅助ZooKeeper 集群system.clusters新增database_shard_name、database_replica_name、is_active列。JOIN 能力扩展grace hash join 算法现支持 full/right join#49483RIGHT/FULL JOIN在特定场景小左表 大右表性能提升最高 2 倍。first_value/last_value 支持 NULLCASE无ELSE分支修复transform()支持更多类型。空间数据类型生产就绪Point、Ring、Polygon、MultiPolygon地理数据类型转正。其他 SQL 新能力SHOW INDEX/SHOW INDICES语句兼容 MySQL、INTO OUTFILE ... APPEND、WITH FILL按排序前缀分组填充use_with_fill_by_sorting_prefix默认开启、dictGetAllregexp tree 字典多匹配返回数组、toLastDayOfWeek()、space()、str_to_map/mapfromstring别名、dotProduct支持数组、--multiquery无--query时直接执行、--input_format_csv_trim_whitespaces选项、ignore_data_skipping_indices跳过索引忽略能力、clickhouse-client 的handshake_timeout设置。4. 后台任务内存管控为后台任务merges 和 mutations引入独立 MemoryTracker。新增服务端设置merges_mutations_memory_usage_soft_limit默认 0即由比例计算merges_mutations_memory_usage_to_ram_ratio默认 0.5当达到软限制时ClickHouse 不再调度新的 merge/mutation 任务同时新增MergesMutationsMemoryTracking指标用于观察后台任务内存。定义见 src/Core/ServerSettings.cpp默认软限制计算公式为memory_amount * merges_mutations_memory_usage_to_ram_ratio。四、性能改进存储、读取与聚合全面提速1. marks 与 primary key 默认压缩重点marks 与 primary key 默认启用压缩显著降低冷查询时间。升级注意事项压缩 marks/primary key 的支持自 22.9 引入若你开启过该功能或安装了默认开启的 23.5将无法降级到 22.8 或更早版本。如需显式关闭merge_tree compress_marks0/compress_marks compress_primary_key0/compress_primary_key /merge_tree从 22.9 之前的版本升级时建议一次性升级所有副本或先禁用压缩或经由中间版本如 23.3过渡。2. 字典性能大幅优化SPARSE_HASHED/HASHED字典的内存与速度显著改善——SPARSE_HASHED内存占用降低约 2.6 倍速度提升约 2 倍#49380。3. 远程读取任务切分与缓存对齐从远端表读取时使用更小的任务而非读取整个 part以便任务窃取生效任务大小由待读列大小决定S3 读取统一使用 1MB 缓冲区缓存段边界对齐到 1MB避免碎片化#49287。4. 读缓冲区设置细化默认的本地文件系统读缓冲区大小调整并新增两个设置max_read_buffer_size_local_fsmax_read_buffer_size_remote_fs5. 投影选择优化聚合投影仅在读取 granule 数少于普通读取时使用避免查询命中表主键却未命中投影时的性能回退#49417。6. 其他性能改进系统日志表优化system.query_log/system.query_thread_log应用 LowCardinality查询更快本地 Parquet 文件并行读取性能更好BLAKE3 通过 Rust LTO 提升 11% 性能日期转换谓词 AST 级重写toYear/toYYYYMM等替换为等价日期比较实测整体 QPS 提升约 11%uniqExactIf状态并行合并uniqExact支持-Array/-Merge/-OrNull/-State并行合并Arm LZ4 启用LZ4_FAST_DEC_LOOP解压速度提升约 5%ANYhash join 在未插入任何数据时不存储 blocks聚合 combinator-If的 JIT 编译修复grace_hash join 预保留哈希表大小。五、重要改进Improvements1. 存储与分布式备份加密BACKUP命令不再解密加密盘数据备份以加密形式存储且只能恢复到拥有相同或扩展密钥列表的加密盘加密盘指纹加密盘使用指纹fingerprints替代 key IDs分布式查询支持ON CLUSTER查询保留initial_query_iddistributed_ddl_entry_format_version5下便于问题追踪支持跨复制cross-replication分布式查询mutations 限流新增number_of_mutations_to_delay与number_of_mutations_to_throw设置当表已有大量未完成 mutations 时延迟或拒绝新的ALTER UPDATE/ALTER DELETE/ALTER MODIFY COLUMN等outdated parts 加载/删除数据 parts 加载与删除任务改为服务器级共享线程池由max_active_parts_loading_thread_pool_size、max_outdated_parts_loading_thread_pool_size、max_parts_cleaning_thread_pool_size控制表级设置max_part_loading_threads/max_part_removal_threads废弃Keeper新增CheckNotExists请求避免重复序列化请求、缓存大请求反序列化结果min_request_size_for_cache控制system.zookeeper_connection提供连接可见性复制表enable_the_endpoint_id_with_zookeeper_name_prefix设置默认关闭可避免相同 path 但不同辅助 ZooKeeper 时的Duplicate interserver IO endpoint错误。2. 格式与输出Pretty格式更美观短时间内连续输出的块会被合并由output_format_pretty_squash_ms默认 100ms控制Parquet 写入器通过 OUTFILE 输出时使用合理的 row group 大小output_format_parquet_compliant_nested_types设置用于生成更兼容的 Parquet 文件。3. 函数与类型IN操作符支持Date与Date32比较bitHammingDistance支持String/FixedStringbitCount支持UInt128/Int128/UInt256/Int256大整数可做大规模位掩码 Hamming 距离服务 AI 场景groupBitAnd/Or/Xor支持有符号整型makeDate提供 MySQL 兼容重载年 年内第几天toUnixTimestamp()接受Date/Date32Interval数据类型可存储在表中PostgreSQL 表引擎支持UUID类型MongoDB 支持Array类型新增 schema 推断支持PostgreSQL、MySQL、MeiliSearch、SQLite 表引擎ntile窗口函数可不显式声明窗口框架ntile(3) OVER (ORDER BY a)跳过索引通过ALTER TABLE ... ADD INDEX创建时可省略GRANULARITY子句默认视为 1YAML 配置默认支持加载字典和函数无需再改dictionaries_config/user_defined_executable_functions_config新分析器相关并行副本下非复制存储的错误修复allow_experimental_parallel_reading_from_replicas支持 0/1/2 三种取值parallel_replicas_min_number_of_granules_to_enable自动关闭并行副本skip_unavailable_shards默认开启。4. 客户端与接口clickhouse-local支持查询参数clickhouse-client禁止同时使用--query与--queries-fileURL 支持?passwordpass密码不会出现在浏览器历史中SIGQUIT 信号行为与 SIGINT 一致限制性关键字如ARRAY在带引号作为别名时允许使用。六、构建、测试与打包改进keeper-bench 全面重写请求生成器、每种请求的字段、multi 请求、权重分布、树结构、主机与超时、随机数生成等全部可从 YAML/XML 配置工具链升级切换到 LLVM/clang 16支持 clang-17 构建ClickHouse 可在 Linux RISC-V 6.1.22 上运行允许在无prctl系统调用的环境如 AWS Lambda运行构建配置utils 仅在显式-DENABLE_UTILS1时构建缩短常规开发构建链接时间ClickHouse 更易于集成到其他 CMake 工程安全修复内部 protobuf 升级到 v3.18修复 CVE-2022-1941、libxml2 到 v2.10.4CVE-2023-28484、CVE-2023-29469、c-ares 到 v1.19.1多个 CVE、libgsasl 修复 CVE-2022-2469CI新增启用 analyzer 的 CI 检查支持命名故障注入named fault injection用于测试。七、重点 Bug 修复盘点v23.5 修复了数量众多的用户可见问题以下按模块归类要点查询正确性DISTINCT 在非排序列含零值时的顺序问题、nullable 主键查询结果错误、multiIf常量条件与 nullable 参数崩溃、arrayMap单参数元组数组、JIT 聚合 nullable key、比较函数 NaN 处理、常量折叠错误、anti/semi join 崩溃、IN单元素元组参数存储与 parts移除已存在 part 目录的 bug、零拷贝复制多处修复、sparse 列重启后读取、outdated parts 加载竞态、FINAL 过度使用流导致内存过大、数据跳过索引的 seek 阈值设置失效远程/对象存储S3 metricsWriteBufferFromS3Bytes等修复、GCS HMAC 修复、S3Cluster 参数处理、HTTPS 会话 IP 变更后重连Keeper并发快照处理、异常时死锁、快照安装后未提交状态应用格式与序列化IPv6 protobuf 编码、Nullable 文本格式解析逻辑错误、CustomSeparatedIgnoreSpaces 行尾空格、空 Arrow/Parquet 输出崩溃、bitShift*双常量参数、Date/Date32 转 DateTime64 索引查询客户端与备份备份条目校验和计算、增量备份追加文件、clickhouse-client 参数互斥校验、OS X 客户端超时重置错误。八、升级与验证建议升级路径规划若从 22.9 之前版本升级先确认 marks/primary key 压缩的兼容性策略一次性升级全部副本、或经 23.3 中间版本过渡若从 22.12 之前升级注意enable_memory_bound_merging_of_aggregation_results已默认开启可临时设为false直至升级完成行为变更确认检查生产负载是否依赖 CSV/Parquet 读取顺序如有则显式设置parallelize_output_from_storages 0确认joinGet()非确定性不会影响物化视图语义新能力试点可先在测试环境开启optimize_use_projections默认已开验证投影收益查询缓存可直接用于生产负载对后台 merge/mutation 内存敏感的场景配置merges_mutations_memory_usage_to_ram_ratio与软限制可观测性利用新增的system.zookeeper_connection、system.user_processes、MergesMutationsMemoryTracking指标与system.query_log的 LowCardinality 优化完善监控体系。本版本的完整变更条目均可在仓库 docs/changelogs/archive/v23.5.1.3174-stable.md 中查阅各设置的实际定义与默认值可在 src/Core/Settings.cpp 与 src/Core/ServerSettings.cpp 中进一步核对以便在升级前完成配置评估。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考