Clickhouse MergeTree表引擎TTL分布式实现

1. 执行SQL

clickhouse1 :) 
clickhouse1 :) CREATE TABLE ttl_table_local ON CLUSTER sharding_ha
:-] (
:-]     `id` UInt64,
:-]     `create_time` DateTime,
:-]     `code` String TTL create_time + toIntervalSecond(30),
:-]     `type` UInt8 TTL create_time + toIntervalSecond(30)
:-] )
:-] ENGINE = ReplicatedMergeTree('/clickhouse/tables/ttl_table/{shard}', '{replica}')
:-] ORDER BY id
:-] TTL create_time + toIntervalMinute(1);

CREATE TABLE ttl_table_local ON CLUSTER sharding_ha
(
    `id` UInt64,
    `create_time` DateTime,
    `code` String TTL create_time + toIntervalSecond(30),
    `type` UInt8 TTL create_time + toIntervalSecond(30)
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/ttl_table/{shard}', '{replica}')
ORDER BY id
TTL create_time + toIntervalMinute(1)

Query id: bfc40713-1fe0-458a-9ac8-3a59872a224a

┌─host────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ clickhouse2 │ 9000 │      0 │       │                   3 │                0 │
│ clickhouse3 │ 9000 │      0 │       │                   2 │                0 │
│ clickhouse1 │ 9000 │      0 │       │                   1 │                0 │
│ clickhouse4 │ 9000 │      0 │       │                   0 │                0 │
└─────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘

4 rows in set. Elapsed: 0.149 sec. 

clickhouse1 :) 
clickhouse1 :) CREATE TABLE ttl_table_all ON CLUSTER sharding_ha
:-] (
:-]     `id` UInt64,
:-]     `create_time` DateTime,
:-]     `code` String,
:-]     `type` UInt8
:-] )
:-] ENGINE = Distributed(sharding_ha, default, ttl_table_local, rand());

CREATE TABLE ttl_table_all ON CLUSTER sharding_ha
(
    `id` UInt64,
    `create_time` DateTime,
    `code` String,
    `type` UInt8
)
ENGINE = Distributed(sharding_ha, default, ttl_table_local, rand())

Query id: 6f657775-d637-44fe-bf07-25a04084c72d

┌─host────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ clickhouse2 │ 9000 │      0 │       │                   3 │                0 │
│ clickhouse3 │ 9000 │      0 │       │                   2 │                0 │
│ clickhouse1 │ 9000 │      0 │       │                   1 │                0 │
│ clickhouse4 │ 9000 │      0 │       │                   0 │                0 │
└─────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘

4 rows in set. Elapsed: 0.135 sec. 

clickhouse1 :) 
clickhouse1 :) insert into ttl_table_all(id, create_time, code, type) values(66, now(), 'A', 1), (66, now() + interval 5 minute, 'A', 1);

INSERT INTO ttl_table_all (id, create_time, code, type) VALUES

Query id: d18773fe-bcbc-4e85-9cc4-563a686de5db

Ok.

2 rows in set. Elapsed: 0.015 sec. 

clickhouse1 :)

查询数据如下:

clickhouse1 :) 
clickhouse1 :) select * from ttl_table_all limit 10;

SELECT *
FROM ttl_table_all
LIMIT 10

Query id: 5ab98d68-1253-4760-b654-ef130715cbd0

┌─id─┬─────────create_time─┬─code─┬─type─┐
│ 66 │ 2021-07-14 11:37:00 │ A    │    1 │
│ 66 │ 2021-07-14 11:42:00 │ A    │    1 │
└────┴─────────────────────┴──────┴──────┘

2 rows in set. Elapsed: 0.011 sec. 

clickhouse1 :) 

过了30秒之后,再次查看:

clickhouse1 :) 
clickhouse1 :) optimize table ttl_table_local on cluster sharding_ha final;

