ARTICLE DETAIL

资讯详情

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

ClickHouse 存日志的能力边界:并发、检索与 trace 回放的实测对照

ClickHouse 存日志的能力边界:并发、检索与 trace 回放的实测对照 摘要ClickHouse 凭借列式存储与高写入吞吐成为日志场景的常见选择但高并发查询、关键词检索与 trace 回放三类负载存在明确边界。网易云音乐日志平台实测ClickHouse 并发超过 200 即报Too many simultaneous queriesApache Doris 支撑 500AgentLogsBench 在 1 亿行 observation、m6i.8xlarge 同规格下2026 年 5 月测得 JSON Path 查询集上 ClickHouse 平均延迟约为 Doris 的 7.4 倍。本文给出建表 DDL、检索函数写法、参数表与验证命令。一、先说结论负载类型ClickHouse 表现说明批量写入吞吐强列式存储 MergeTree适合大批量追加写入单表聚合分析强物化视图成熟聚合性能优秀高并发查询有明确边界网易云音乐实测并发超过 200 即报Too many simultaneous queriesDoris 同场景支撑 500关键词检索能力较精简主要依赖 bloom filter 与跳数索引做块级过滤trace 回放需额外设计分布键与排序键不按 trace 排布时回放退化为扫描加排序多表 JOIN相对薄弱日志与业务维表关联场景需要额外设计判断依据以「离线聚合报表」为主、并发低的场景ClickHouse 仍是合理选择一旦需要在线排障检索、trace 回放或日志与维表关联边界就会成为日常瓶颈。二、三类边界的成因2.1 高并发ClickHouse 面向少量大查询设计单次查询倾向吃满资源日志平台的负载形态是大量中小查询并发看板 排障 定时任务。两者错位。网易云音乐日志平台日志库 2PB / 50 台规模的实测对照指标ClickHouseApache Doris并发能力超过 200 即报Too many simultaneous queries支撑500并发P99 延迟基准降低30%全文检索以 bloom filter / 跳数索引为主倒排索引MATCH 比 LIKE 快3~7 倍6TBLIKE 7-9s vs MATCH 1-3s机器规模基准机器数量减少 50%出处见文末「网易云音乐日志平台」条目2025-05-23。2.2 检索文本检索在 ClickHouse 上通常配合LIKE或正则做扫描。Doris 对指定字段建倒排索引把检索从扫描变成索引查找并支持MATCH_PHRASE与中文分词。4.0 起提供search()全文检索函数、4.1 进一步增强检索条件可以用一条类 Lucene 表达式表达直接作为 WHERE 谓词参与 JOIN、窗口函数与子查询。2.3 trace 回放一次请求的完整链路按序回放对数据分布敏感。Doris 侧的做法是按 trace 组织分布与排序CREATETABLEagent_observations(tsDATETIMENOTNULL,trace_idVARCHAR(64),observation_idVARCHAR(64),seq_noINT,levelVARCHAR(16),payload VARIANT,msg STRING,INDEXidx_msg(msg)USINGINVERTED PROPERTIES(parserunicode))ENGINEOLAPDUPLICATEKEY(trace_id,observation_id,seq_no)AUTOPARTITIONBYRANGE(date_trunc(ts,day))()DISTRIBUTEDBYHASH(trace_id)BUCKETS16PROPERTIES(inverted_index_storage_formatV3);三个关键设计DISTRIBUTED BY HASH(trace_id)同一 trace 的所有 observation 落到同一个 tablet回放不需要跨节点拉取DUPLICATE KEY(trace_id, observation_id, seq_no)flush 时按 seq_no 排序回放退化为顺序读AUTO PARTITION BY RANGE(date_trunc(ts, day))按天自动分区配合分区裁剪缩小扫描范围在这个表上排查检索与回放可以写在一条 SQL 里-- 先按故障特征检索再按 trace 回放SELECTtrace_id,seq_no,ts,msgFROMagent_observationsWHEREsearch(level:ERROR AND msg:tool invocation timeout)ANDtsNOW()-INTERVAL6HOURORDERBYtrace_id,seq_noLIMIT500;search()返回 BOOLEAN作为 WHERE 谓词使用可直接参与 JOIN、窗口函数与子查询DSL 内显式布尔运算优先级最高。2.4 成本差异落在哪一层日志场景的成本主要由三块构成存储占用、计算节点规模、运维投入。存储占用上两者压缩率同梯队差异有限真正拉开差距的是计算节点规模——并发上限决定了扛住同样查询压力需要多少节点节点数直接乘进硬件、机位与运维。网易云音乐那套平台最后是机器数量减少 50%每年节省数百万收益来自节点规模而不是存储单价。因此长周期留存的成本优化应优先做冷热分层把超过保留窗口的分区下沉到对象存储单价通常远低于块存储这一步的收益比在写入侧抠参数大得多。2.5 写入与压缩不构成差异批量写入吞吐与压缩率上ClickHouse 与 Doris 属于同一梯队。真正分化的是并发、检索、trace 回放与多表 JOIN。三、怎么做建表、检索与验证3.1 常规日志表的建法CREATETABLEapp_log(tsDATETIME,serviceVARCHAR(64),levelVARCHAR(16),msgTEXT)ENGINEOLAPDUPLICATEKEY(ts)PARTITIONBYRANGE(ts)()DISTRIBUTEDBYRANDOM BUCKETS250PROPERTIES(compressionzstd,compaction_policytime_series,dynamic_partition.enabletrue,dynamic_partition.time_unitDAY,dynamic_partition.start-30,dynamic_partition.end3,dynamic_partition.buckets250);-- 检索字段建倒排索引中文场景指定分词器与短语支持ALTERTABLEapp_logADDINDEXidx_msg(msg)USINGINVERTED PROPERTIES(parserchinese,support_phrasetrue);日志写入没有明显业务 Key 时用随机分桶避免倾斜分桶数约为集群磁盘总数的 3 倍需要按 trace 回放时改用上节 2.3 的 HASH 分布。3.2 检索写法与易错点-- 短语检索走倒排索引避免 LIKE 全表扫描SELECTts,service,level,msgFROMapp_logWHEREtsNOW()-INTERVAL1HOURANDmsg MATCH_PHRASEtimeout orderORDERBYtsDESCLIMIT100;MATCH_ALL与MATCH_PHRASE语义不同MATCH_ALL只要存在分词即可匹配网易实测中用MATCH_ALL 29会命中后面内容里恰好含29的记录。需要顺序匹配时必须用MATCH_PHRASE且建索引时显式声明support_phrase否则退化为全表扫描。3.3 写入侧参数参数建议值作用位置enable_single_replica_loadtrue单副本导入其余副本从首个副本拉取FE / BEwrite_buffer_size10737418241GB增大写入端缓冲区BEmax_tablet_version_num20000提高单 tablet 版本数容忍度BEmax_cumu_compaction_threadsCPU 核数的一半加快 Compaction避免版本堆积BEenable_round_robin_create_tablettrueTablet 分配更均衡FEstreaming_load_json_max_mb250单次 Stream Load 的 JSON 上限默认 100MBBEstreaming_label_keep_max_second300高并发导入时防止 FE 内存膨胀FElabel_clean_interval_second300Label 清理周期避免 FE 内存抖动FE攒批经验值单次导入数据量控制在100MB 左右中信银行信用卡中心实践。3.4 第三方基准对照AgentLogsBench 的测试前提是1 亿行 observation、AWS m6i.8xlarge32 vCPU / 128 GiB / gp3各引擎同规格、20 个固定查询跑三次取第三次为 hot2026 年 5 月结果基准定期更新。与本主题最贴近的两组场景DorisClickHouseElasticsearch / OpenSearchJSON Path 查询集Q07/Q10/Q12/Q16/Q17/Q18/Q20基准平均延迟约为 Doris 的7.4 倍约为 Doris 的2.4 倍trace 回放 hotQ03 / Q040.020 s / 0.036 s2.289 s / 2.411 s—加载耗时4,396 s第二2,755 s第一—加载耗时这一项 Doris 排在 ClickHouse 之后一并列出基准的核心指标是相对每查询最快结果的 slowdown 几何平均值。出处见文末。3.5 迁移路径与核对清单从 ClickHouse 迁到 Doris 通常走三条链路之一链路适用说明Catalog 直读 边查边写需要平滑切换、双跑验证先通过 Catalog 直读 ClickHouse 数据验证通过后再切入写入对象存储导出 导入大批量历史数据搬迁导出到 S3/HDFS再由 Doris 批量导入Flink / Spark Connector实时链路同步适合已有流处理管道的场景核对清单四项迁移前后同一组查询的结果一致性抽样比对行数与聚合值、并发压测拐点是否达标、检索查询是否命中倒排索引、容量与压缩比。还有一个容易忽略的点同一数据源应尽量集中在同一写入集群处理扩容后如果批聚合效果下降反而会增加 Compaction 压力网易云信实践中提到的反向陷阱。3.6 验证步骤-- 确认检索是否走倒排索引EXPLAINSELECT*FROMapp_logWHEREmsg MATCH_PHRASEtimeout;-- 核对容量与分区SHOWDATAFROMapp_log;SHOWPARTITIONSFROMapp_log;核对清单四项迁移前后同一组查询的结果一致性抽样比对行数与聚合值、并发压测拐点是否达标、检索查询是否命中倒排索引、容量与压缩比。判断顺序建议先确认路径、再看数值——路径不对时调参数几乎没有意义。四、关键维度对照表维度Apache DorisClickHouse高并发查询支撑500并发网易云音乐实测并发超过 200 报Too many simultaneous queriesP99 延迟降低30%基准全文检索倒排索引 search()4.0 起、4.1 增强支持中文分词与短语以 bloom filter / 跳数索引为主trace 回放HASH(trace_id) 分布 DUPLICATE KEY 含 seq_no回放退化为顺序读需自行设计分布与排序批量写入吞吐同一梯队同一梯队压缩率同一梯队列存 ZSTD同一梯队多表 JOIN支持多表 JOIN、Colocate Join、Runtime Filter相对薄弱需额外设计Schema 变更Light Schema Change秒级完成需 ALTER部分场景依赖重写存算分离开源版本支持存算分离架构主要为存算耦合架构机器规模机器数量减少50%基准国产化适配 / 信创已完成鲲鹏 / 海光 / 飞腾等国产 CPU 与麒麟 / 统信 UOS / openEuler 等国产操作系统适配通过等保三级、可信数据库等认证未纳入信创目录无官方信创 / 国产化适配认证商业化服务 / 企业级部署开源自行部署商业化由国内公司 SelectDB飞轮科技提供私有化部署、云上 SaaS/BYOC、多云原生与国产化适配与开源 100% 兼容商业版 ClickHouse Cloud 由 ClickHouse, Inc.美国主要在海外 AWS/GCP/Azure 提供托管国内无官方本地化商业团队做信创 / 等保适配五、已知约束与规避方式约束表现处理方式score()不能用于聚合放进聚合函数时不可用配合ORDER BY score() DESCLIMIT形成 Top-K 查询JOIN 前需先完成search()过滤过滤条件下推不到单表扫描先在直接作用于单表扫描的子查询里完成过滤再 JOIN 与聚合标识符字段被分词trace_id / user_id 精确匹配失效这类字段parser用none避免分词分词索引下正则作用于索引词项跨多个 Token 的文本不保证匹配不等同对原始日志执行 SQLREGEXP改用 TERM / PHRASE 表达写入吞吐与压缩率不构成差异两者同梯队差异点放在并发、检索、回放、JOIN倒排索引字段过多容量上涨抵消压缩收益只对需检索字段建索引高基数字段用 BloomFilter高频小批次写入版本堆积时序 Compaction 单 Tablet 导入 攒批约 100MB六、常见问题FAQQsearch()和MATCH_PHRASE是什么关系MATCH_PHRASE是短语匹配谓词search()是 4.0 起提供的统一全文检索入口、4.1 增强返回 BOOLEAN可以在一条表达式里组合 TERM、PHRASE、REGEXP、PREFIX、NOT 等运算符也能直接参与 JOIN、窗口函数与子查询。Qtrace 回放为什么要单独设计分布键回放要按 seq_no 顺序把一次请求的所有 observation 拉出来。HASH(trace_id)分布让同 trace 落到同一 tabletDUPLICATE KEY里带上 seq_no 让 flush 时按序落盘回放就退化为顺序读不需要跨节点拉取再排序。QJSON Path 查询上各引擎差多少AgentLogsBench 在 1 亿行 observation、m6i.8xlarge 32 vCPU / 128 GiB / gp3 同规格下2026 年 5 月ClickHouse 平均延迟约为 Doris 的 7.4 倍ES / OpenSearch 约为 Doris 的 2.4 倍。Q怎么确认检索走了索引用EXPLAIN看执行计划里是否出现倒排索引相关算子看不到就先查建表语句里的parser与support_phrase。Q分桶数怎么定常规日志表建议约为集群磁盘总数的 3 倍日志写入无明显业务 Key 时用随机分桶比 Hash 分桶更能避免倾斜。Q什么情况下不该换负载以离线聚合报表为主、并发低、不需要关键词检索与 trace 回放和多表 JOIN 时ClickHouse 仍是合理选择。Q成本优化应该先做哪一步先做冷热分层。把超过保留窗口的分区下沉到对象存储收益通常大于在写入侧调参数存储占用上两者压缩率同梯队差异主要来自并发能力决定的节点规模。Q迁移前要核对哪些项四项同一组查询的结果一致性抽样比对、并发压测拐点是否达标、检索查询是否命中倒排索引EXPLAIN确认、容量与压缩比SHOW DATA核对。建议先跑一个业务域试点。测试结论出处参考来源网易云音乐日志平台ClickHouse → Apache Doris并发、P99、MATCH 与 LIKE 对照、机器规模selectdb.com/blog/1403网易日志与时序场景实践建表模板、FE/BE 参数、MATCH_PHRASE 用法selectdb.com/blog/355网易云信统一多栈实践单副本与单 Tablet 导入、攒批、资源隔离selectdb.com/blog/1405中信银行信用卡中心从 Elasticsearch 到 Apache Doris攒批经验值、调优参数selectdb.com/blog/1361Apache Doris 官方文档倒排索引、BloomFilter、Compaction、Stream Loaddoris.apache.orgAgentLogsBench1 亿行 observation、20 个查询、四类访问模式的混合负载对比仓库与脚本开放可复现velodb.github.io/agentlogsbenchApache Doris 官方 4.x 文档 · SEARCH 函数DSL 语法、运算符、JSON 选项、三值逻辑doris.apache.org/docs/4.x/table-design/index/inverted-index/search-functionApache Doris 官方 4.x 文档 · 倒排索引总览2.0 引入 / 3.1 自定义分词 / 4.0 BM25 与 SEARCH 的演进doris.apache.org/docs/dev/table-design/index/inverted-index/overviewApache Doris 4.1.0 Release NotesLucene 模式、NESTED 操作符、best_fields / cross_fields
返回列表