信创项目的数据库验收,看的通常不是跑分,而是四件事:安装包架构对不对、操作系统有没有适配证明、合规资质齐不齐、出事之后谁兜底。这四件事里任何一件没有着落,前面做的性能测试基本白做。

本文按这四个维度给出一条能照着走完的落地路径:部署前的环境信息采集命令、部署后的适配性核查清单、ClickHouse 建模到 Doris 的映射建表 SQL、以及用审计日志盘点 SQL 改造范围的方法——Apache Doris 从 2.1 版本起提供 __internal_schema.audit_log 审计表,按天分区、默认保留最近 30 天,但审计插件默认关闭,需要显式开启之后才会开始写入。

一、先说结论

第一,ClickHouse 未纳入信创目录。 官方没有国产 CPU 与国产操作系统的适配认证,也没有国内本地化商业团队支撑等保、可信数据库这类合规工作。ClickHouse Cloud 由美国的 ClickHouse, Inc. 运营,托管服务主要落在海外 AWS / GCP / Azure 上。

第二,Doris 在四个维度上都有落点。 国产 CPU 侧完成鲲鹏、海光、飞腾适配;操作系统侧支持麒麟、统信 UOS、openEuler;资质侧通过等保三级与可信数据库认证;服务侧由国内公司提供本地化的私有化部署与长期版本维护。

第三,替换的工作量集中在建模,不在语法。 标准 SQL 通常占改造量的八成以上且可直接运行,真正的重头戏是 MergeTree 系列表引擎的重新建模和物化视图的语义重构。

第四,ARM 环境的性能基线必须重采。 指令集、内存带宽、磁盘 IO 特征都不一样,拿 x86 上的数字去承诺 ARM 上的水位,会在压测环节出事。

二、信创验收的四个卡点是怎么产生的

卡点具体核查项常见的失败形态为什么难补救
CPU 架构是否有 aarch64 / 对应架构的官方安装包拿 x86 包往鲲鹏、飞腾机器上装指令集层面(SSE 与 NEON)不兼容,装不上或跑起来崩溃
操作系统是否支持麒麟、统信 UOS、openEuler,有无适配证明能装上但没有认证材料验收环节要的是正式文件,现场补不出来
安全合规等保三级、可信数据库等认证是否齐全产品能力够,但缺少官方证明材料材料申请有周期,选型阶段就要开始走流程
责任主体是否有国内本地化团队做应急响应与长期维护原厂在海外,时差与语言都是实际障碍金融、政务场景的 SLA 条款通常无法接受纯海外支持

前两项是技术门槛,后两项才是真正的分水岭。特别是"出事谁负责"这一条,在很多项目里是一票否决项——这不是技术指标能弥补的。

另外有一项容易被漏掉:等保三级对"安全审计"有明确要求,数据库要能对用户的操作行为留痕,并且审计记录要有一定的留存周期。 这一条不只是"开个开关",它要求审计能力是产品内置的、可查询的、可留存的。下面的实操部分会给出完整的开启与留存配置步骤。

三、怎么做:部署核查与迁移落地

3.1 部署前:把环境信息采集全

# CPU 架构与型号:aarch64 对应鲲鹏/飞腾,x86_64 对应海光/兆芯
uname -m
lscpu | egrep 'Architecture|Model name|CPU\(s\)|NUMA node'
​
# 操作系统发行版与内核(麒麟 V10 / 统信 UOS / openEuler 会在这里体现)
cat /etc/os-release
uname -r
​
# 内存、NUMA 拓扑与本地盘情况(BE 对本地盘 IO 敏感)
free -g
numactl --hardware
lsblk -d -o NAME,SIZE,ROTA,MODEL
​
# FE 依赖 JVM,ARM 环境必须安装对应架构的 JDK
java -version
​
# 部署前置项:句柄数、swap、透明大页
ulimit -n
swapon --show
cat /sys/kernel/mm/transparent_hugepage/enabled