OPTIMIZE TABLE ttl_table_local ON CLUSTER sharding_ha FINAL

Query id: b9b55917-6974-4d26-8e7d-697aee1cec1a

┌─host────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ clickhouse2 │ 9000 │      0 │       │                   3 │                0 │
│ clickhouse1 │ 9000 │      0 │       │                   2 │                0 │
│ clickhouse3 │ 9000 │      0 │       │                   1 │                0 │
│ clickhouse4 │ 9000 │      0 │       │                   0 │                0 │
└─────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘

4 rows in set. Elapsed: 0.164 sec. 

clickhouse1 :)
clickhouse1 :) select * from ttl_table_all limit 10;

SELECT *
FROM ttl_table_all
LIMIT 10

Query id: e814ed48-fea6-4a39-b27e-5b37dddc3bc1

┌─id─┬─────────create_time─┬─code─┬─type─┐
│ 66 │ 2021-07-14 11:37:00 │      │    0 │
│ 66 │ 2021-07-14 11:42:00 │ A    │    1 │
└────┴─────────────────────┴──────┴──────┘

2 rows in set. Elapsed: 0.017 sec. 

clickhouse1 :) 

又过了30秒之后,再次查看:

clickhouse1 :) 
clickhouse1 :) optimize table ttl_table_local on cluster sharding_ha final;

OPTIMIZE TABLE ttl_table_local ON CLUSTER sharding_ha FINAL

Query id: 63d61b9e-755f-4a17-a78f-c5cce6a76b93

┌─host────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ clickhouse2 │ 9000 │      0 │       │                   3 │                0 │
│ clickhouse1 │ 9000 │      0 │       │                   2 │                0 │
│ clickhouse3 │ 9000 │      0 │       │                   1 │                0 │
│ clickhouse4 │ 9000 │      0 │       │                   0 │                0 │
└─────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘

4 rows in set. Elapsed: 0.131 sec. 

clickhouse1 :)
clickhouse1 :) select * from ttl_table_all limit 10;

SELECT *
FROM ttl_table_all
LIMIT 10

Query id: 230225a3-3c2b-447a-a490-bfe1f936c9c8

┌─id─┬─────────create_time─┬─code─┬─type─┐
│ 66 │ 2021-07-14 11:42:00 │ A    │    1 │
└────┴─────────────────────┴──────┴──────┘

1 rows in set. Elapsed: 0.009 sec. 

clickhouse1 :) 

2. 说明

  • 同时设置了列TTL和表TTL,以先到期的为主
  • 主键字段不能设置TTL,TTL字段类型为Date或DateTime, TTL时间类型有second、minute、hour、day、 week、month、quarter和year
  • 修改或添加列字段的TTL:alter table ttl_table_local on cluster sharding_ha modify column code String ttl create_time + interval 1 day
  • 修改表TTL:alter table ttl_table_local on cluster sharding_ha modify ttl create_time + interval 3 day
  • 没有提供取消列和表TTL的方法

3. TTL的运行原理

todo

