本文為您介紹在阿里云E-MapReduce的ClickHouse集群上,如何通過OSS進行數據的冷熱分離。通過本文操作,您既可以在保證集群讀寫性能的基礎上,自動維護集群上的冷熱數據,又可以充分利用計算和存儲資源,以降低成本。

前提條件

已在EMR控制臺上創建EMR-5.7.0及以上版本的ClickHouse集群,詳情請參見創建ClickHouse集群

使用限制

本文操作僅適用于EMR-5.7.0及以上版本的ClickHouse集群。

操作流程

  1. 步驟一:在EMR控制臺添加磁盤
  2. 步驟二:驗證配置
  3. 步驟三:進行冷熱分離

步驟一:在EMR控制臺添加磁盤

  1. 進入ClickHouse配置頁面。
    1. 登錄EMR on ECS控制臺
    2. 在頂部菜單欄處,根據實際情況選擇地域和資源組
    3. 集群管理頁面,單擊目標集群操作列的集群服務
    4. 集群服務頁面,單擊ClickHouse服務區域的配置
  2. 服務配置區域,單擊server-metrika頁簽。
  3. 修改storage_configuration的參數值。
    1. disks中添加一個磁盤。
      詳細信息如下。
      <disk_oss>
          <type>s3</type>
          <endpoint>http(s)://${yourBucketName}.${yourEndpoint}/${yourFlieName}</endpoint>
          <access_key_id>${yourAccessKeyId}</access_key_id>
          <secret_access_key>${yourAccessKeySecret}</secret_access_key>
          <send_metadata>false</send_metadata>
          <metadata_path>${yourMetadataPath}</metadata_path>
          <cache_enabled>true</cache_enabled>
          <cache_path>${yourCachePath}</cache_path>
          <skip_access_check>false</skip_access_check>
          <min_bytes_for_seek>1048576</min_bytes_for_seek>
          <thread_pool_size>16</thread_pool_size>
          <list_object_keys_size>1000</list_object_keys_size>
        </disk_oss>
      相關參數描述如下。
      參數是否必填描述
      disk_oss磁盤的名稱,您可以自定義。
      type磁盤的類型,固定值為s3
      endpointOSS服務的地址。格式為http(s)://${yourBucketName}.${yourEndpoint}/${yourFlieName}
      說明 endpoint參數值必須以HTTP或HTTPS開頭,其中,${yourBucketName}為OSS的Bucket名稱,${yourEndpoint}為OSS的訪問域名,{yourFlieName}為OSS上的文件名稱。例如http://clickhouse.oss-cn-hangzhou-internal.aliyuncs.com/test
      access_key_id阿里云賬號的AccessKey ID。

      獲取方法請參見獲取AccessKey

      secret_access_key阿里云賬號的AccessKey Secret。

      用于加密簽名字符串和OSS,用來驗證簽名字符串的密鑰。獲取方法請參見獲取AccessKey

      send_metadata在操作OSS文件時,是否添加元數據信息。參數取值如下:
      • true:添加元數據信息。
      • false(默認值):不添加元數據信息。
      metadata_path用于存放本地文件與OSS文件的映射關系。
      默認值為${path}/disks/<disk_name>/
      說明 <disk_name>是磁盤的名稱,對應參數disk_oss
      cache_enabled是否開啟緩存。參數取值如下:
      • true(默認值):開啟緩存。
      • false:不開啟緩存。
      Cache具體作用如下:
      • OSS目前所使用的Cache僅用于本地緩存以.idx.mrk.mrk2.mrk3.txt.dat為后綴的文件。除了這些文件外,仍然會直接讀OSS而非讀緩存。
      • 本地Cache沒有容量限制,最大容量即為存儲的磁盤容量。
      • 本地Cache不會以LRU(Least Recently Used)算法之類的策略清理緩存,而是隨著文件的生命周期而存在。
      • 數據第一次被讀取時,如果在本地Cache中不存在,則會從OSS中將文件下載至Cache中。
      • 第一次寫入數據時,僅會先寫入本地Cache,之后才會從本地Cache寫入至OSS中。
      • 如果一個文件在OSS中被刪除,則也會將本地Cache清除;如果一個文件在OSS中被重命名,則也會在本地Cache中重命名。
      cache_path緩存路徑。

      默認值為${path}/disks/<disk_name>/cache/

      skip_access_check在加載磁盤時,是否檢查具有對磁盤的讀寫權限。參數取值如下:
      • true(默認值):檢查。
      • false:不檢查。
      min_bytes_for_seek最小使用Seek的Byte數量,低于該值時會用Skip代替Seek。默認值為1048576。
      thread_pool_size磁盤用于執行restore命令時所使用的線程池的大小。默認值為16。
      list_object_keys_size在某一個key下,單次能夠列出的對象最大數目。默認值為1000。
    2. policies中添加一個新的策略。
      策略內容如下。
      <oss_ttl>
          <volumes>
            <local>
              <!-- 包含默認存儲策略下所有的磁盤 -->
              <disk>disk1</disk>
              <disk>disk2</disk>
              <disk>disk3</disk>
              <disk>disk4</disk>
            </local>
            <remote>
              <disk>disk_oss</disk>
            </remote>
          </volumes>
          <move_factor>0.2</move_factor>
      </oss_ttl>
      說明 該部分內容也可以直接添加在default策略中。
  4. 保存配置。
    1. 在ClickHouse服務的配置頁面,單擊保存
    2. 確認修改對話框中,輸入執行原因,打開自動更新配置開關,單擊確定
  5. 部署客戶端配置。
    1. 在ClickHouse服務的配置頁面,單擊部署客戶端配置
    2. 執行集群操作對話框中,輸入執行原因,單擊確定
    3. 確認對話框中,單擊確定

