从 ClickHouse 迁移
本指南详细介绍如何将业务平滑迁移自 ClickHouse 到 GreptimeDB,涵盖迁移前的准备、数据模型调整、表结构重构、双写保障以及数据导出与导入的具体方法,帮助实现系统的无缝切换。
迁移前须知
-
兼容性 虽然 GreptimeDB 支持 SQL 协议,但与 ClickHouse 在数据建模、索引设计和压缩机制等方面存在根本差异。请查阅 SQL 兼容性 文档以及官方建模建议,在迁移过程中重构表结构与数据流。
-
数据模型差异 ClickHouse 属于通用大数据分析引擎,GreptimeDB 则重点优化时序、指标及日志可观测场景。两者在数据模型、索引体系与压缩算法等方面均有差别,模型设计时需充分考虑业务场景及兼容性。
重新设计数据模型与表结构
时间索引
- ClickHouse 的表未必有 time index 字段,迁移时需明确选择业务主要的时间字段作为时间索引,并在 GreptimeDB 建表时指定,如日志记录时间/链路追踪时间等。
- 时间精度(秒、毫秒、微秒等)应按实际需求选定,且一旦设定不可更改。
主键与宽表建议
- 主键:类似 ClickHouse 的
order by,去掉时间戳列;但不建议包含 log_id、user_id 或 UUID 等高基数字段,以避免主键膨胀、写放大和低效查询。 - 宽表 vs 多表:同一个观测点采集多种指标时建议采用宽表,有助于提升批量写入效率和压缩比。
索引规划
- 倒排索引:为低基数列建立索引,提高筛选效率。
- 跳数索引:按需使用,适用于稀疏值或大表中偶尔查询的特定值。
- 全文索引:按需使用,适用于字符串字段的文本检索,避免在高基数或高变动字段上建立无用索引。
- 更多信息详见数据索引。
表分区
ClickHouse 通过 PARTITION BY 语法支持分区,GreptimeDB 提供类似能力,语法不同,请参阅表分片文档。
TTL
GreptimeDB 支持通过表选项 ttl 设置生命周期,详见使用 TTL 策略管理数据存储。
表结构举例
ClickHouse 表:
CREATE TABLE example (
timestamp DateTime,
host String,
app String,
metric String,
value Float64
) ENGINE = MergeTree()
TTL timestamp + INTERVAL 30 DAY
ORDER BY (timestamp, host, app, metric);
GreptimeDB 推荐表结构:
CREATE TABLE example (
`timestamp` TIMESTAMP NOT NULL,
host STRING,
app STRING INVERTED INDEX,
metric STRING INVERTED INDEX,
`value` DOUBLE,
PRIMARY KEY (host, app, metric),
TIME INDEX (`timestamp`)
) with(ttl='30d');
主键及时间索引的选型应结合业务数据量及查询场景慎重设计。如果 host 基数很大(如百万级监控主机),可不做主键,改为跳数索引。
典型日志表迁移
GreptimeDB 已内置 otel 日志建模方案,操作详见官方文档。
ClickHouse 日志表结构:
CREATE TABLE logs
(
timestamp DateTime,
host String,
service String,
log_level String,
log_message String,
trace_id String,
span_id String,
INDEX inv_idx(log_message) TYPE ngrambf_v1(4, 1024, 1, 0) GRANULARITY 1
) ENGINE = MergeTree
ORDER BY (timestamp, host, service);
推荐的 GreptimeDB 表结构:
- 时间索引:
timestamp