
# 配置ClickHouse冷热分离
#### 操作场景
ClickHouse基于开源ClickHouse的multi-volume storage特性，允许将ClickHouse表存储在包含多个设备的卷当中。通过在volume中定义不同类型的磁盘，根据数据的"冷"、"热"程度将数据存放在不同类型的磁盘上，即冷数据存储在OBS，热数据存储在ClickHouse中。实现了ClickHouse集群在提供查询性能的同时又能以低成本的方式实现数据的长期存放。
配置ClickHouse数据冷热分离存储的整体流程如下：
1. [创建OBS并行文件系统]
2. [创建云服务委托并绑定集群]
3. [创建普通账号委托并绑定集群]
4. [ClickHouse集群添加OBS磁盘信息]
5. [配置磁盘存储策略]
6. [自定义冷热分离数据存储策略]
7. [导入数据ClickHouse测试验证]
 
#### 约束与限制
本章节仅适用于MRS 3.3.1-LTS及之后版本。
#### 原理介绍
OBS对象存储是支持海量数据存储，并提供安全可靠的、低成本的分布式存储服务，ClickHouse基于OBS的优势构建冷热分离存储架构。ClickHouse实例所在的SSD云盘存放最近时间生成并且频繁访问的"热数据"，OBS存放较早时间生成且访问不频繁的"冷数据"，在建表的时候使用TTL实现数据根据特定时间策略进行冷热存储。
图1冷热存储原理图   
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001896222701.png "点击放大")
表1模块说明 
| 参数             | 描述                     |
|:---|:---|
| Volume         | 卷，有序的磁盘的集合。            |
| Storage Policy | 存储策略，卷的集合以及卷之间数据移动的规则。 |
   
 #### 创建OBS并行文件系统
1. 登录[OBS管理控制台](https://console.huaweicloud.com/obs/)。
2. 选择"并行文件系统 \> 创建并行文件系统"，配置以下参数后，单击"立即创建"。
   - 区域：选择MRS集群所在区域。
   
   - 文件系统名称：自定义名称，例如"mrs-ck-obs"。
    
3. 单击已创建的并行文件系统名称，在"概览"页签中查看并记录"Endpoint"参数的值，即为OBS的Endpoint。
4. 获取IAM的ENDPOINT。
   - OBS的Endpoint中去掉前缀"obs."，剩下的部分则为系统Endpoint。
     图2获取Endpoint   
     ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002028782813.png "点击放大") 
   
   - IAM的Endpoint为"iam.*系统Endpoint*"。
   
   
   例如：OBS的Endpoint为"obs.xxx.huawei.com"，则系统Endpoint为"xxx.huawei.com"，IAM的Endpoint为"iam.xxx.huawei.com"。
   

5. 获取AK/SK信息。
   1. 将鼠标移到右上角登录用户名处，在下拉列表中选择"我的凭证"。
   
   2. 在"API凭证"中，记录并保存"账号ID"的值，作为DomainID。
      图3账号ID   
      ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002028902737.png "点击放大") 
   
   3. 单击"访问密钥"页签，单击"新增访问密钥"，输入验证码或密码。单击"确定"，生成并下载访问密钥，在.csv文件中获取AK/SK信息。
      ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
      用户删除服务或者卸载集群后，可能导致[2]创建的并行文件系统下残留脏数据，请用户手动删除。
      
    
 
 #### 创建云服务委托并绑定集群
1. 登录云服务管理控制台。
2. 在服务列表中选择"管理与监管 \> 统一身份认证服务 IAM"。
3. 选择"委托 \> 创建委托"，在创建委托页面设置如下参数，并单击"下一步"：
   - 委托名称：填写委托名称，例如：mrs_clickhouse_obs。
   
   - 委托类型：选择"云服务"。
   
   - 云服务：选择"弹性云服务器 ECS 裸金属服务器 BMS"。
   
   - 持续时间：选择"永久"。
     图4创建委托   
     ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002028903217.png) 
    
4. 在弹出授权页面的搜索框内，搜索"OBS OperateAccess"策略，并勾选"OBS OperateAccess"策略。 如果OBS配置了KMS加密，同时需要勾选"KMS Administrator"策略。
   
