前面在介紹ES做TSDB的問題剖析中宪赶,說到了ES存儲時(shí)序數(shù)據(jù)的存儲容量特別大。
針對時(shí)序數(shù)據(jù)的存儲容量大的問題哥放。ES時(shí)序引擎以及TimeStream做了很多的優(yōu)化工作智嚷,最終能將ES的存儲容量降低到之前的十分之一寒随。
存儲容量的優(yōu)化是如何做到的呢糠悯?
先來復(fù)習(xí)下ES存儲容量大的幾個(gè)原因:
- ES默認(rèn)配置,創(chuàng)建了很多時(shí)序場景不需要的索引數(shù)據(jù)
- ES存儲時(shí)序數(shù)據(jù)妻往,元數(shù)據(jù)本身的存儲容量使用空間過大互艾。
- ES針對指標(biāo)數(shù)據(jù),在doc_values的壓縮上效果不佳讯泣。
我將之前給出的基準(zhǔn)數(shù)據(jù)的存儲明細(xì)再貼出來忘朝,用以對比優(yōu)化后的效果:
其中ES Synthetic Source(合成source)優(yōu)化后,索引可以不再存儲_source判帮,這個(gè)優(yōu)化是最明顯的,存儲空間直接減少了49.3%溉箕。
接下來是TimeStream的一些優(yōu)化晦墙。
TimeStream支持通過參數(shù),來去掉_id肴茄、_seq_no的存儲晌畅。
不存儲_id后,數(shù)據(jù)不再支持針對doc的刪除和更新寡痰,但是這在時(shí)序場景抗楔,一般是不必須的。
不存儲_seq_no拦坠,TimeStream使用阿里云自研的物理復(fù)制连躏,可以不依賴_seq_no進(jìn)行數(shù)據(jù)的復(fù)制和恢復(fù),所以去掉_seq_no對ES功能影響不大贞滨,只是不能再使用CCR功能入热。如果不使用CCR,是可以關(guān)閉_seq_no的。
這樣索引存儲空間分別繼續(xù)降低了9.6%和5.3%勺良。整體的存儲空間從1.2gb降低到了437.5mb绰播。
接下來針對doc_values類型,阿里云codec插件(https://help.aliyun.com/document_detail/363036.html)支持對doc_values使用zstd壓縮算法尚困,通過將列式數(shù)據(jù)分成block蠢箩,每個(gè)block使用zstd壓縮,doc_values的數(shù)據(jù)可以得到極大的壓縮事甜,下面是開啟doc_values后谬泌,字段的壓縮效果:
- 指標(biāo)字段:128.8mb -> 87.3mb
- 維度字段:34.8mb -> 163kb
- 時(shí)間字段:14.8mb -> 6mb
然后針對指標(biāo)字段,不再需要存儲BKD索引讳侨,如果真的有對指標(biāo)數(shù)據(jù)進(jìn)行query的需求呵萨,比如一些范圍查詢,可以通過ES的doc_values only的query能力支持跨跨。這樣存儲空間又進(jìn)一步降低了129.7mb潮峦。
針對維度字段,首先只使用keyword索引勇婴,然后倒排索引也是用阿里云codec插件忱嘹,將posting數(shù)據(jù)使用zstd壓縮,存儲空間可以從108.7mb降低為398.1kb耕渴。
所以優(yōu)化后拘悦,整體的存儲容量如下:
經(jīng)過優(yōu)化,存儲空間從1.2gb降低到了114.5mb橱脸,存儲容量直接減少到之前的十分之一础米。