步驟二:驗證配置

  1. 使用SSH方式登錄ClickHouse集群,詳情請參見登錄集群
  2. 執行如下命令,啟動ClickHouse客戶端。
    clickhouse-client -h core-1-1 -m
    說明 本示例登錄core-1-1節點,如果您有多個Core節點,可以登錄任意一個節點。
  3. 執行如下命令,查看磁盤信息。
    select * from system.disks;
    返回信息如下所示。
    ┌─name─────┬─path────────────────────────────────┬───────────free_space─┬──────────total_space─┬─keep_free_space─┬─type──┐
    │ default  │ /var/lib/clickhouse/                │          83868921856 │          84014424064 │               0 │ local  │
    │ disk1    │ /mnt/disk1/clickhouse/              │          83858436096 │          84003938304 │        10485760 │ local  │
    │ disk2    │ /mnt/disk2/clickhouse/              │          83928215552 │          84003938304 │        10485760 │ local  │
    │ disk3    │ /mnt/disk3/clickhouse/              │          83928301568 │          84003938304 │        10485760 │ local  │
    │ disk4    │ /mnt/disk4/clickhouse/              │          83928301568 │          84003938304 │        10485760 │ local  │
    │ disk_oss │ /var/lib/clickhouse/disks/disk_oss/ │ 18446744073709551615 │ 18446744073709551615 │               0 │ oss   │
    └──────────┴─────────────────────────────────────┴──────────────────────┴──────────────────────┴─────────────────┴───────┘
                                
  4. 執行如下命令,查看磁盤存儲策略。
    select * from system.storage_policies;
    返回信息如下所示。
    ┌─policy_name─┬─volume_name─┬─volume_priority─┬─disks─────────────────────────────┬─volume_type─┬─max_data_part_size─┬─move_factor─┬─prefer_not_to_merge─┐
    │ default     │ single      │               1 │ ['disk1','disk2','disk3','disk4']          │JBOD        │                  0 │           0 │                   0 │
    │ oss_ttl     │ local       │               1 │ ['disk1','disk2','disk3','disk4']          │JBOD        │                  0 │          0.2 │                   0 │
    │ oss_ttl     │ remote      │               2 │ ['disk_oss']                         │JBOD        │                  0 │          0.2 │                   0 │
    └─────────────┴─────────────┴─────────────────┴───────────────────────────────────┴─────────────┴────────────────────┴─────────────┴─────────────────────┘
    當回顯信息如上文所示時,表示磁盤擴容操作完成。

步驟三:進行冷熱分離