5. 单击"下一步"，在"选择权限范围方案"中选择"全局服务资源"，单击"确定"。
6. 在弹出提示框中单击"知道了"，开始授权。界面提示"授权成功"，单击"完成"，委托创建成功。
7. 在MRS控制台，选择"现有集群"，单击ClickHouse集群名称，进入集群详情页面。
8. 在集群详情的"概览"页签，单击"IAM用户同步"右侧的"同步"，进行IAM用户同步。
9. 单击委托右侧的"管理委托"选择创建的委托名称，例如：mrs_clickhouse_obs，单击"确定"进行绑定。
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
   绑定委托的用户需要有ECS权限，否则会导致绑定失败。查看方法如下：
   登录统一身份认证服务管理控制台，在左侧导航栏选择"用户"，在搜索栏搜索当前用户名，单击用户名称，在"授权记录"中查看是否有ECS相关权限。
   
 
 #### 创建普通账号委托并绑定集群
1. 登录云服务管理控制台。
2. 在服务列表中选择"管理与监管 \> 统一身份认证服务 IAM"。
3. 选择"权限管理 \> 权限"，单击"创建自定义策略"，配置如下参数，并单击"确定"：
   - 策略名称：填写策略名称，例如：clickhouse-policy。
   
   - 策略配置方式：选择"JSON视图"。
   
   - 策略内容：
     ```
     {
         "Version": "1.1",
         "Statement": [
             {
                 "Effect":"Allow",
                 "Action":[
                     "OBS:*:*"
                     ]
             }
             ]
     }
     ```
     
     图5自定义策略   
     ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001896591085.png) 
    
4. 选择"委托 \> 创建委托"，在创建委托页面配置以下参数并单击"确定"：
   - 委托名称：填写委托名称，例如：agency-clickhouse-to-OBS。
   
   - 委托类型：选择"普通账号"。
   
   - 委托的账号：填写本用户的云账号，即使用手机号开通的账号，不能是联邦用户或者IAM用户。
   
   - 持续时间：选择"永久"。
    
5. 在弹出授权页面的搜索框内，搜索[3]新建的自定义策略，并勾选该策略，例如"clickhouse-policy"。
6. 单击"下一步"，在"选择授权范围"中勾选"全局服务资源"，单击"确定"。
7. 创建完成后，将鼠标放在新建的委托上，记录下委托ID。
8. 在"统一身份认证服务"选择"委托"。
9. 单击[3]中创建的云服务委托名称，例如："mrs_clickhouse_obs"。
10. 选择"授权记录 \> 授权"，单击"新建策略"，参数配置如下：
    - 策略名称：自定义策略名，例如"clickhouse-assume-policy"。
    
    - 策略配置方式：选择"JSON视图"。
    
    - 策略内容：配置如下（其中"{委托id}"为[7]记录的ID）
      ```
      {
          "Version": "1.1",
          "Statement": [
              {
                  "Action": [
                      "iam:agencies:assume"
                  ],
                  "Resource": {
                      "uri": [
                          "/iam/agencies/{委托ID}"
                      ]
                  },
                  "Effect": "Allow"
              }
          ]
      }
      ```
      
     
11. 单击"下一步"，在"选择策略"页面勾选[10]创建的策略名称。
12. 单击"下一步"，在"选择权限范围方案"中选择"全局服务资源"，单击"确定"。
 
 #### ClickHouse集群添加OBS磁盘信息
1. 登录Manager页面，选择"集群 \> 服务 \> ClickHouse \> 配置 \> 全部配置 \> ClickHouseServer（角色）\> 存储"。
2. OBS访问凭据支持委托和AK/SK两种配置方式，用户可选择其中一种配置。
   - 配置委托的方式获取OBS访问凭据，参考下表配置OBS访问凭据信息。
     
     | 参数                                         | 参数说明                                                                                                                        |
     |:---|:---|
     | storage_configuration.obs.obs_domain_id    | 访问IAM的用户对应的Domain ID。 具体请参考[创建OBS并行文件系统]中获取的Domain ID。 |
     | storage_configuration.obs.obs_iam_endpoint | 具体请参考[创建OBS并行文件系统]中获取的iam Endpoint。                                                    |
     | storage_configuration.obs.obs_agency_name  | 委托名称，具体请参考[创建普通账号委托并绑定集群]获取委托名称，例如"agency-clickhouse-to-OBS"。                        |
        
     
   
   - 配置AK/SK的方式获取OBS访问凭据。
     
     | 参数                                    | 参数说明                                                                                                   |
     |:---|:---|
     | storage_configuration.obs.obs_user_ak | 访问IAM用户（前提条件中创建的用户）的AK。 参考[5]获取AK信息。   |
     | storage_configuration.obs.obs_user_sk | 访问IAM用户（前提条件中创建的用户）的SK。 参考[5]获取SK信息。 |
        
     图6OBS凭据信息配置示例（使用AK/SK方式）   
     ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001850141984.png "点击放大") 
    
