Elasticsearch中數(shù)據(jù)是如何存儲(chǔ)的?
使用Elasticsearch的時(shí)候,我們常常需要關(guān)注數(shù)據(jù)存儲(chǔ)在Elasticsearch中的存儲(chǔ)容量。下面,我們來了解一下Elasticsearch中的數(shù)據(jù)是如何存儲(chǔ)。
一、Elasticsearch索引結(jié)構(gòu)
Elasticsearch對(duì)外提供的是index的概念,可以類比為MySQL DB,用戶查詢是在index上完成的,每個(gè)index由若干個(gè)shard組成,以此來達(dá)到分布式可擴(kuò)展的能力。比如下圖是一個(gè)由10個(gè)shard組成的index。

shard是Elasticsearch數(shù)據(jù)存儲(chǔ)的最小單位,index的存儲(chǔ)容量為所有shard的存儲(chǔ)容量之和。Elasticsearch集群的存儲(chǔ)容量則為所有index存儲(chǔ)容量之和。
一個(gè)shard就對(duì)應(yīng)了一個(gè)lucene的library。對(duì)于一個(gè)shard,Elasticsearch增加了translog的功能,類似于HBase WAL,是數(shù)據(jù)寫入過程中的中間數(shù)據(jù),其余的數(shù)據(jù)都在lucene庫中管理的。
所以,Elasticsearch索引使用的存儲(chǔ)內(nèi)容主要取決于lucene中的數(shù)據(jù)存儲(chǔ)。
二、lucene數(shù)據(jù)存儲(chǔ)
下面了解一下lucene的基本概念。
1. lucene基本概念
- segment : lucene內(nèi)部的數(shù)據(jù)是由一個(gè)個(gè)segment組成的,寫入lucene的數(shù)據(jù)并不直接落盤,而是先寫在內(nèi)存中,經(jīng)過了refresh間隔,lucene才將該時(shí)間段寫入的全部數(shù)據(jù)refresh成一個(gè)segment,segment多了之后會(huì)進(jìn)行merge成更大的segment。lucene查詢時(shí)會(huì)遍歷每個(gè)segment完成。由于lucene 寫入的數(shù)據(jù)是在內(nèi)存中完成,所以寫入效率非常高。但是也存在丟失數(shù)據(jù)的風(fēng)險(xiǎn),所以Elasticsearch基于此現(xiàn)象實(shí)現(xiàn)了translog,只有在segment數(shù)據(jù)落盤后,Elasticsearch才會(huì)刪除對(duì)應(yīng)的translog。
- doc : doc表示lucene中的一條記錄。
- field :field表示記錄中的字段概念,一個(gè)doc由若干個(gè)field組成。
- term :term是lucene中索引的最小單位,某個(gè)field對(duì)應(yīng)的內(nèi)容如果是全文檢索類型,會(huì)將內(nèi)容進(jìn)行分詞,分詞的結(jié)果就是由term組成的。如果是不分詞的字段,那么該字段的內(nèi)容就是一個(gè)term。
- 倒排索引(inverted index): lucene索引的通用叫法,即實(shí)現(xiàn)了term到doc list的映射。

- 正排數(shù)據(jù):搜索引擎的通用叫法,即原始數(shù)據(jù),可以理解為一個(gè)doc list。
- doc values:Elasticsearch中的列式存儲(chǔ)的名稱,Elasticsearch除了存儲(chǔ)原始數(shù)據(jù)、倒排索引,還存儲(chǔ)了一份doc values,用作分析和排序。doc values 的存在是因?yàn)榈古潘饕粚?duì)某些操作是高效的。 倒排索引的優(yōu)勢(shì)在于查找包含某個(gè)項(xiàng)的文檔,而對(duì)于從另外一個(gè)方向的相反操作并不高效,即:確定哪些項(xiàng)是否存在單個(gè)文檔里,聚合需要這種次級(jí)的訪問模式。

2. lucene文件內(nèi)容
lucene包的文件是由很多segment文件組成的,segments_xxx文件記錄了lucene包下面的segment文件數(shù)量。每個(gè)segment會(huì)包含如下的文件。


一份數(shù)據(jù)寫入Elasticsearch 會(huì)產(chǎn)生多份數(shù)據(jù)用于不同查詢方式,會(huì)比原數(shù)據(jù)占用更多磁盤空間。
對(duì)照上面的lucene文件表,進(jìn)行簡(jiǎn)要?dú)w納:
- 存儲(chǔ)原文_source的文件.fdt .fdm .fdx;
- 存儲(chǔ)倒排索引的文件.tim .tip .doc;
- 用于聚合排序的列存文件.dvd .dvm;
- 全文檢索文件.pos .pay .nvd .nvm等;
- 加載到內(nèi)存中的文件有.fdx .tip .dvm;
其中.tip占用內(nèi)存最大,而.fdt、.tim、.dvd文件占用磁盤最大。