
ClickHouse 21.7 版本解读核心新特性、关键配置与运维要点全解析【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本篇文章基于 ClickHouse 官方发布说明 v21.7.1.7283-prestable Changelog 展开梳理该版本引入的向后不兼容变更、新功能、性能优化与修复要点并结合当前仓库源码验证关键设置项的默认值与行为。读完本文你将掌握 21.7 版本的升级注意事项、若干新函数与聚合函数的用法、以及复制限速、分布式查询等运维相关配置项的真实实现。版本概览与升级须知v21.7.1.7283-prestable 是 ClickHouse 21.7 系列的预稳定prestable版本对比基准为 v21.6.1.6891-prestable。该版本覆盖四大类变更向后不兼容变更Backward Incompatible Change、新功能New Feature、性能改进Performance Improvement与改进Improvement以及大量的Bug 修复Bug Fix与构建/测试/打包改进。对于生产环境升级最关键的是先了解两项向后不兼容变更它们直接关系到集群滚动升级时的可用性。向后不兼容变更大集合 IN 查询与元组字面量命名21.7 优化了显式定义大集合的查询性能PR #25371。由于该优化改变了元组字面量生成列名的方式ClickHouse 提供了兼容性设置设置项legacy_column_name_of_tuple_literal适用场景从低于 21.7 的版本向更高版本做集群滚动升级时应将该设置设为true。否则升级过程中IN子句中显式定义集合的分布式查询可能执行失败。这提示运维人员在滚动升级窗口期内需要在所有节点临时启用该兼容开关待全部节点升级完成后再关闭。这类兼容性设置 滚动窗口的模式在 ClickHouse 大版本升级中十分常见。向后不兼容变更clickhouse-keeper 最大缓冲区大小21.7 对 clickhouse-keeper 的最大缓冲区大小进行了前向/后向均不兼容的调整PR #25421。发布说明明确建议由于 keeper 尚未大规模进入生产环境应当在进入生产之前完成这一变更而不是拖到上线之后。新函数与聚合函数详解21.7 引入了多个实用函数覆盖时间处理、位运算、流程分析、地理空间与序列统计等场景。日期名称函数 dateName新增dateName函数PR #23085与已有的monthName函数src/Functions/monthName.cpp同属时间日期函数家族。典型用法示例SELECT dateName(month, toDate(2021-07-01)); -- 返回 July SELECT dateName(weekday, toDate(2021-07-01));dateName的第一个参数指定要提取的时间部分名称如year、month、day、weekday第二个参数为日期时间值。位运算辅助函数 bitPositionsToArray新增bitPositionsToArray函数PR #23843可用于位掩码解析、权限位分析等场景。流程分析函数 sequenceNextNode新增sequenceNextNode()函数PR #19766专用于流程分析flow analysis场景用于在事件序列中定位满足条件模式的下一个节点/事件。它与已有的sequenceMatch、sequenceCount等序列函数配合可以描述当 A 发生后下一个满足 B 的事件这类路径分析需求。H3 地理索引函数 h3ToGeo新增h3ToGeo函数PR #24867相关边界函数见 src/Functions/h3ToGeoBoundary.cpp。值得注意的是该 PR 在发布前曾被临时回滚见 NO CL ENTRY 中的 Revert Implement h3ToGeo function最终随 21.7 一并合入使用时请以实际发布二进制为准。JSON 序列化函数 toJSONString新增toJSONString函数PR #25164。用法SELECT toJSONString(map(k, toUInt8(1))) {k:1}; SELECT toJSONString(tuple(1, Hello)) [1,Hello];这对于将行数据直接导出为 JSON、或与kafka/http等输出端对接非常方便。分位数聚合函数族quantileBFloat16新增quantileBFloat16聚合函数及其变体quantilesBFloat16、medianBFloat16PR #23204。它基于BFloat16脑浮点表示实现特点实现非常简单且速度很快精度相对误差不超过0.390625%用途适合对精度要求不苛刻、但对速度敏感的大规模分位数估算场景。实现位于 src/AggregateFunctions/AggregateFunctionQuantileBFloat16.cpp 与对应的加权版本 AggregateFunctionQuantileBFloat16Weighted.cpp基类为 AggregateFunctionQuantile.h。BFloat16 的底层类型定义可参考 base/base/BFloat16.h。示例SELECT quantileBFloat16(0.9)(x) FROM (SELECT rand() AS x FROM numbers(1000000));序列段长度聚合函数 segmentLengthSum新增聚合函数segmentLengthSumPR #24250用于计算满足条件的事件段segment的长度之和适合会话分析、连续区间统计等场景。其内部实现位于AggregateFunctionSegmentLengthSumData见发布说明引用的内部修改。引擎与格式能力扩展HDFS VFS 支持与复制表元数据恢复HDFS 虚拟文件系统VFS21.7 开始支持基于 HDFS 的 VFSPR #11058使多卷/分层存储策略可以扩展到 HDFS 之上。复制表元数据丢失恢复当数据可能仍然存在、但 ZooKeeper 元数据丢失时21.7 提供了恢复复制表的手段PR #13652对应 issue #13458。这是应对ZK 集群故障导致元数据丢失这一经典运维灾难的重要能力。Join 引擎支持 ALTER DELETEJoin表引擎开始支持ALTER DELETE查询PR #23260可以直接清理 Join 表中符合条件的行而无需重建表。Arrow/Parquet/ORC 格式扩展21.7 为列式外部格式带来多项能力Arrow/Parquet/ORC 支持struct结构体与 map映射类型Arrow 输入/输出格式支持字典dictionary类型新增设置output_format_arrow_low_cardinality_as_dictionary控制 LowCardinality 列在 Arrow 输出时是否编码为字典类型。另外还修复了 Arrow 格式中的堆缓冲区溢出PR #24922并为 Arrow 增加了Decimal256支持PR #25531。字典与 MySQL 能力增强字典支持 Array 类型PR #25119字典属性现在可以是数组MaterializeMySQL基于 MySQL 物化创建的 ClickHouse 数据库会继承 MySQL 数据库中的全部列注释PR #25199MySQL 存储引擎连接设置新增connection_auto_close/connection_max_tries/connection_pool_size三个设置PR #24146用于控制 MySQL 引擎连接的生命周期、重试次数与连接池大小。配置加载器支持 YAML配置加载器configuration loader新增YAML 配置格式支持PR #21858对应 issue #3607并配套添加了YAMLParser的 libfuzzer 测试PR #24480。这意味着除 XML 外config.xml的替代者 YAML 配置方案开始进入官方支持路线。关键性能优化与设置项查询执行优化prefer_global_in_and_joinPR #23434新增布尔设置开启后默认将所有IN/JOIN视为GLOBAL IN/GLOBAL JOIN。这在数据分布不均衡或希望避免重复数据传输时很有用但也会改变分布式查询的数据流动方式。optimize_functions_to_subcolumnsPR #24406将部分函数优化为直接读取子列subcolumn减少读取的数据量。例如col IS NULL会被转换为读取子列col.null对 Nullable 列可显著降低 IO。实现上由RewriteFunctionToSubcolumnVisitor完成见发布说明。分布式 LIMIT 下推PR #23027支持将LIMIT下推到分布式查询的分片节点减少跨节点传输的数据量。not in参与分区裁剪PR #24894允许在分区裁剪条件中使用NOT IN进一步缩小扫描范围。optimize_skip_unused_shards支持单元素元组PR #24930当分片键条件形如(sharding key) IN (单元素元组)时也能跳过无用的分片此前仅支持多元素元组单元素会被解析为字面量。更激进的别名重写PR #24405将更多列重写为可能的别名表达式为投影projection等优化提供更好条件。query_plan_filter_push_downPR #25370修复了查询计划表达式下推优化中丢失WHERE条件的问题该设置在 21.7 默认开启值为 1。MergeTree 相关优化max_parts_to_merge_at_oncePR #24496新增 MergeTree 表设置限制后台单次合并最多参与的 part 数量不影响OPTIMIZE FINAL查询。适合控制合并产生的资源尖峰。复制网络带宽限速PR #24573issue #1821表级设置max_replicated_fetches_network_bandwidth与max_replicated_sends_network_bandwidth限制单表的复制拉取/发送最大速度服务级设置在default用户配置文件中max_replicated_fetches_network_bandwidth_for_server与max_replicated_sends_network_bandwidth_for_server限制整个服务器所有表的复制速度默认关闭值为 0即不限速且官方明确说明该设置不会被极其精确地遵守。该表级设置在当前仓库源码中有完整定义与文档注释见 src/Storages/MergeTree/MergeTreeSettings.cpp#L1535-L1559它限制复制 fetch 的网络速度字节/秒与作用于整个服务器的max_replicated_fetches_network_bandwidth_for_server不同两者可同时设置但表级值应小于服务级值否则服务级设置优先生效。源码注释同样强调该设置不会被极其精确地遵守默认值0表示不限制。该设置典型用途是在向集群添加/替换新节点时进行复制限速避免复制流量挤占正常业务带宽。background_schedule_pool_size提升至 128PR #25072后台调度线程池扩容避免在 ZooKeeper 连接缓慢时复制队列被挂起。insert_allow_materialized_columnsPR #23349向Distributed表 INSERT 时开始尊重该设置允许写入物化列。insert_distributed_sync尊重max_distributed_connectionsPR #24754避免在超大集群 同步插入场景下耗尽max_thread_pool_size。Distributed 批量拆分PR #23864新增设置distributed_directory_monitor_split_batch_on_failure默认关闭当后台分发批次因内存限制、数据损坏等原因失败时允许拆分批次重试。网络与其他改进IPv4 本地地址识别PR #24316将127.0.1.1这类地址识别为本地地址存在争议见 issue #23504。IPv6 地址解析修复PR #24319修复select * from remote([::1], system.one)类查询。运行时探测 Linux 版本PR #25067为async_socket_for_remote/use_hedged_requests所需的嵌套 epoll 能力做运行时检测避免远程查询卡死。HTTP 请求头限制设置PR #25296新增http_max_fields、http_max_field_name_size、http_max_field_value_size三个设置防护异常 HTTP 请求。query_log 新增列PR #25022query_log表新增initial_query_start_time/initial_query_start_time_microsecond记录分布式查询在发起节点上的起始时间便于分布式查询全链路耗时分析。VIEW 使用全局设置PR #24095修复CREATE VIEW与SELECT使用不同设置导致查询报错的问题。现在查询VIEW时使用全局设置但依然可以在CREATE VIEW的SETTINGS段中指定额外设置。clickhouse-bridge 资源隔离PR #25280为 bridge 进程使用独立的clickhouse-bridge用户/组设置oom_score_adj使其成为 OOM killer 的首选对象并将最大 RSS 限制为 1 GiB。重点 Bug 修复盘点21.7 修复了大量高影响问题按主题分类如下复制与 ZooKeeper 可靠性修复 ZooKeeper 客户端在 clickhouse-server 内部挂起的问题PR #24721修复 Keeper 关闭时的数据竞争PR #24412修复连接丢失后克隆副本可能产生过期复制队列条目、以及复制队列含相交虚拟 parts 时的崩溃问题改为打印错误日志而非终止PR #24777修复 ZooKeeper 连接丢失时ReplicatedMergeTree等待后台操作完成才重连的问题现在会强制停止后台操作PR #25306修复SYSTEM RESTART REPLICA/SYSTEM SYNC REPLICA在极小内存服务器上无限处理的问题PR #24457修复并发ALTER MOVE/REPLACE PARTITION时复制队列中极其罕见的 Tagging already tagged part 错误PR #24961修复REPLACE PARTITION在源分区为空时被忽略的罕见问题PR #25665修复低内存服务器上极罕见的无法合并问题PR #24872修复空 parts 自动删除的等待逻辑避免后台池被占满导致复制卡死PR #23315。数据正确性修复 TTL 合并后产生相交 parts 的问题PR #25549修复带分区键使用 UUID 的表升级到 21.5 后可能丢失 parts 的问题PR #25127提示不建议在分区键中使用 UUID修复服务器启动时分区 ID 不正确的 parts 处理不再删除而是改为 detachedPR #25166修复WITH TOTALS与WITH FILL组合时 totals 结果错误PR #25539修复toWeek函数单调性错误该 bug 由 PR #5212 引入后被更智能的分区裁剪器暴露PR #24446修复聚合投影aggregate projection在GROUP BY空键与非空键混用时结果错误PR #25055修复SELECT ... FINAL误用表投影的问题21.7 尚不支持PR #25163修复CREATE .. AS SELECT中元组使用问题PR #24464修复自引用列定义如a UInt32 ALIAS a 1可建表的问题PR #25059修复大整数中CAST(1e19 AS UInt128)返回 0 的问题及 UBSan 报告PR #25279。类型与格式修复LowCardinality参数用于IN时Bad cast from type ColumnLowCardinality to ColumnVectorchar8_t错误21.6 引入PR #25290SummingMergeTree支持SimpleAggregateFunction(LowCardinality)PR #25300LowCardinality支持Interval类型PR #25410if函数支持 Decimal 与 Int 分支混用PR #25283修复 Protobuf 嵌套消息序列化问题PR #25000修复 CSVWithNames 格式插入列子集时的错误PR #25169修复 MySQL/PostgreSQL/ODBC 的带时区 datetime 转换问题PR #25528修复 postgres 数组在某些情况下被转成 String 而非 n 维数组的问题PR #25538PostgreSQL 协议允许 NULL 值PR #24857。查询与函数修复跨 join joined_subquery_requires_alias 0时崩溃PR #25082修复mapContains常量 map 导致的 empty column was returned 错误PR #25080修复joinGetOrNull与不可空列的问题PR #25288修复min/maxMap中 Cannot sum Array/Tuple 逻辑错误PR #25298修复quantileDeterministic等函数的非确定性行为PR #25313sequenceMatch/sequenceCount时间条件支持运算符例如sequenceMatch((?1)(?t1)(?2))(time, data 1, data 2)PR #25299修复 StorageMemory 变更时需max_threads 1的问题PR #24275修复EXPLAIN AST无查询时的空指针解引用PR #25631修复KILL MUTATION跨表误伤导致的Cancelled mutating parts错误PR #25025。运维与构建/测试改进独立 clickhouse-keeper 二进制入口PR #24059新增clickhouse-keeper符号链接指向主clickhouse二进制现在可以在不运行主服务器的情况下单独运行协调服务。keeper 支持 ZooKeeper 风格 digest ACLPR #24448clickhouse-keeper 支持digest访问控制列表兼容既有 ZooKeeper 权限模型。RabbitMQ 指数退避PR #24415当 RabbitMQ 队列为空时对重新调度读取采用指数退避避免空转。Kafka 故障转移修复PR #21267修复同一消费者此前为空分配时无法启动消费的故障转移问题。postgres schema 支持 INSERTPR #24413插入查询支持 PostgreSQL schema。安装脚本 TOCTOU 修复PR #25277修复安装脚本中的 time-of-check-time-of-use 竞态问题。构建/测试Ubuntu 20.04 用于集成测试、docker-compose 升级至 1.28.2PR #20393新增 darwin-aarch64 交叉编译 CI 检查PR #25560启用含 s3 模块的 macOS 构建PR #25218Flatbuffers 升级至 v2.0.0PR #25474。总结与升级建议21.7 是一个功能与稳定性并重的版本在功能侧带来了dateName、bitPositionsToArray、sequenceNextNode、h3ToGeo、toJSONString、quantileBFloat16系列与segmentLengthSum等一批新函数以及 HDFS VFS、YAML 配置、Join 引擎ALTER DELETE、Arrow/Parquet/ORC 类型扩展等引擎级能力在稳定性侧修复了 ZooKeeper/keeper 可靠性、复制一致性、类型转换与格式序列化等大量高影响 bug并新增了复制带宽限速、合并数量控制、查询优化等实用设置项。针对计划升级到 21.7 的集群建议按以下顺序操作阅读完整发布说明docs/changelogs/archive/v21.7.1.7283-prestable.md确认与你所用功能相关的变更滚动升级期间开启legacy_column_name_of_tuple_literal规避大集合IN查询在混合版本节点上执行失败若已使用或计划使用 clickhouse-keeper提前评估最大缓冲区大小变更对现有数据/配置的影响在测试环境验证optimize_functions_to_subcolumns、prefer_global_in_and_join、query_plan_filter_push_down等默认开启或新增的优化设置对核心查询计划的影响若需要控制复制流量可先配置服务级max_replicated_fetches_network_bandwidth_for_server与max_replicated_sends_network_bandwidth_for_server再按需设置表级同名设置表级值应小于服务级值。注本文中出现的 PR/issue 编号均来自官方发布说明原文函数行为与设置默认值以当前仓库源码为准21.7 为 prestable 版本生产部署前建议关注对应稳定版stable发布说明。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考