3. 在"clickhouse-config-customize"参数，参考下表添加自定义配置项，配置OBS盘信息。
   表2OBS盘配置项 
   | 参数                                             | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   |:---|:---|
   | storage_configuration.disks.*disk_s3*.type     | 固定值：s3                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   | storage_configuration.disks.*disk_s3*.endpoint | 创建的OBS并行文件系统的访问路径，具体格式如下： *https:* //*并行文件系统名.* *并行文件Endpoint/文件夹名称/* - 并行文件系统名：创建OBS并行文件系统中创建的OBS并行文件名。  - 并行文件Endpoint：可以单击OBS并行文件名，在概览页的"基本信息"中获取Endpoint。  - 文件夹名称：OBS并行文件系统下创建的文件夹名。   |
      
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
   **disk_s3**为OBS盘名称，可以自定义修改。
   图7clickhouse-config-customize参数配置OBS盘示例   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001896342261.png "点击放大") 
4. （可选）ClickHouse冷热分离支持将存储在OBS上的数据，缓存在本地存储上，用来加速数据的查询。如果用户需要使用本地存储的缓存，需要通过"clickhouse-config-customize"自定义参数，参考下表添加自定义配置项。
   
   | 参数                                               | 参数说明                                            |
   |:---|:---|
   | storage_configuration.disks.*obs_cache*.type     | 固定值：cache                                       |
   | storage_configuration.disks.*obs_cache*.path     | 本地盘缓存路径，例如：/srv/BigData/data1/clickhouse/cache/ |
   | storage_configuration.disks.*obs_cache*.max_size | 缓存大小，例如：10Gi                                    |
   | storage_configuration.disks.*obs_cache*.disk     | OBS存储盘名称，例如：disk_s3。                            |
      
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
   **obs*_*cache**为OBS缓存名称，可以自定义修改。
   图8clickhouse-config-customize参数配置OBS缓存示例   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001849983296.png "点击放大") 
 
 #### 配置磁盘存储策略
在FusionInsight Manager上配置磁盘存储策略。
1. 登录Manager页面，选择"集群 \> ClickHouse \> 实例"，单击任意一个ClickHouseServer，在实例概览页面，单击"config.xml"文件。
   图9获取config.xml   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001896222737.png "点击放大") 
2. 在config.xml文件中，获取storage_configuration标签下的disk标签值，例如下图所示：
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001850142020.png "点击放大")
   

3. 选择"集群 \> ClickHouse \> 配置 \> 全部配置 \> ClickHouse（服务）"，搜索"_clickhouse.storage_configuration.policies"参数。
   在"_clickhouse.storage_configuration.policies"参数项，参考下表配置如下参数。
   
   | 配置项名称                                                                                        | 配置项取值       | 说明                                                                                                                                                                                                                                                                                                                                 |
   |:---|:---|:---|
   | storage_configuration.policies.*hot_cold_separation_policy* .volumes.*hot_volume*.disk\[1\]  | disk1       | 该配置项为本地磁盘配置项，根据当前数据盘情况可以配置多个，范围为disk1到diskn，具体参数值获取可以参考[2]。 **hot_cold_separation_policy**：为策略项的名称，可以自定义修改。 **hot_volume**：热数据存储策略卷名，可以自定义修改。                                                                                      |
   | storage_configuration.policies.*hot_cold_separation_policy* .volumes.*hot_volume*.disk\[2\]  | disk2       | 该配置项为本地磁盘配置项，根据当前数据盘情况可以配置多个，范围为disk1到diskn，具体参数值获取可以参考[2]。 **hot_cold_separation_policy**：为策略项的名称，可以自定义修改。 **hot_volume**：热数据存储策略卷名，可以自定义修改。                                                                                      |
   | storage_configuration.policies.*hot_cold_separation_policy* .volumes.*hot_volume*.disk\[n\]  | diskn       | 该配置项为本地磁盘配置项，根据当前数据盘情况可以配置多个，范围为disk1到diskn，具体参数值获取可以参考[2]。 **hot_cold_separation_policy**：为策略项的名称，可以自定义修改。 **hot_volume**：热数据存储策略卷名，可以自定义修改。                                                                                      |
   | storage_configuration.policies.*hot_cold_separation_policy*.volumes.hot_volume.priority      | 1           | 热数据存储策略卷的优先级，该参数值比storage_configuration.policies.*hot_cold_separation_policy*.volumes.cold_obs_volume.priority值大，表示热数据盘优先级比冷存储盘优先级高。                                                                                                                                                                                               |
   | storage_configuration.policies.*hot_cold_separation_policy*.volumes.cold_obs_volume.priority | 0           | 冷数据存储策略卷的优先级，该参数值比storage_configuration.policies.*hot_cold_separation_policy*.volumes.hot_volume.priority值小，表示冷存储盘优先级比热数据盘优先级低。                                                                                                                                                                                                    |
   | storage_configuration.policies.*hot_cold_separation_policy* .volumes.*cold_obs_volume*.disk  | 配置OBS盘或缓存名称 | **cold_obs_volume**：OBS冷数据存储策略卷名，可以自定义修改。 - 当不使用本地盘缓存时，配置OBS盘名称，例如**disk_s3**。  - 当使用本地磁盘缓存时，配置缓存的名称**，** 例如**obs*_*cache**。   |
   | storage_configuration.policies.*hot_cold_separation_policy*.move_factor                      | 0.1         | **move_factor**为数据移动策略。表示当卷的可用容量低于move_factor参数设定的值时，数据将被自动地移动到下一个卷。本例中当hot卷的容量低于10%的时候，hot卷中的数据将被自动地移动到cold卷。取值范围：0\~1。                                                                                                                                                                                                           |
      
   存储策略配置参考如下图所示：
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002497190005.png "点击放大")
   
