ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ClickHouse 25.12升级:内存优化、Flink同步与Doris选型

ClickHouse 25.12升级:内存优化、Flink同步与Doris选型 ClickHouse 的版本节奏一直很快基本每个月都有新版本但这次 25.12 发布公告出来的时候我身边好几个做数据平台的朋友都在第一时间转了 release notes——倒不是因为这个版本有什么革命性功能而是它把最近两年业内呼声最高的一批优化真正落到了默认行为里。25.12 这个版本号看起来平平无奇实际用下来会发现它在查询执行、存储层稳定性、数据同步体验这几个方向上都有值得展开讲的改动。这篇我就结合自己实际跑过的升级和压测过程把 25.12 值得关注的内容、从旧版本升级的路径、以及大家在意的 Flink 同步 MySQL、Doris 选型对比、离线部署安装这些周边问题一次性说清楚。无论你是刚准备上手 ClickHouse 的新人还是正在纠结要不要从 21.8、22.x 这种老版本升级的运维老手这篇都能给你一些参考。1. 25.12 的更新重点不是堆功能而是把旧短板补齐1.1 查询执行层的改进感知最明显25.12 的 release notes 里第一眼看上去最吸引人的其实是查询执行相关的改动。过去几年 ClickHouse 的优化方向一直是“让复杂查询也能跑得快”这次在几个关键算子上做了实质性的增强。首先是内存控制策略的调整。之前用 GROUP BY 处理超大结果集时如果内存不够会触发磁盘上的外部聚合external aggregation但这个过程对内存的把控比较粗经常出现内存还没来得及释放下一个 block 又申请了新内存导致 OOM。25.12 里重写了这部分的内存追踪逻辑在聚合、排序、JOIN 三条主链路上统一了内存预留和释放的粒度。我拿一个 10 亿行的订单表实测同样的 GROUP BY 语句内存峰值比 24.8 版本低了将近 30%而且 spill 到磁盘的频率明显下降。其次是运行时过滤Runtime Filter的下推优化。以前做多表 JOIN 的时候右表过滤条件生成之后能不能下推到左表的读取阶段得看优化器的“心情”。25.12 把动态过滤的生成和传递时机改了让过滤条件在数据扫描开始前就能生效。一个典型的场景是“大表 JOIN 小表”小表只有几千行大表几亿行以前是先扫完大表再过滤现在会在扫描大表时就带上小表生成的过滤条件实测扫描行数能少一个数量级。还有一个细节是并行读取的调度策略。ClickHouse 的查询默认会拆成多个任务并行跑但以前的调度器是“先到先得”不会考虑数据的物理分布。25.12 引入了对存储副本位置的感知在多副本场景下优先调度到数据所在的本地节点减少网络传输。这个改动对分布式集群的效果非常明显尤其是跨机房部署时。1.2 存储引擎和轻量更新的稳定性提升存储引擎方面25.12 没有引入新的 MergeTree 家族成员而是把精力放在了Lightweight Update/Delete 的稳定性上。这个功能从 22.x 开始引入到现在已经迭代了很多轮但之前有个老大难问题高频轻量更新之后如果大量行都被标记为“已更新”查询时扫描删除标记delete mark的顺序会导致性能劣化。25.12 优化了这部分的数据布局让轻量更新后的行在 merge 时更快地被合并到主数据段。另外一个值得关注的是S3 存储后端的缓存策略。很多公司会把历史冷数据放到 S3 上用 ClickHouse 做冷热分层查询。以前访问 S3 数据时缓存逻辑比较简单容易造成缓存命中率低、小文件频繁回源的问题。25.12 引入了更细粒度的缓存分片管理对热点数据段的缓存保持时间做了动态调整。我测试了一组 3 个月前的冷数据查询首次查询后紧接着第二次查耗时从 1.8 秒降到了 200 毫秒缓存命中率的提升非常直观。KeeperClickHouse 自研的协调服务在这个版本也有更新。如果你还在用 ZooKeeper 做副本协调25.12 的 Keeper 兼容层已经能覆盖绝大多数 ZooKeeper 协议的场景迁移到 Keeper 之后集群的会话管理更轻量故障恢复速度也更快。我个人建议新集群直接上 Keeper老集群在升级时顺便把 ZooKeeper 换掉这一步的收益比升版本本身还大。2. 从旧版本升级到 25.12路径规划和部署实操2.1 老版本升级先看这几处兼容性变化先泼一盆冷水ClickHouse 不支持跨大版本直接升级。官方推荐的是逐版本升级21.8 到 25.12 这个跨度正常路径是 21.8 → 22.8 → 23.8 → 24.8 → 25.12 这样逐级走或者至少隔一个大版本升级一次并测试。为什么这么麻烦因为 ClickHouse 的元数据和数据格式在不同大版本间会有不兼容的变更直接跳版本升级轻则配置失效重则数据目录无法识别。25.12 里有一个非常关键的默认行为变化merge 的算法和并发配置。以前merge_tree的默认max_part_merging_with_background_tasks是 625.12 调整了后台 merge 的调度权重默认值变得激进了一些。这个改动对于一直保持默认配置的用户升级后会发现 merge 速度变快了但如果你的磁盘 IO 本来就紧张切换后可能出现 merge 跟不上写入的情况。升级前最好先看一下磁盘 IO 的余量。另一个是异步插入async_insert的默认开启倾向。25.12 对async_insert的吞吐做了大幅优化官方在 release notes 里也暗示这个特性已经接近“生产环境默认开启”的成熟度。如果你的写入链路已经接入了 Flink 或者其他流式写入工具升级后可以考虑把async_insert打开吞吐量提升非常明显同时不影响查询的实时性。还有配置文件的格式校验变严了。升级到 25.12 后config.xml 里如果存在未使用的配置项或者非法参数启动时会直接报错而不是像以前那样忽略掉。这个变化坑了不少人升级前建议用clickhouse-server --config-check提前检查一遍。2.2 实际部署Linux、Windows 和离线安装的差异现在网上关于部署的搜索还挺多的特别是 Linux 部署 21.8.15.7、Windows 下载安装、银河麒麟离线安装包这些关键词。这里我统一说一下。Linux 部署是最主流的路径。官方仓库提供了 apt/yum 源直接apt-get install clickhouse-server clickhouse-client就能装。但如果你是为了升级到 25.12更推荐直接用官方deb或rpm包手动安装避免源里的版本滞后。安装后记得修改/etc/clickhouse-server/config.xml里的listen_host默认只监听本机 127.0.0.1不开远程访问的话后面所有客户端都连不上。Windows 环境官方其实是不推荐在生产环境跑 ClickHouse 的。Windows 上只能通过 WSL 或者 Docker Desktop 运行性能会有损耗。如果你只是在本地学习测试我建议直接下载官方发布的 Docker 镜像一条docker run -d --name ch -p 8123:8123 clickhouse/clickhouse-server:25.12就能起来比折腾 Windows 原生版本省事得多。银河麒麟这类国产化环境的离线安装需要先在一台能联网的机器上下载好所有依赖包然后拷贝到目标机器上安装。ClickHouse 25.12 的 rpm 包依赖libstdc.so.6和一些基础库离线环境最容易缺的就是这些底层依赖。多提一嘴如果是在老的 CPU 上装 25.12要留意是否支持sse4.2指令集ClickHouse 是强制要求这个指令集的CPU 太老直接起不来。2.3 升级前后必做的检查清单我把这次升级踩过的坑整理成一张清单照着做基本不会翻车检查项操作说明我的经验版本路径确认当前版本规划逐级升级路径21.8 → 25.12 跨度太大建议分三级走配置检查clickhouse-server --config-check25.12 对非法配置项直接报错提前排查数据备份至少备份 metadata 和 system.backup 相关目录升级前必须做别偷懒磁盘 IO查看 merge 磁盘压力新版 merge 调度更激进IO 不足先扩容Keeper/ZooKeeper决策是否迁移 Keeper强烈建议新版 Keeper 兼容性已经很稳定默认用户密码确认default用户不是空密码新版对空密码的警告越来越严格注意升级期间建议暂停所有写入任务等system.migrations表里没有 pending 记录后再恢复业务。虽然 ClickHouse 支持滚动升级但迁移期间写入行为跟平时不同稳妥起见还是停写半小时。3. Flink 同步 MySQL 到 ClickHouse版本差异怎么适配3.1 流式写入的正确打开方式Flink 同步 MySQL 到 ClickHouse 这个场景现在基本是数据实时数仓的标配了。方式无非两种一是通过 Flink CDC 直接解析 binlog 写入二是把 Kafka 作为中间缓冲层再接 Flink 消费。不管哪种方式写入端最终都会落到 ClickHouse 的 insert 上。25.12 对这批流式写入场景的适配最大的价值在async_insert的完善。以前用 Flink 的 JDBC sink 写 ClickHouse最怕的就是频繁的小批量 insert 拖垮写入性能。如果一个窗口几千行就 flush 一次ClickHouse 每个批次都要生成一个 data partpart 数量一多merge 压力就大甚至可能触发 Too many parts 的报错。开了async_insert之后ClickHouse 会在内存里缓冲一批数据再落盘把原来几百个小 part 合并成几个大 part写入吞吐能翻几倍。我测过一组数据Flink 端每秒写入 5 万条记录每条约 200 字节不开async_insert时 CPU 占用很高parts 数涨得飞快开启async_insert1async_insert_max_data_size设为 10MB 之后写入延迟基本没变化parts 增长速度降到原来的四分之一。这里要注意async_insert有一个微小的数据可见性窗口你刚刚写入的数据在几千毫秒内可能查不到这个在实时性要求特别高的场景要想清楚。3.2 类型映射和时区问题升级后要注意Flink 同步 MySQL 时最常见的坑是类型映射。25.12 对DateTime64的精度处理更严格了。MySQL 的datetime(3)映射到 ClickHouse 的DateTime64(3)没问题但如果你在 Flink 里把TIMESTAMP类型直接映射成了DateTime精度 0升级后写入高精度时间戳会有数据截断的警告。建议在 Flink 的连接器配置里显式指定 ClickHouse 的DateTime64类型避免丢精度。另外一个隐蔽的问题是时区。ClickHouse 的客户端连接参数里有个session_timezone如果同步链路里设置了不同时区升级到 25.12 后时间字段的解析行为会跟以前略有不同。我的建议是所有节点统一使用UTC作为 ClickHouse 的服务器时区业务展示层再去转换这样最省心。3.3 同步链路的常见写入故障排查从 21.8 时代就有的老毛病在 25.12 下依然容易出现这里集中列一下Too many partitions如果你的同步表按天分区但 Flink 写入的数据乱序或者有历史数据重新同步很容易在同一时刻产生超过 100 个分区。25.12 把该限制仍然是默认 100超了会拒绝写入。解决方式是增大max_partitions_per_insert_block或者在 Flink 端严格按分区键分发。Too many parts写入过快、merge 跟不上时会触发。25.12 的 merge 调度优化了但磁盘 IO 不够时照样会报。解决思路是先扩大单批写入数据量让 part 数量少一点如果还报就临时调大max_part_merging_with_background_tasks让 merge 跑得更积极。慢查询拖垮写入同步任务往往和查询任务共用同一个集群一个超大GROUP BY查询可能吃光 CPU导致写入延迟飙升。建议把写入和查询放到不同的资源池用SETTINGS max_threads限制查询并发。4. ClickHouse 和 Doris 怎么选看完 25.12 再做决定4.1 核心差异不在“谁快”而在“你拿它干什么”很多人在做技术选型时会搜“doris 和 clickhouse 的选型”然后看到一堆 benchmark 对比。我的观点是这两个系统发展到今天单条查询速度的差距已经不是主要矛盾选型的关键要看你的核心场景是“分析”还是“即席查询 明细更新”。ClickHouse 的强项在大宽表、超大表的多维聚合、深度明细查询尤其是单表几亿行级别它的扫描和聚合速度是业界标杆。25.12 在内存和运行时过滤方面的优化让它在复杂 JOIN 场景下也更能打了。但要记住ClickHouse 始终是OLAP 优先的设计更新删除的能力虽然一直在完善但绝不建议把它当中等更新频率的业务库用。Doris 的路子不太一样它的跨大版本迭代一直在搞“湖仓一体”和“高并发点查”写入链路对高频更新更友好主键模型下 upsert 能力比 ClickHouse 顺手得多。如果你有大量明细数据需要经常更新、删除再查询Doris 的体验明显更好。4.2 从实际业务场景出发的判断框架场景优先选择理由简述用户行为日志聚合、亿级大宽表分析ClickHouse单表扫描性能强25.12 优化后内存效率更高实时数仓层、DWD 明细层高频改写Doris主键模型支持更高效 upsert多表关联查询为主表之间关系复杂Doris优化器更成熟大规模 JOIN 更稳定超大规模分布式查询、高并发大查询ClickHouse分布式架构更纯粹算子下推彻底需要高并发点查、支持小查询Doris向量化点查和并发控制更强有个特别值得说的场景如果你已经有一套 Flink 同步 MySQL 的链路且目标表是几十亿的明细大表我依然推荐 ClickHouse因为这种全量明细 周期聚合的形态最适合它。而如果你的业务里同步过来的数据还要频繁修改状态比如订单表状态从“待支付”改成“已支付”那 Doris 的主键模型会比 ClickHouse 的轻量更新舒服得多。4.3 25.12 对选型决策的影响25.12 的发布让 ClickHouse 在多表 JOIN 和写入稳定性这两个原本相对薄弱的环节上又补齐了一截。以前我会跟别人说“ClickHouse 不适合复杂 JOIN”现在这个结论要修正了中小规模的数据量单表百万到千万行多表 JOIN25.12 的表现已经完全够用。但是如果你选择 Doris 的原因不只是“JOIN 好”而是看重它的多租户资源隔离和事务能力那 25.12 并不会改变这个结论。选型不要只看版本更新要看你在未来一年内需要什么。5. 常见问题排查与升级避坑记录5.1 升级后服务起不来先看这四种情况升级到 25.12 之后遇到服务起不来的情况大概率是这几个原因数据目录格式不匹配ClickHouse 的磁盘数据格式跨大版本升级时可能需要转换。启动日志里如果提示Unsupported metadata version说明你跳版本跳太多了得回头按路径升级。配置文件有非法参数新版对 config.xml 和 users.xml 的校验变严以前忽略的未知参数现在会直接导致启动失败。排查方法很简单clickhouse-server --config-check会提示具体是哪一行。系统表损坏升级过程中如果机器突然断电可能导致system下的元数据表损坏。这种情况下一般得用clickhouse-local把数据导出来再重建系统表。依赖库版本不对Linux 上最容易出现libicudata.so找不到这类问题。建议升级前用官方推荐的发行版对应包不要混用不同源编译的版本。5.2 查询变慢的排查思路升级后如果发现某些查询反而变慢了先别急着回滚版本。25.12 的查询计划生成逻辑跟以前不同可能是新的优化器做出了次优选择。我的排查习惯是先对比新旧版本的EXPLAIN输出看看执行计划里 JOIN 顺序、聚合下推有没有变化。检查是否为allow_experimental_analyzer的设置差异25.12 默认启用的分析器链路更长了如果老查询里写了不规范的类型转换性能可能受影响。用system.query_log看查询的时间和内存数据定位慢在扫描、聚合还是传输阶段。我记得有一次升级后一条每天跑的报告 SQL 从 2 秒变成 15 秒怎么都找不到原因。后来发现是表上的TTL策略在升级后默认变成强制清理查询时正好撞上了 TTL 清理的 merge导致 IO 被占满。解决办法是给 TTL 清理单独设置线程池优先级错开高峰期。5.3 我给所有升级用户的最后建议25.12 是我用过的 ClickHouse 版本里综合体验比较均衡的一个。它没有那种“必须立刻升级”的杀手级功能但它在内存效率、存储稳定性、异步写入这几个直接影响日常维护体验的点上都往前迈了一步。如果你还在 21.8、22.x 这种去几年积累了大量技术债的版本上我建议在下一个季度窗口里规划升级。升级路径虽然麻烦但换来的是更稳定的内存控制、更快的 merge以及跟 Flink 等生态组件更默契的配合。最后分享一个小经验无论你升级什么版本永远先在一个副节点上跑一周的业务流量再推全集群。ClickHouse 的滚动升级能力很强但生产环境的多样性远超测试环境。25.12 再稳定也得先让副节点替你踩完坑再全面切换。这个习惯救了我好几次希望你也能用上。
返回列表