<think>好的,我现在需要帮助用户了解ClickHouse的架构设计。首先,我得回顾一下已有的信息,确保自己正确理解用户的问题相关引用资料。用户提到了几个引用,涉及ClickHouse的Join操作限制、存储块结构、表引擎的重要性以及与其他MPP架构的对比。这些都需要整合到架构设计的解释中。 首先,用户的问题是关于ClickHouse架构的详解。根据引用4,ClickHouse是基于MPP架构的,专注于OLAP场景,采用了列式存储引擎,并具备数据有序存储、主键索引、稀疏索引等功能。同时,引用2提到其核心抽象是“块”作为最小存储计算单位。引用3强调了表引擎的关键作用,而引用1则指出其Join操作的局限性。这些点都是架构的重要组成部分,需要逐一展开。 接下来,我需要组织这些信息,结构要清晰。通常,架构设计可以从存储引擎、计算模型、分布式架构、表引擎等方面入手。列式存储是ClickHouse的核心特点,应该放在前面说明,然后是其分布式架构,包括分片副本机制。表引擎部分需要引用引用3的内容,说明其多样性重要性。同时,要提到其Join操作的不足,如引用1所提到的广播连接限制,这会影响分布式大表Join的性能。 此外,用户可能还关心ClickHouse与其他MPP系统(如Doris、Impala)的对比,但用户的问题主要集中在架构详解,所以可能需要简要提及,但重点还是ClickHouse自身的设计。另外,引用2中的“块”结构需要解释清楚,它是如何实现高效数据传输处理的。 还需要注意用户提供的格式要求:数学公式用$...$,独立公式用$$...$$,但当前内容可能涉及较少数学表达,不过如果有性能相关的公式可能需要使用。例如,稀疏索引如何减少I/O,可以结合数据分区的公式说明。 最后,生成相关问题时要围绕架构设计的核心点,比如存储结构、分布式处理、表引擎选择、性能优化等,确保问题能够引导用户进一步深入学习。 现在需要检查是否有遗漏的关键点,比如数据分片(Sharding)、数据分区(Partitioning)、TTL、主备复制等,这些都是引用4提到的,需要涵盖。另外,查询执行流程资源管理可能也是架构的一部分,但根据现有引用,可能信息有限,需根据已知信息回答,避免猜测。 总结下来,结构大致如下: 1. 列式存储引擎 2. MPP架构分布式设计 3. 数据分片与分区 4. 块(Block)结构 5. 表引擎的作用 6. 索引与查询优化 7. 限制与挑战 确保每个部分都引用对应的参考资料,并在末尾添加引用标识。同时,生成的问题要覆盖这些部分,帮助用户深入探讨。</think>### ClickHouse架构详解 #### 1. **列式存储引擎** ClickHouse采用列式存储,将同一列的数据连续存储,大幅提升数据压缩率查询效率。例如,计算某列总时,仅需读取对应列的数据块,减少I/O消耗。列存储还支持高效的向量化计算,通过SIMD指令并行处理数据[^4]。 #### 2. **MPP架构与分布式设计** ClickHouse基于**MPP(大规模并行处理)架构**,支持水平扩展。其分布式表通过**分片(Sharding)****副本(Replica)**机制实现: - **分片**:数据按规则分散到多个节点,例如哈希分片或范围分片。 - **副本**:通过ZooKeeper实现副本同步,保障高可用。 分布式查询时,查询会被拆分到各分片并行执行,结果汇总后返回。 #### 3. **数据分区与TTL** - **分区(Partitioning)**:数据按时间或业务键分区,例如按天分区,加速范围查询。 - **TTL(Time-To-Live)**:自动删除过期数据,降低存储成本。 #### 4. **块(Block)结构** ClickHouse的最小处理单元是**块(Block)**,每个块包含列数据、数据类型行数信息。块通过流水线机制在计算节点间传输,减少序列化开销,提升吞吐量[^2]。 #### 5. **表引擎的核心作用** 表引擎决定数据存储方式、索引策略查询能力,例如: - **MergeTree系列**:支持主键索引、稀疏索引,适合时序数据分析。 - **ReplicatedMergeTree**:实现多副本同步。 - **Kafka引擎**:直接消费Kafka流数据[^3]。 #### 6. **索引与查询优化** - **主键索引**:按主键有序存储,加速范围查询。 - **稀疏索引**:间隔若干行记录索引位置,平衡索引大小与查询效率[^4]。 - **预聚合**:通过物化视图预先计算聚合结果,减少实时计算压力。 #### 7. **限制与挑战** - **Join操作局限**:仅支持广播连接(Broadcast Join),大表Join时需将右表全量分发到各节点,影响性能[^1]。 - **CBO缺失**:缺乏基于代价的优化器,复杂查询依赖手动调优[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值