4. 保存并重启ClickHouse服务。
 
 #### 自定义冷热分离数据存储策略
1. 使用**clickhouse client** 客户端命令连接ClickHouseServer节点，具体请参考[ClickHouse客户端使用实践](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2345.html)。
2. 创建配置冷热存储TTL策略的ReplicatedMergeTree表。 ClickHouse支持表级别的TTL表达式，允许您设置基于时间的规则，从而能够自动地在指定的磁盘或者卷之间移动数据，以实现了数据在不同的存储层之间的分层存储。
   具体建表语句参考如下：
   ```
   CREATE TABLE example_table on cluster default_cluster
    ( 
   d DateTime, 
   a Int
   ) 
   ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/example_table', '{replica}')
   PARTITION BY toYYYYMM(d) 
   ORDER BY d 
   TTL d + INTERVAL 3 YEAR, 
   d + INTERVAL 1 YEAR TO VOLUME 'cold_obs_volume' 
   SETTINGS storage_policy = 'hot_cold_separation_policy';
   ```
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
   以上示例，加粗部分为TTL配置。该示例将example_table表中d时间列三年后的冷数据删除，d时间列一年后的冷数据转存到OBS。
   TTL表达式只是一个简单的SQL表达式，里边包含了时间以及时间的间隔，例如：
   - 数据存活的时间为date_time时间的3天之后。
     ```
     TTL date_time + INTERVAL 3 DAY
     ```
     
   
   - 数据存活的时间为date_time时间的1年之后。
     ```
     TTL date_time + INTERVAL 1 YEAR
     ```
     
   
   
   INTERVAL支持的操作：second，minute，hour，day，week，month，quarter，year。
   **storage_policy** ：指定自定义存储策略配置。当前示例为[3]"_clickhouse.storage_configuration.disks"参数中自定义的策略名。
   
 
 #### 导入数据ClickHouse测试验证
1. 执行以下命令插入验证数据：
   ```
   insert into example_table values('2023-12-27','10086');  -- hot data
   insert into example_table values('2023-12-26','10086');  -- hot data
   insert into example_table values('2022-12-24','10086');  -- cold data
   insert into example_table values('2022-11-24','10086');  -- cold data
   insert into example_table values('2018-10-01','10086');  -- deleted data
   insert into example_table values('2017-10-01','10086');  -- deleted data
   ```
   
2. 查询表数据。
   ```
   tesspmrB0002.mrs-dviw.com :) select * from example_table FORMAT CSV;
   SELECT *
   FROM example_table
   FORMAT CSV
   Query id: 3d6bfcb4-f082-4e97-8d95-f885e22ae689
    
   "2023-12-27 00:00:00",10086
   "2023-12-26 00:00:00",10086
   "2022-11-24 00:00:00",10086
   "2022-12-24 00:00:00",10086
    
   4 rows in set. Elapsed: 0.037 sec.
   ```
   当前系统时间为2024年4月份，根据TTL策略规则example_table表d列为'2018-10-01'和'2017-10-01'的数据已被删除。
   
3. 执行以下查询hot data和cold data的存储路径。 **select name, partition, active, path from system.parts where database = '** *数据库名* **' and table= '** *表名* **' and active = 1;**
   图10冷热数据查询结果   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001849983312.png "点击放大")
   当前系统时间为2024年4月份，example_table表d列为'202211'和'202212'超过一年的数据存储到了名disk_s3的OBS下。
   
 
