本文為您介紹在阿里雲E-MapReduce的ClickHouse叢集上,如何通過OSS進行資料的冷熱分離。通過本文操作,您既可以在保證叢集讀寫效能的基礎上,自動維護叢集上的冷熱資料,又可以充分利用計算和儲存資源,以降低成本。
前提條件
已在EMR控制台上建立EMR-5.7.0及以上版本的ClickHouse叢集,詳情請參見建立ClickHouse叢集。
使用限制
本文操作僅適用於EMR-5.7.0及以上版本的ClickHouse叢集。
操作流程
步驟一:在EMR控制台添加磁碟
進入ClickHouse配置頁面。
在頂部功能表列處,根據實際情況選擇地區和資源群組。
在EMR on ECS頁面,單擊目的地組群操作列的叢集服務。
在叢集服務頁面,單擊ClickHouse服務地區的配置。
在配置頁面,單擊server-metrika頁簽。
修改storage_configuration的參數值。
在disks中添加一個磁碟。
詳細資料如下。
<disk_oss> <type>s3</type> <endpoint>http(s)://${yourBucketName}.${yourEndpoint}/${yourFlieName}</endpoint> <access_key_id>${YOUR_ACCESS_KEY_ID}</access_key_id> <secret_access_key>${YOUR_ACCESS_KEY_SECRET}</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。
endpoint
是
OSS服務的地址。格式為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。
在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策略中。
部署用戶端配置。
在ClickHouse服務的配置頁面,單擊部署用戶端配置。
在部署CLICKHOUSE用戶端配置對話方塊中,輸入執行原因,單擊確定。
在確認對話方塊中,單擊確定。
部署用戶端配置。
在ClickHouse服務的配置頁面,單擊部署用戶端配置。
在部署CLICKHOUSE用戶端配置對話方塊中,輸入執行原因,單擊確定。
在確認對話方塊中,單擊確定。
步驟二:驗證配置
使用SSH方式登入ClickHouse叢集,詳情請參見登入叢集。
執行如下命令,啟動ClickHouse用戶端。
clickhouse-client -h core-1-1 -m說明本樣本登入core-1-1節點,如果您有多個Core節點,可以登入任意一個節點。
執行如下命令,查看磁碟資訊。
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 │ └──────────┴─────────────────────────────────────┴──────────────────────┴──────────────────────┴─────────────────┴───────┘執行如下命令,查看磁碟儲存策略。
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 │ └─────────────┴─────────────┴─────────────────┴───────────────────────────────────┴─────────────┴────────────────────┴─────────────┴─────────────────────┘當回顯資訊如上文所示時,表示磁碟擴容操作完成。
步驟三:進行冷熱分離
對已有的表進行改造
在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>擴充當前的儲存策略。
在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>執行以下命令,修改TTL。
ALTER TABLE <yourDataName>.<yourTableName> MODIFY TTL toStartOfMinute(addMinutes(t, 5)) TO VOLUME 'remote';執行以下命令,查看各個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,詳情請參見 。