
# 配置ClickHouse冷热分离
在数据分析的实际场景中，冷热数据面临着不同的查询频次及响应速度要求。而随着历史数据的不断增多，如果我们将所有数据存储在本地，将造成大量的资源浪费。冷热分离特性可将冷热数据分开存储，将冷热数据分别存储在成本不同的存储介质上。热数据提高时效数据的查询速度和响应能力，冷数据降低存储成本。我们还可以根据实际业务需求进行灵活的配置和调整，以满足不同场景的要求。冷热数据主要从数据访问频率、更新频率进行划分。
- Hot（热数据）：访问、更新频率较高，未来被调用的概率较高的数据，对访问的响应时间要求很高的数据。
- Cold（冷数据）：不允许更新或更新频率比较低，访问频率比较低，对访问的响应时间要求不高的数据。
用户可以定义冷热管理表，将符合规则的冷数据切换至OBS上进行存储，可以按照分区自动进行冷热数据的判断和迁移。
#### 原理介绍
OBS对象存储是支持海量数据存储，并提供安全可靠的、低成本的分布式存储服务，ClickHouse基于OBS的优势构建冷热分离存储架构。ClickHouse集群所在的SSD云盘存放最近时间生成并且频繁访问的"热数据"，OBS存放较早时间生成且访问不频繁的"冷数据"，在建表的时使用TTL实现数据根据特定时间策略进行冷热存储。
图1冷热分离原理图   
![](https://support.huaweicloud.com/usermanual-cloudtable/zh-cn_image_0000002342704324.png "点击放大")
- 创建表：创建含有冷热分离策略的数据表，其中存储策略值必须为hot_to_cold。
- 写数据：新数据会按照信息导入到对应的数据表中。在ClickHouse中，每次数据写入都会生成一个新的Part，以保证冷数据的Part在不受影响的情况下写入新数据，满足冷热数据同时存储的需求。
- 冷热分离：数据存储在热存储上，随着容量或时间的推移往冷存储上迁移。ClickHouse的冷热分离粒度是基于Part的，当达到容量上限或冷却时间时会将当前满足条件的Part移动到OBS，之后新导入的数据生成的新Part达到容量上限或冷却时间后也会移动到OBS。
- 查询数据：用户在数据表上进行对应的查询，ClickHouse会根据对应表的存储策略信息查询到对应Bucket的根目录，并根据不同表下Part信息下载查询所需的数据到本地进行运算。
 
#### 使用限制
- 开通冷热数据分离存储功能，请在业务低峰期进行。开通该功能期间集群只能查看集群信息，无法进行扩容、数据迁移等任务。
- 使用冷热数据分离存储功能时，需要给表指定存储策略。
- 冷热分离场景下，热盘不支持缩容。
- 冷热分离策略一旦创建无法删除。
 
#### 前提条件
- 创建ClickHouse集群，且正常运行。
- 已安装ClickHouse客户端。
 
#### 开启冷热分离并设置容量策略
- 方式一（创建集群时开启）：
  1. 登录[表格存储服务控制台](https://console.huaweicloud.com/cloudtable)。
  
  2. 在集群管理界面，单击集群管理界面右上角的"购买集群"。
  
  3. 进入购买集群界面，在集群购买页面选择ClickHouse数据库引擎，开启冷热分离特性并设置冷热分离策略。 节点已使用容量占节点总容量的比值大于等于冷热分存策略设置的比例时，数据将被自动移动到冷存储卷。
     
  
  4. 完成参数配置，单击"立即购买"，规格确认无误，单击"提交"。
   

- 方式二（已存在集群手动开启）：
  1. 登录[表格存储服务控制台](https://console.huaweicloud.com/cloudtable)。
  
  2. 在集群管理界面：
     - 单击目标集群操作列"更多 \> 开启冷热分离"，弹出"开启冷热分离"窗口，设置冷热分离策略，单击"确定"。
     
     - 单击目标集群"集群名称 \> 详情"进入集群详情页面。单击集群信息模块"是否开启冷热分离"右边的"开启"。弹出"开启冷热分离"窗口，设置冷热分离策略，单击"确定"。
     
     
     节点已使用容量占节点总容量的比值大于等于冷热分存策略设置的比例时，数据将被自动移动到冷存储卷。
     
   
 
#### 配置TTL冷热分离自定义策略
1. 使用SSH工具访问ClickHouse集群。 
   - 普通集群参考[使用客户端连接ClickHouse普通集群](https://support.huaweicloud.com/usermanual-cloudtable/cloudtable_01_0307.html)。
     ```
     ./clickhouse client --host 集群内网地址   --port 9000 --user admin --password password
     ```
     
   
   - 安全集群参考[使用客户端连接ClickHouse安全集群](https://support.huaweicloud.com/usermanual-cloudtable/cloudtable_01_0381.html)。
     ```
     ./clickhouse client --host 集群内网地址 --port 9440 --user admin --password password --secure --config-file /root/config.xml
     ```
     
   
   
   
   
2. 创建数据库并使用数据库。 
   ```
   CREATE DATABASE demo;
   ```
   ```
   USE demo;
   ```
   
   
3. 创建冷热分离数据表，并设置冷热分离策略。 
   - ClickHouse集群为单副本创建冷热分离表命令。
     ```
     CREATE TABLE hot_cold_table
     (
     `f1` Int64,
     `date` DateTime
     )
     ENGINE = MergeTree()
     PARTITION BY date
     ORDER BY date
     TTL date + INTERVAL 90 DAY TO DISK 'cold_disk'
     SETTINGS storage_policy = 'hot_to_cold';
     ```
     
   
   
   ![](https://support.huaweicloud.com/usermanual-cloudtable/public_sys-resources/note_3.0-zh-cn.png)
   参数说明：
   - storage_policy：指定存储策略，值指定为hot_to_cold。存储策略一旦指定，后期无法更改。
   
   - TTL表达式只是一个简单的SQL表达式，里面包含时间以及时间间隔。表示超过90天转存OBS。
     ```
     TTL date + INTERVAL 90 DAY TO DISK 'cold_disk'
     ```
     
   
   - INTERVAL支持的操作：second，minute，hour，day，week，month，quarter，year。
    
   
   
4. 导入数据测试验证。 
   ```
   insert into hot_cold_table values('10086','2025-04-15');  -- hot data
   insert into hot_cold_table values('10086','2023-12-26');  -- cold data
   insert into hot_cold_table values('10086','2024-12-24');  -- cold data
   insert into hot_cold_table values('10086','2025-03-24');  -- hot data
   insert into hot_cold_table values('10086','2018-10-01');  -- cold data
   ```
   
   
5. 查询表数据。 
   ```
   cloudtable-e474-jxf-server-1-1 :) select * from hot_cold_table FORMAT CSV;
   SELECT *
   FROM hot_cold_table
   FORMAT CSV
   Query id: b9bc7bdd-8c34-4eec-bb35-e383de1e5b0d
   10086,"2025-03-24 00:00:00"
   10086,"2025-04-15 00:00:00"
   10086,"2018-10-01 00:00:00"
   10086,"2023-12-26 00:00:00"
   10086,"2024-12-24 00:00:00"
   5 rows in set. Elapsed: 0.107 sec.
   ```
   
   
6. 查看冷热数据存储路径。以当前系统时间计算，并根据TTL策略规定超过90天数据存储在冷盘中。 
   ```
   select name, partition, active, path from system.parts where database = 'demo' and table= 'hot_cold_table' and active = 1;
   ```
   图2冷热数据存储查询结果   
   ![](https://support.huaweicloud.com/usermanual-cloudtable/zh-cn_image_0000002376542657.png "点击放大")
   
   
 