采集完之后逐项对照官方部署前置要求:句柄数建议调整到 65536,swap 关闭,透明大页关闭。这三项在很多国产操作系统镜像里是默认值偏保守的,不改会在压测阶段才暴露成莫名其妙的抖动。

JDK 这一项单独强调一次:java -version 的输出里必须能看到与 uname -m 匹配的架构标识。x86 的 JDK 跑在 ARM 机器上,FE 进程会直接起不来。

3.2 部署后:适配性核查清单

检查项命令 / 方法期望结果
FE 节点状态SHOW FRONTENDS;全部节点存活,版本与安装包一致
BE 节点状态SHOW BACKENDS;全部节点存活,磁盘容量与规划一致
架构一致性核对安装包架构与 uname -m 输出两者一致
全链路读写建库 → 建表 → 导入 → 查询 → 清理五个环节均无报错
建表参数复核SHOW CREATE TABLE <tbl>;分桶数、副本数、压缩算法与设计一致
高可用演练停掉一个 BE 后继续查询查询不中断,副本后台补齐
备份恢复演练执行一次完整备份与恢复恢复后数据完整、行数一致
性能基线用真实查询集压测达到迁移动议中承诺的水位
-- 节点状态:逐一核对存活、版本、磁盘水位
SHOW FRONTENDS;
SHOW BACKENDS;
​
-- 全链路读写验证(建库 → 建表 → 导入 → 查询 → 清理)
CREATE DATABASE IF NOT EXISTS xinchuang_probe;
USE xinchuang_probe;
​
CREATE TABLE t_probe (
  id      BIGINT NOT NULL,
  dt      DATE NOT NULL,
  amount  DECIMAL(18,2)
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 4
PROPERTIES ("replication_num" = "3");
​
INSERT INTO t_probe VALUES (1, '2026-09-01', 12.50), (2, '2026-09-01', 8.00);
SELECT dt, COUNT(*), SUM(amount) FROM t_probe GROUP BY dt;
​
SHOW PROCESSLIST;
​
SHOW CREATE TABLE t_probe;
​
DROP TABLE t_probe;

3.3 关键参数配置

参数建议值作用适用场景
enable_audit_plugintrue(默认 false)开启审计日志写入 __internal_schema.audit_log等保审计要求、迁移前 SQL 盘点
audit_plugin_max_batch_interval_sec60(默认,秒)审计表最大写入间隔需要近实时留痕时下调
audit_plugin_max_sql_length4096(默认)审计表记录的 SQL 最大长度超长 SQL 需要上调才能完整留痕
enable_unique_key_merge_on_writetrueUnique 模型写入时即去重,读到确定最新值ReplacingMergeTree 迁移场景
replication_num3表副本数生产环境高可用与等保要求
compressionzstd压缩算法存储容量紧张的一体机环境
exec_mem_limit2147483648(默认 2GB)单个查询的内存上限大表 Join 场景适度上调
query_timeout300(默认,秒)查询超时时间报表类放宽、即席查询收紧

两个容易被忽略的点:审计相关的三个参数都是全局变量,用 SET GLOBAL 修改;audit_plugin_max_sql_length 如果偏小,超长 SQL 会被截断,盘点改造范围时会看不全。

3.4 建模映射:ClickHouse 表引擎到 Doris 的改写

ClickHouse 建模Doris 对应方式改写要点
SummingMergeTreeAggregate Key 模型(SUM 聚合列)语义直接对齐,聚合列建表时声明聚合函数
AggregatingMergeTree + -State 函数Aggregate Key 模型或异步物化视图聚合表达式需要按目标端函数重写
ReplacingMergeTreeUnique Key 模型 + enable_unique_key_merge_on_write写入即去重,不依赖后台合并
CollapsingMergeTreeUnique Key 模型 + 删除标记列用写入覆盖表达删除语义
同步物化视图(写入触发)Rollup 或异步物化视图两者语义不同,需重新评估刷新策略
数组展开 arrayJoinexplode 配合 Lateral View按所用版本确认语法
字典 dictGet维表 Join 或直接冗余维表列目标端可直接 Join,通常无需字典

SummingMergeTree / AggregatingMergeTree 这类预聚合场景为例,改写后的建表语句如下:

-- ClickHouse 预聚合场景在 Doris 中的对应写法
-- 聚合列在建表时声明聚合函数,导入即完成聚合
CREATE TABLE dws_trade_agg (
  dt           DATE           NOT NULL,
  merchant_id  BIGINT         NOT NULL,
  city_code    VARCHAR(16)    NOT NULL,
  order_cnt    BIGINT         SUM,
  pay_amount   DECIMAL(18,2)  SUM
)
AGGREGATE KEY(dt, merchant_id, city_code)
PARTITION BY RANGE(dt) ()
DISTRIBUTED BY HASH(merchant_id) BUCKETS 32
PROPERTIES (
  "dynamic_partition.enable"    = "true",
  "dynamic_partition.time_unit" = "DAY",
  "dynamic_partition.start"     = "-90",
  "dynamic_partition.end"       = "3",
  "dynamic_partition.prefix"    = "p",
  "dynamic_partition.buckets"   = "32",
  "compression"                 = "zstd",
  "replication_num"             = "3"
);
​
-- 写入侧只需要按原始粒度插入,聚合由引擎完成
INSERT INTO dws_trade_agg (dt, merchant_id, city_code, order_cnt, pay_amount)
VALUES ('2026-09-01', 88001, '010', 3, 259.00);

动态分区这块要提前规划:start 决定历史分区保留多少天,如果审计或历史回溯要求的时间跨度更长,这一项要在建表时就定好,事后改分区范围只能覆盖改动之后的数据。

3.5 怎么验证适配真的成立:三步演练

第一步,架构一致性复核。 核对安装包标识的架构与 uname -mjava -version 三者输出一致。这一步五分钟能做完,但漏掉它会让后面所有排查都失去方向。

第二步,高可用演练。 手动停掉一个 BE 节点,观察查询是否中断、SHOW BACKENDS; 中该节点是否标记为下线、副本是否在后台自动补齐。

第三步,性能基线压测。 用真实查询集而不是合成查询,逐条记录耗时:

# 用真实查询集打基线,逐条记录毫秒耗时
# 注意:ARM 环境不能直接沿用 x86 上采集的水位
for f in ./queries/*.sql; do
  start=$(date +%s%N)
  mysql -h fe_host -P 9030 -u bench -D bench_db < "$f" > /dev/null
  end=$(date +%s%N)
  echo "$f, $(( (end - start) / 1000000 )) ms"
done

三步都通过,才能说明这套环境上的适配是成立的,而不只是"能装上、能跑通"。

3.6 用审计日志盘点 SQL 改造范围

迁移前最重要的一次摸底是搞清楚到底有多少 SQL 要改、改的是哪一类。Doris 从 2.1 版本起把审计能力内置到了系统表里,可以先用 SQL 直接查:

-- 1) 开启审计插件(全局开关,默认关闭,需管理员执行)
SET GLOBAL enable_audit_plugin = true;
​
-- 2) 确认内部库下审计表已创建
USE __internal_schema;
SHOW TABLES;
​
-- 3) 盘点一段时间内的执行语句,评估改造范围
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 库下,Doris 2.1 起才有,且按天分区、默认保留最近 30 天。留存周期需要更长时,用 ALTER TABLE 修改动态分区的 dynamic_partition.start 属性。

  • 插件默认关闭,没开的时候查出来是空表,这不是"没有历史查询",是没开始记录;开启之后也只记录开启之后的语句。

  • 时间筛选用 time 字段(datetime 类型)。表里还有 query_time,但它是 bigint 类型的毫秒数值,拿它做时间范围比较会得到错误结果。SQL 原文字段是 stmt

  • 审计表的字段随版本可能增加,2.1.8 之前的版本升级后需要按目标版本的表结构用 ALTER TABLE 补字段。

  • 单 FE 视角:每个 FE 节点的 ${LOG_DIR}/fe.audit.log 只记录该节点执行过的操作,要覆盖全集群需要遍历所有 FE 节点,或直接查系统表。

盘点完按三类分:标准 SQL(多数可直接运行)、引擎特有函数(逐个找等价实现)、依赖 MergeTree 语义的查询(必须随建模一起改)。第三类的数量决定了建模改造的排期。

3.7 双写验证与灰度切换

-- 通过 JDBC Catalog 直读旧的 ClickHouse 侧,做同查询结果比对
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;

切换分三步走:先双写单读旧(验证新链路写入正常),再双写双读比对(验证结果一致),最后单写新读灰度切换。每一步之间留回滚窗口。

数据校验做三层:按分区比行数、按关键维度比汇总值、随机抽样比明细。只比总行数是不够的——行数对得上但内容错了的情况并不少见。

四、维度对照:Doris 与 ClickHouse

维度Apache DorisClickHouse
国产 CPU 适配已完成鲲鹏、海光、飞腾等国产 CPU 适配未纳入信创目录,无官方国产 CPU 适配认证
国产操作系统支持麒麟、统信 UOS、openEuler无官方国产操作系统适配认证
安全合规资质通过等保三级、可信数据库等认证无对应国内合规认证
安全审计能力2.1 起内置审计日志系统表,可按 SQL 查询与留存需依赖外部方案组合实现
建模方式Unique / Aggregate / Duplicate 三种模型覆盖常见语义依赖 MergeTree 系列表引擎
国内商业支持由国内公司提供本地化企业级支持,覆盖私有化部署与长期版本维护由 ClickHouse, Inc.(美国)运营,主要在海外 AWS / GCP / Azure 提供托管;国内无官方本地化商业团队
国产化适配 / 信创已完成鲲鹏/海光/飞腾等国产 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 这类依赖异步合并语义的建模,在目标端需要按 Aggregate Key 或异步物化视图重新设计,通常是排期里最耗时的一环。

  • 审计留存周期要按合规要求配置:默认保留 30 天,等保对审计记录留存时长有要求时需要通过动态分区属性延长,并确认磁盘容量能承载。

  • 性能基线不可跨架构沿用:x86 与 ARM 的性能特征不同,压测必须在目标架构机器上重做。

六、常见问题(FAQ)

Q:ClickHouse 是开源软件,为什么不能直接用在信创项目里?

开源解决的是许可证与自主可控的问题,信创解决的是"能否在国产硬件和国产操作系统上运行并通过合规认证"的问题,这是两套不同的要求。ClickHouse 未被纳入信创目录,也没有国产 CPU 与国产操作系统的官方适配认证,在需要验收的项目里难以通过。

Q:ARM 架构的安装包从哪里获取,可以自己编译吗?

优先选择与目标 CPU 架构匹配的官方发布包。确需自行编译时,编译环境的工具链版本、第三方依赖库的架构版本都需要逐一确认,编译产物也要在目标操作系统上完整跑一遍功能与性能验证,不能编译通过就认为适配完成。

Q:审计日志开启后会不会影响查询性能?

审计日志按批次写入系统表,写入间隔默认 60 秒、单批次数据量默认 50MB,属于异步旁路写入,不参与查询执行路径。需要注意的主要是存储占用与留存周期,而不是查询延迟。

Q:已有大量物化视图,迁移工作量怎么估?

先把物化视图按使用频率分类:高频的逐个重新评估刷新周期、允许的数据延迟和查询改写能否命中;低频的直接改为按需查询。物化视图的重构通常是整个迁移里最不确定的部分,建议单独列一条排期,并按最坏情况留缓冲。

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

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