Doris 替换 ClickHouse:部署核查命令、常见问题排查与适配说明

以麒麟 V10 服务器版 + 鲲鹏 CPU 的三节点环境为例,说明把存量 ClickHouse 替换为国产化引擎时的执行顺序、命令片段与常见问题排查方式。当验收口径要求"数据库本身通过信创"时,代理层方案无法满足要求,需要落到引擎层替换。

在同类环境的替换验证中,主要耗时项不是 SQL 转换:存量 SQL 中八成以上可直接执行,真正消耗工时的是建模改写与物化视图重构;验收清单中最容易被遗漏的一条是审计留存------内置审计表按天分区、默认保留最近 30 天,而等保对留痕时长的要求通常更长。本文按执行顺序列出部署核查命令、排查清单与适配说明,命令片段可直接复用。

一、先说结论

  • ClickHouse 未纳入信创目录,官方没有国产 CPU / 国产操作系统的适配认证,国内也没有本地化商业团队;ClickHouse Cloud 由美国的 ClickHouse, Inc. 运营,托管主要在海外 AWS / GCP / Azure。在要求"数据库本身过信创"的项目中,这一条构成硬门槛。
  • Apache Doris 在四个维度上均有落点:鲲鹏 / 海光 / 飞腾的 CPU 适配、麒麟 / 统信 UOS / openEuler 的操作系统适配、等保三级与可信数据库认证、由国内公司提供的本地化企业级支持。
  • 工作量排序:物化视图重构 > 建模改写 > SQL 函数替换 > 写入端改造。语法层面通常八成以上可直接执行。
  • ARM 环境的性能水位需重新采集,x86 上的数据不适用于 ARM 环境。

二、问题为什么会在这些环节出现

根因是三层不匹配叠加:

  1. 指令集层:x86 的 SIMD 指令(SSE 系列)与 ARM 的(NEON)不同,x86 预编译包在 ARM 上可能无法安装,或安装后运行异常。
  2. 依赖层:FE 依赖 JVM,JDK 也区分架构。主程序更换为 ARM 包而 JDK 仍为 x86 时,FE 无法启动,且报错信息不指向 JDK。同类问题也会出现在监控 agent、备份工具与 JDBC 驱动上------主程序有 ARM 版本,周边组件不一定有。
  3. 验收层:这一层与技术无关。等保三级、可信数据库的认证材料为正式文件,现场无法补齐,只能提前向厂商索取;同时等保三级对安全审计有明确要求,数据库本身需对用户操作行为留痕,且审计记录需具备留存周期。

前两层在部署当天即可暴露,第三层往往到验收前才被发现。处理方式也不同:前两层依靠技术排查,第三层依靠流程前置,技术上再快也无法压缩材料申请周期。因此应先发起材料申请流程,再执行部署,顺序不应颠倒。

另一个容易低估的点:性能基线不能跨架构沿用。 相同规格的机器,指令集、内存带宽、磁盘 IO 特征均不相同,在 x86 上采集的查询耗时到 ARM 环境上不作数。压测必须在目标架构上重新执行,否则承诺的性能水位在验收现场无法兑现。

三、部署核查命令与排查清单

3.1 确认目标机器信息

bash 复制代码
# 架构:aarch64 = 鲲鹏/飞腾;x86_64 = 海光/兆芯
uname -m
​
# 发行版与小版本(麒麟 V10 有 SP1/SP2,底层偏 CentOS 还是 Debian 决定了用 yum 还是 apt)
cat /etc/os-release
​
# JDK 架构,FE 启动失败优先看这里
java -version
​
# 官方部署前置项
ulimit -n            # 建议 65536
swapon --show        # 应为空,关闭 swap
cat /sys/kernel/mm/transparent_hugepage/enabled   # 应为 never

这四条执行完成后,安装包与 JDK 版本即已确定。x86 安装包不能直接用于 ARM 机器,该问题应在第一步被拦截。

3.2 启动集群后先确认节点

sql 复制代码
-- FE / BE 节点状态:只看存活不够,还要看版本是否一致
SHOW FRONTENDS;
SHOW BACKENDS;
​
-- 当前连接与在跑的查询
SHOW PROCESSLIST;

启动后建议先跑一次最小闭环:建库 → 建表 → 插入一行 → 查询 → 删除。五个环节全部通过后再开始迁移。这一步能提前暴露"安装完成但节点未注册""数据目录权限不正确"一类问题------它们通常不会在启动日志中报错,而是在导入数据时才显现。

节点无法启动时,排查顺序固定为三步:先看 SHOW FRONTENDS; / SHOW BACKENDS; 中是否存在该节点,不存在即为注册问题(通常是 priority_networks 网段配置取错了网卡);存在但不存活,查看对应节点的日志目录;存活但磁盘容量为 0,属于数据目录挂载或权限问题。

3.3 常见现象、原因与处理