對已有的表進行改造

  1. 在ClickHouse客戶端執行如下命令,查看當前的存儲策略。
    SELECT
      storage_policy
    FROM system.tables
    WHERE database='<yourDatabaseName>' AND name='<yourTableName>';

    本文示例中命令中的<yourDataName>為數據庫名,<yourTableName>為表名。

    如果返回信息如下所示,則需要參見下一步驟添加一個volume。
    <default>
      <volumes>
        <single>
          <disk>disk1</disk>
          <disk>disk2</disk>
          <disk>disk3</disk>
          <disk>disk4</disk>
        </single>
      </volumes>
    </default>
  2. 擴展當前的存儲策略。
    在EMR控制臺ClickHouse服務的配置頁簽,增加volume內容,詳細信息如下。
    <default>
      <volumes>
        <single>
          <disk>disk1</disk>
          <disk>disk2</disk>
          <disk>disk3</disk>
          <disk>disk4</disk>
        </single>
        <!-- 以下是新增的volume remote -->
        <remote>
          <disk>disk_oss</disk>
        </remote>
      </volumes>
      <!-- 多個volume時需要指定move_factor -->
      <move_factor>0.2</move_factor>
    </default>
  3. 執行以下命令,修改TTL。
    ALTER TABLE <yourDataName>.<yourTableName>
      MODIFY TTL toStartOfMinute(addMinutes(t, 5)) TO VOLUME 'remote';
  4. 執行以下命令,查看各個part的分布。
    select partition,name,path from system.parts where database='<yourDataName>' and table='<yourTableName>' and active=1
    返回信息如下。
    
    ┌─partition───────────┬─name─────────────────────┬─path──────────────────────────────────────────────────────────────────────────────────────────────────────┐
    │ 2022-01-11 19:55:00 │ 1641902100_1_90_3_193    │ /var/lib/clickhouse/disks/disk_oss/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902100_1_90_3_193/  │
    │ 2022-01-11 19:55:00 │ 1641902100_91_96_1_193   │ /var/lib/clickhouse/disks/disk_oss/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902100_91_96_1_193/ │
    │ 2022-01-11 20:00:00 │ 1641902400_97_124_2_193  │ /mnt/disk3/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_97_124_2_193/             │
    │ 2022-01-11 20:00:00 │ 1641902400_125_152_2_193 │ /mnt/disk2/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_125_152_2_193/            │
    │ 2022-01-11 20:00:00 │ 1641902400_153_180_2_193 │ /mnt/disk4/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_153_180_2_193/            │
    │ 2022-01-11 20:00:00 │ 1641902400_181_186_1_193 │ /mnt/disk3/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_181_186_1_193/            │
    │ 2022-01-11 20:00:00 │ 1641902400_187_192_1_193 │ /mnt/disk4/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_187_192_1_193/            │
    └─────────────────────┴──────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────┘
    
    7 rows in set. Elapsed: 0.002 sec.
    說明 如果結果類似上所示,則表明數據根據時間做了冷熱分離。熱數據存放在本地盤中,冷數據存放在OSS中。

    其中,/var/lib/clickhouse/disks/disk_oss是disk_oss的metadata_path的默認值。/mnt/disk{1..4}/clickhouse是本地盤路徑。

創建新的表

  • 創建語法
    CREATE TABLE <yourDataName>.<yourTableName> [ON CLUSTER cluster_emr]
    (
      column1 Type1,
      column2 Type2,
      ...
    ) Engine = MergeTree() -- or Replicated*MergeTree()
    PARTITION BY <yourPartitionKey>
    ORDER BY <yourPartitionKey>
    TTL <yourTtlKey> TO VOLUME 'remote'
    SETTINGS storage_policy='oss_ttl';
    說明 命令中的<yourPartitionKey>為ClickHouse的分區鍵。<yourTtlKey>為您設置的TTL信息。
  • 示例
    CREATE TABLE test.test
    (
        `id` UInt32,
        `t` DateTime
    )
    ENGINE = MergeTree()
    PARTITION BY toStartOfFiveMinute(t)
    ORDER BY id
    TTL toStartOfMinute(addMinutes(t, 5)) TO VOLUME 'remote'
    SETTINGS storage_policy='oss_ttl';
    說明 本示例中,表格會將5分鐘內的數據存放在本地,過了5分鐘后,數據會被移動到remote volume中,也就是OSS中。

相關配置

  • server-config

    merge_tree.allow_remote_fs_zero_copy_replication:設置為true,以在Replicated*MergeTree使用DiskOSS等遠程存儲時利用OSS的多副本進行備份,ClickHouse的一個Shard下的多個副本中的數據僅會備份元數據。

  • server-users
    • profile.${your-profile-name}.s3_min_upload_part_size:Write Buffer中的數據量高于該參數值時,會將數據寫到OSS中。
    • profile.${your-profile-name}.s3_max_single_part_upload_size}:Write Buffer中的數據量高于該參數值時,使用MultipartUpload,詳情請參見分片上傳(MultipartUpload)