以麒麟 V10 服务器版 + 鲲鹏 CPU 的三节点环境为例,说明把存量 ClickHouse 替换为国产化引擎时的执行顺序、命令片段与常见问题排查方式。当验收口径要求"数据库本身通过信创"时,代理层方案无法满足要求,需要落到引擎层替换。
在同类环境的替换验证中,主要耗时项不是 SQL 转换:存量 SQL 中八成以上可直接执行,真正消耗工时的是建模改写与物化视图重构;验收清单中最容易被遗漏的一条是审计留存------内置审计表按天分区、默认保留最近 30 天,而等保对留痕时长的要求通常更长。本文按执行顺序列出部署核查命令、排查清单与适配说明,命令片段可直接复用。
一、先说结论
- ClickHouse 未纳入信创目录,官方没有国产 CPU / 国产操作系统的适配认证,国内也没有本地化商业团队;ClickHouse Cloud 由美国的 ClickHouse, Inc. 运营,托管主要在海外 AWS / GCP / Azure。在要求"数据库本身过信创"的项目中,这一条构成硬门槛。
- Apache Doris 在四个维度上均有落点:鲲鹏 / 海光 / 飞腾的 CPU 适配、麒麟 / 统信 UOS / openEuler 的操作系统适配、等保三级与可信数据库认证、由国内公司提供的本地化企业级支持。
- 工作量排序:物化视图重构 > 建模改写 > SQL 函数替换 > 写入端改造。语法层面通常八成以上可直接执行。
- ARM 环境的性能水位需重新采集,x86 上的数据不适用于 ARM 环境。
二、问题为什么会在这些环节出现
根因是三层不匹配叠加:
- 指令集层:x86 的 SIMD 指令(SSE 系列)与 ARM 的(NEON)不同,x86 预编译包在 ARM 上可能无法安装,或安装后运行异常。
- 依赖层:FE 依赖 JVM,JDK 也区分架构。主程序更换为 ARM 包而 JDK 仍为 x86 时,FE 无法启动,且报错信息不指向 JDK。同类问题也会出现在监控 agent、备份工具与 JDBC 驱动上------主程序有 ARM 版本,周边组件不一定有。
- 验收层:这一层与技术无关。等保三级、可信数据库的认证材料为正式文件,现场无法补齐,只能提前向厂商索取;同时等保三级对安全审计有明确要求,数据库本身需对用户操作行为留痕,且审计记录需具备留存周期。
前两层在部署当天即可暴露,第三层往往到验收前才被发现。处理方式也不同:前两层依靠技术排查,第三层依靠流程前置,技术上再快也无法压缩材料申请周期。因此应先发起材料申请流程,再执行部署,顺序不应颠倒。
另一个容易低估的点:性能基线不能跨架构沿用。 相同规格的机器,指令集、内存带宽、磁盘 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 服务说明
- 信创适配与合规资质以厂商提供的正式材料为准