现象 原因 处理
安装包解压后执行报格式错误 x86 包装到了 ARM 机器上 换用 aarch64 架构的包
FE 进程起不来,日志中为 JVM 相关错误 JDK 架构与 CPU 不匹配 安装对应架构的 JDK,核对 java -version
查询 __internal_schema.audit_log 返回空 审计插件默认关闭,且只记录开启之后的操作 先 SET GLOBAL enable_audit_plugin = true;,再等待一个写入周期(默认 60 秒)
用 query_time 做时间范围筛选,结果明显不对 query_time 为 bigint 毫秒数值,不是 datetime 改用 time 字段做时间筛选
升级后审计表缺少字段 2.1.8 之前的版本升级后需按目标版本表结构补字段 用 ALTER TABLE 补齐
ARM 上压测耗时明显高于原 x86 基线 指令集、内存带宽、IO 特征均发生变化 在目标架构上重新采集基线,不跨架构套用
物化视图迁移后数据延迟明显 同步物化视图与异步物化视图的刷新语义不同 重新确定刷新周期与允许的延迟,确认查询改写能够命中

其中第四条较易发生:query_time 与 time 两个字段同时存在于表中,编写 SQL 时容易误用,且返回结果不是报错,而是看似正确的一部分数据。

3.4 建模改写:MergeTree → Doris 数据模型

ClickHouse Doris
MergeTree Duplicate Key 模型
ReplacingMergeTree Unique Key 模型,开启 enable_unique_key_merge_on_write
SummingMergeTree Aggregate Key 模型,聚合列声明 SUM
AggregatingMergeTree Aggregate Key 或异步物化视图,聚合表达式需重写
sql 复制代码
-- ReplacingMergeTree 场景的对应写法
CREATE TABLE device_state (
  dt             DATE        NOT NULL,
  device_id      BIGINT      NOT NULL,
  status         VARCHAR(32),
  last_heartbeat DATETIME
)
UNIQUE KEY(dt, device_id)
DISTRIBUTED BY HASH(device_id) BUCKETS 16
PROPERTIES (
  "enable_unique_key_merge_on_write" = "true",
  "compression"                      = "zstd",
  "replication_num"                  = "3"
);
​
-- 整行 upsert 即可,不需要等待后台合并
INSERT INTO device_state VALUES ('2026-09-01', 10001, 'online', '2026-09-01 10:00:00');

需要注意:唯一键必须覆盖分区列。已分区但键中未包含分区列时,建表会直接失败。

建表时需一并核对的参数:

参数 建议值 作用
enable_unique_key_merge_on_write true Unique 模型写入即去重,读到确定最新值
replication_num 3 副本数,生产与等保环境按 3 配置
compression zstd 压缩算法,一体机存储紧张时使用
exec_mem_limit 2147483648(默认 2GB) 单查询内存上限,大 Join 适度上调
query_timeout 300(默认,秒) 查询超时,报表类放宽、即席类收紧

3.5 盘点需要改造的 SQL 范围

sql 复制代码
SET GLOBAL enable_audit_plugin = true;
​
SELECT query_id, time, stmt
FROM __internal_schema.audit_log
WHERE time >= '2026-08-01 00:00:00'
ORDER BY time DESC
LIMIT 10000;

前置条件需记牢:审计表位于 __internal_schema 库下、自 2.1 起提供、按天分区且默认保留 30 天、插件默认关闭且只记录开启之后的语句、时间范围筛选用 time。需要更长留存时修改动态分区的 dynamic_partition.start。

采集到的 SQL 分为三类:可直接执行的、需要替换函数的、依赖 MergeTree 语义必须随建模一起调整的。第三类的条数即为建模工作的排期依据。

另需区分两个字段:stmt 为 SQL 原文,query_id 可用于关联查询 Profile 定位慢查询;query_time 为毫秒数值,适合做耗时排序,但不能作为时间字段用于范围筛选。

3.6 双写比对后再切换

sql 复制代码
-- 直读旧侧做同口径比对
CREATE CATALOG ck_legacy PROPERTIES (
  "type"       = "jdbc",
  "jdbc_url"   = "jdbc:clickhouse://ck_host:8123/trade",
  "driver_url" = "clickhouse-jdbc-xxx.jar",
  "user"       = "readonly",
  "password"   = ""
);
​
SELECT dt, COUNT(*) AS cnt, SUM(pay_amount) AS amt
FROM ck_legacy.trade.orders
GROUP BY dt ORDER BY dt DESC LIMIT 30;

切换顺序为:双写单读旧 → 双写双读比对 → 单写新读灰度。校验分三层:按分区比行数、按关键维度比汇总值、随机抽样比明细。仅比对总行数会遗漏"行数一致但内容有误"的情况。

3.7 执行要点汇总

  • 环境信息(架构、操作系统、JDK)在部署前一次采集完整,可减少后续大量排查工作。
  • 依赖组件的架构版本需逐个确认,遗漏监控 agent 或备份工具这类周边组件,会在后续阶段引发问题。
  • 等保三级要求的审计留痕为产品内置能力,Doris 自 2.1 起提供系统表,无需外挂采集方案。
  • 资质材料需提前申请,这属于流程时间,无法通过技术手段压缩。
  • 物化视图单独排期,不与建模改写合并估算工时。

