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的映射