Clickhouse存算分離,離線資料使用oss,s3儲存

Clickhouse存算分離,離線資料使用oss,s3儲存

clickhouse

前言

上一篇簡單介紹了clickhouse如何實現多磁碟儲存,實現資料的冷熱分離。但是磁碟價格還是相對比較貴,成本比較高,擴容比較麻煩。對比之下,筆者採用了阿里雲oss和亞馬遜S3來作為clickhouse的離線資料儲存,價格便宜而且基本上沒有儲存額度的限制。本文就來介紹一下如何使用阿里雲oss和亞馬遜S3來作為clickhouse的儲存。

clickhouse部署方式大概分為裸部署、docker部署以及K8S部署。clickhouse原生不支援阿里雲oss儲存,所以可以採用先掛載後使用的方式,此方式類似於磁碟掛載,只不過把磁碟換成了網盤,具體可以參考上一篇文章。clickhouse在v20。4。2。9版本之後原生支援亞馬遜S3,所以配置起來比較簡單。本篇主要是記錄一下k8s部署的clickhouse如何使用阿里雲oss儲存以及亞馬遜S3儲存。

使用阿里雲oss儲存

檢視阿里雲文件,可以發現阿里雲並未提供動態的oss儲存,所以我們就不能建立StorageClass,但是提供了靜態oss儲存,可以把bucket透過volumes掛載進去,只需要在yaml檔案裡新增以下內容:

volumeMounts: - name: “oss” mountPath: “/data” livenessProbe: exec: command: - sh - -c - cd /data initialDelaySeconds: 30 periodSeconds: 30 volumes: - name: “oss” flexVolume: driver: “alicloud/oss” options: bucket: “docker” url: “oss-cn-hangzhou。aliyuncs。com” akId: *** akSecret: *** otherOpts: “-o max_stat_cache_size=0 -o allow_other”

以上是阿里雲文件中的一個示例,可以看到name為oss的volumes。

筆者是使用helm方式部署的clickhouse,原理基本相同,修改下部署模板即可,主要修改statefulset-clickhouse。yaml,新增以下內容即可:

volumeMounts: {{- if 。Values。oss。enabled }} - name: oss mountPath: {{ 。Values。oss。mountPath }} {{- end }} ……。 volumes: {{- if 。Values。oss。enabled }} - name: “oss” flexVolume: driver: “alicloud/oss” options: bucket: {{ 。Values。oss。bucket }} url: {{ 。Values。oss。url }} akId: {{ 。Values。oss。akId }} akSecret: {{ 。Values。oss。akSecret }} otherOpts: “-o max_stat_cache_size=0 -o allow_other” {{- end }}

然後在value。yaml檔案中選擇是否啟用oss儲存:

oss: enabled: true mountPath: /data_cold bucket: bucket name url: oss-cn-beijing-internal。aliyuncs。com akId: ak akSecret: sk

修改config。xml主配置檔案,新增policy:

{{- if 。Values。oss。enabled }} /data_cold/ default cold_storage {{- end }}

冷資料cold_storage存放路徑為/data_cold,同時建立diskOss的儲存policies。

helm部署啟動後,檢視我們的策略是否生效:

Clickhouse存算分離,離線資料使用oss,s3儲存

可以看到已經生效!

使用亞馬遜S3儲存

使用S3儲存,只需要修改下主配置檔案即可。

{{- if 。Values。s3。enabled }} s3 {{ 。Values。s3。url }} {{ 。Values。s3。ak }} {{ 。Values。s3。sk }} default cold_storage {{- end }}

冷資料cold_storage存放路徑為/data_cold,同時建立diskS3的儲存policies。

然後在value。yaml中配置是否啟用S3儲存:

s3: enabled: true ak: ak sk: sk/hbwgR1g1VEiYx74iBEWXF6pi url: https://bucket。s3-us-west-2。amazonaws。com/dir/

helm部署啟動後,檢視我們的策略是否生效:

Clickhouse存算分離,離線資料使用oss,s3儲存

可以看到也已經生效了。

現在我們把oss及s3掛載進去了,但是如何使用呢?

建立MergeTree表,使用冷儲存

其實使用起來也非常簡單,只需要在建立表時設定上一步驟中建立的儲存策略SETTINGS storage_policy = ‘s3’或者storage_policy = ‘oss’即可。

以S3為例:

Clickhouse存算分離,離線資料使用oss,s3儲存

建立s3_example表,使用s3儲存,並且將1天前的資料放入s3。

插入6條測試資料驗證儲存是否生效:

clickhouse-s3 :) insert into s3_example values(‘2020-12-21 14:00:00’,1);INSERT INTO s3_example VALUESQuery id: ff065481-f7af-40f5-bbc4-2f063568b558Ok。1 rows in set。 Elapsed: 0。003 sec。clickhouse-s3 :) insert into s3_example values(‘2020-12-21 15:00:00’,2);INSERT INTO s3_example VALUESQuery id: 570c064a-1106-44dd-b31c-8b6ec47de201Ok。1 rows in set。 Elapsed: 0。004 sec。clickhouse-s3 :) insert into s3_example values(‘2020-12-21 16:00:00’,3);INSERT INTO s3_example VALUESQuery id: 4ecbfbb2-2d7e-42d0-bd24-00c912ce1271Ok。1 rows in set。 Elapsed: 0。003 sec。clickhouse-s3 :) insert into s3_example values(‘2020-12-19 14:00:00’,1);INSERT INTO s3_example VALUESQuery id: a4000863-4cc0-4c38-a9af-81d6519035cfOk。1 rows in set。 Elapsed: 0。547 sec。clickhouse-s3 :) insert into s3_example values(‘2020-12-19 15:00:00’,2);INSERT INTO s3_example VALUESQuery id: 19de377b-fd2e-4f0f-b014-3cf0542ce6acOk。1 rows in set。 Elapsed: 0。410 sec。clickhouse-s3 :) insert into s3_example values(‘2020-12-19 16:00:00’,3);INSERT INTO s3_example VALUESQuery id: cfc5e23a-48c7-4378-ba55-e5581860af44Ok。1 rows in set。 Elapsed: 0。398 sec。

可以很清楚的看到,插入前幾天資料的時候,時間明顯變慢了。

檢視s3_example這張表的資料儲存:

Clickhouse存算分離,離線資料使用oss,s3儲存

可以看到儲存分成了兩個地方,一個是default的ssd磁碟,另一個就是我們的冷盤。

檢視s3中是否有真實資料存在:

Clickhouse存算分離,離線資料使用oss,s3儲存

真實資料已經存在。

結束語

使用OSS或者S3這種儲存,效能肯定與SSD相差巨大,適合存不經常查詢的資料,所以建表的時候TTL需要考慮清楚,雖然可以修改,但是當資料量逐漸增大的時候,修改起來也是比較麻煩的。本文介紹了一下筆者自己使用clickhouse儲存的一個情況,如果大家有什麼不明白的,可以隨時私信或者留言,我看到後會及時回覆。本文用法若有什麼不對的地方,也歡迎大家提出寶貴意見,一起進步!