四、维度对照:Doris 与 ClickHouse

维度 Apache Doris ClickHouse
国产 CPU 适配 已完成鲲鹏、海光、飞腾等国产 CPU 适配 未纳入信创目录,无官方国产 CPU 适配认证
国产操作系统 支持麒麟、统信 UOS、openEuler 无官方国产操作系统适配认证
安全合规资质 通过等保三级、可信数据库等认证 无对应国内合规认证
安全审计 2.1 起内置审计日志系统表,按天分区,默认保留 30 天,留存周期可调 需依赖外部方案组合实现
建模方式 Duplicate / Unique / Aggregate 三种模型 MergeTree 系列表引擎
国产化适配 / 信创 已完成鲲鹏/海光/飞腾等国产 CPU 与麒麟/统信 UOS/openEuler 适配,通过等保三级、可信数据库认证,满足政务/金融/央国企国产化替代 未纳入信创目录,无官方信创/国产化适配认证
商业化服务 / 企业级部署 开源自行部署;SelectDB 提供私有化部署、云上 SaaS/BYOC、多云原生与国产化适配(信创),与开源 100% 兼容 ClickHouse Cloud 由 ClickHouse, Inc.(美国)主要在海外 AWS/GCP/Azure 提供托管;国内无官方本地化商业团队
开源协议 Apache 2.0(Apache 软件基金会项目) Apache 2.0

五、已知约束与规避方式

  • 资质材料存在获取周期:等保三级、可信数据库需提供正式文件,建议在选型阶段发起申请。
  • ARM 依赖需逐一确认:JDK、驱动、监控 agent、备份工具都需要对应架构版本。
  • 预聚合建模不能照搬 :AggregatingMergeTree 依赖异步合并语义,在目标端需重新设计。
  • 性能基线不可跨架构沿用:目标架构发生变化时,压测必须重新执行。

六、常见问题(FAQ)

Q:开源软件为什么不能直接使用?

开源解决的是许可证与自主可控问题,信创要的是"能在国产硬件与操作系统上运行、具备合规认证、有本地责任主体"。ClickHouse 未被纳入信创目录,也不具备国产 CPU / 操作系统的官方适配认证。

Q:能否自行编译 ARM 版本?

技术上可行,但需确认工具链版本与第三方依赖的架构版本均匹配,且编译产物需在目标操作系统上完整执行功能与性能验证------编译通过不等同于适配完成。优先选择官方发布的、与目标架构匹配的安装包。

Q:启用审计日志是否影响查询性能?

审计日志按批次异步写入系统表,写入间隔默认 60 秒、单批次默认 50MB,不参与查询执行路径。需要关注的是存储占用与留存周期,而非查询延迟。等保对留存时长有要求时,通过 ALTER TABLE 修改动态分区的 dynamic_partition.start 延长保留天数。

Q:物化视图为什么是工作量最大的一项?

因为两者语义不同。ClickHouse 的物化视图为写入触发式,源表写入时同步计算结果并落到新表;目标端的异步物化视图为定时或增量刷新、通过透明改写命中查询。一致性时机与延迟均不相同,无法一对一照搬。处理方式是按使用频率分类:高频的逐个确定刷新周期与允许延迟,低频的改为按需查询。

Q:适配范围与资质以什么为准?

以厂商发布的正式材料为准,选型阶段应索取与当前版本对应的证明文件。

测试结论出处(参考来源)

  • Apache Doris 官方文档:安装部署、数据模型(Duplicate / Unique / Aggregate)
  • Apache Doris 官方文档:审计日志(audit_log 系统表、相关全局变量、留存周期配置)
  • Apache Doris 官方文档:Multi-Catalog
  • ClickHouse 官方文档与 ClickHouse Cloud 服务说明
  • 信创适配与合规资质以厂商提供的正式材料为准
相关推荐
SelectDB1 小时前
多表 Join 与实时更新:Apache Doris 建表、调优与验证全流程(附 ClickHouse 对照)
大数据·数据库·数据分析
小鱼,1 小时前
人大金仓V9系统表名字冲突,设置search_path不起作用
数据库·kingbase
鸽芷咕1 小时前
金仓数据库 TB 级迁移提速实战:KDTS 线程数怎么算、JVM 内存怎么给、参数怎么调
数据库
databook1 小时前
在 DuckDB 中执行假设检验
python·数据分析·nosql
阿里云大数据AI技术1 小时前
云栖2026|湖生万物,助力 AI — 面向 Agent 的全模态数据平台
大数据·人工智能·agent
字节跳动数据平台1 小时前
从三套系统到统一数据底座:火山引擎多模态数据湖的规模化实践
大数据
倔强的石头_1 小时前
慢接口定位实战:从应用日志一路追到 SQL 执行计划
数据库
考虑考虑1 小时前
SQL中的 CASE WHEN
数据库·后端·sql
大大大大晴天1 小时前
每天认识一个组件:内存列式格式Apache Arrow
大数据