當前位置:成語大全網 - 漢語詞典 - 彈性搜索數據存儲內容

彈性搜索數據存儲內容

很多使用Elasticsearch的同學都會關心ES中存儲的數據的存儲容量,會有這樣的疑問:xxTB進入ES會使用多少存儲空間?這個問題其實很難直接回答。只有將數據寫入ES後,才能觀察到實際的存儲空間。比如同樣是1TB的數據,寫入ES的存儲空間可能會有很大的不同,可能小到300~400GB,也可能大到6-7TB。為什麽差距這麽大?究其原因,我們來探究壹下Elasticsearch中的數據是如何存儲的。本文中我以Elasticsearch版本為例,對應的lucene版本是5.5。彈性搜索現在已經到了6.5版本,數字類型、列存儲等存儲結構有了壹點變化,但基本概念變化不大,本文內容依然適用。

Elasticsearch提供了index的概念,可以比作DB。用戶的查詢是在索引上完成的,每個索引由若幹個分片組成,從而實現分布式和可擴展的能力。比如下圖是10 shard組成的索引。

Shard是Elasticsearch數據存儲的最小單位,索引的存儲容量是所有shard的總和。Elasticsearch集群的存儲容量是所有索引存儲容量的總和。

壹個碎片對應壹個lucene庫。對於壹個shard,Elasticsearch增加了translog的功能,類似於HBase WAL。它是數據寫入過程中的中間數據,其余數據在lucene庫中管理。

所以Elasticsearch index使用的存儲內容主要依賴於lucene中的數據存儲。

讓我們來看看lucene文件的內容。在了解lucene的文件內容之前,我們先了解壹下lucene的壹些基本概念。

lucene包的文件由很多段文件組成,segments_xxx文件記錄了lucene包下段文件的數量。每個段將包含以下文件。

我們以真實數據為例,看看lucene中各種類型數據的容量比。

寫100w數據,有壹個uuid字段,寫長度為36位的uuid。總字符串為3600w字節,約為35M。

數據使用沒有副本的碎片,並使用默認的壓縮算法。寫完後,為了便於觀察,它被合並成壹段。

使用在線默認配置,uuid被保存為不帶分詞的字符串類型。創建以下索引:

先寫100w不同的uuid,使用磁盤容量的細節如下:

可以看出,前向行和倒排索引的數據占列存儲數據的比例幾乎相同,前向行和倒排的數據也會存儲Elasticsearch的唯壹id字段,所以容量會比列存儲多。

35M uuid存儲在Elasticsearch後,數據膨脹了三倍,達到122.7mb,Elasticsearch消耗了這麽多資源,先不要妄下結論,再看另壹個測試結果。

我們先把uuid寫成100w,然後看看Elasticsearch用的容量。

這次35M數據的Elasticsearch容量只有13.2mb,其中主要比例是Elasticsearch的唯壹id,100w的uuid幾乎不占用存儲容量。

因此,如果在Elasticsearch中索引的字段具有較大的count distinct,它將占用更多的磁盤空間。

讓我們看看保存100w個不同的整數會是什麽樣子。

從結果可以看出,Elasticsearch的存儲開銷為100w整數數據。100w數據的長度如果以int的形式計算,則為400w字節,約為3.8mb數據。忽略Elasticsearch的唯壹id字段的影響,Elasticsearch的實際存儲容量和整數數據的長度差不多。

讓我們來看看打開最佳壓縮參數對存儲空間的影響:

結果可以發現只有正投影數據才會開始壓縮,壓縮能力真的很強。不考慮唯壹id字段,存儲容量被壓縮了近50%。

我們也做了壹些實驗。Elasticsearch默認開啟_all參數,_all可以將用戶傳入的整個json數據作為全文搜索的字段,可以更加方便搜索。但是在現實場景中並沒有太多的使用,反而會增加很多存儲容量的成本。可以看到打開_all的磁盤空間使用情況:

開啟_all比關閉多40mb的存儲空間,更多的數據在倒排索引中,會增加30%左右的存儲開銷。所以直接在線禁用。

然後我又做了幾次其他的嘗試。為了驗證存儲容量是否與數據量成正比,我寫了1000w數據的uuid,發現存儲容量基本是100w數據的10倍。我還驗證了數據的長度是否與數據量成正比,發現增加uuid時存儲容量分別增加了2倍和4倍。這裏就不壹壹列舉數據了。

文件名是:segments_xxx

這個文件是lucene數據文件的元數據文件,記錄了所有段的元數據信息。

這個文件主要記錄了目前有多少段,每段都有壹些基本信息。更新這些信息,並在每個段的元信息文件中找到它。

Lucene元信息文件也支持記錄用戶數據,其中Elasticsearch可以記錄壹些關於translog的信息。

文件後綴:。大音階第七音

每個段都有壹個. si文件,記錄了該段的元信息。

片段元信息文件記錄了該片段的文檔數、該片段對應的文件列表等信息。

文件後綴:。fnm

該文件存儲字段的基本信息。

字段信息包括字段數量、字段類型、索引操作,包括是否存儲、是否索引、是否分詞、是否列表等等。

文件後綴:。fdx,。fdt

索引文件是。fdx,數據文件是。fdt。數據存儲文件的功能是根據自動文檔id獲取文檔的內容。用搜索引擎的術語稱之為正字法數據,即Doc _ ID->;這裏存在內容和es的_source數據。

索引文件記錄快速定位文檔數據的索引信息,數據文件記錄所有文檔id的具體內容。

索引後綴:。提示,。定時(timing的縮寫)

倒排索引還包括索引文件和數據文件。tip是索引文件,而。tim是數據文件。索引文件包含每個字段的索引元信息,數據文件有具體的索引內容。

版本5.5.0的倒排索引實現為FST樹。FST樹最大的優點就是內存空間很低。詳情請參考以下文章:blogs.com/bonelee/p/6226185.html.

/fst.py?terms = & ampcmd = Build+是FST圖的壹個例子,可以根據輸入的數據來構造。

生成的FST圖為:

文件後綴:。doc,。pos,支付。

。doc保存每個$ term的文檔id列表和文檔中$ term的詞頻。

在全文索引字段中,會有壹個. pos文件,它保存了$ term在文檔中的位置

全文索引字段具有。僅通過使用壹些高級功能(如有效負載)來支付文件,這將在doc中保存壹些$ term的高級功能

文件後綴:。dvm,。刻錄機

索引文件是。dvm和數據文件是。dvd。

lucene實現的文檔值有以下類型:

SORTED_SET的SORTED _ SINGLE _ VALUED類型包括兩種類型的數據:binary+numeric,其中binary是按order排序的$ term列表,numeric是從doc到order的映射