使用Elasticsearch的时候,我们常常需要关注数据存储在Elasticsearch中的存储容量 。下面,我们来了解一下Elasticsearch中的数据是如何存储 。
一、Elasticsearch索引结构【Elasticsearch中数据是如何存储的?】Elasticsearch对外提供的是index的概念,可以类比为MySQL DB,用户查询是在index上完成的,每个index由若干个shard组成,以此来达到分布式可扩展的能力 。比如下图是一个由10个shard组成的index 。
文章插图
shard是Elasticsearch数据存储的最小单位,index的存储容量为所有shard的存储容量之和 。Elasticsearch集群的存储容量则为所有index存储容量之和 。
一个shard就对应了一个lucene的library 。对于一个shard,Elasticsearch增加了translog的功能,类似于HBase WAL,是数据写入过程中的中间数据,其余的数据都在lucene库中管理的 。
所以,Elasticsearch索引使用的存储内容主要取决于lucene中的数据存储 。
二、lucene数据存储下面了解一下lucene的基本概念 。
1. lucene基本概念
- segment : lucene内部的数据是由一个个segment组成的,写入lucene的数据并不直接落盘,而是先写在内存中,经过了refresh间隔,lucene才将该时间段写入的全部数据refresh成一个segment,segment多了之后会进行merge成更大的segment 。lucene查询时会遍历每个segment完成 。由于lucene 写入的数据是在内存中完成,所以写入效率非常高 。但是也存在丢失数据的风险,所以Elasticsearch基于此现象实现了translog,只有在segment数据落盘后,Elasticsearch才会删除对应的translog 。
- doc : doc表示lucene中的一条记录 。
- field :field表示记录中的字段概念,一个doc由若干个field组成 。
- term :term是lucene中索引的最小单位,某个field对应的内容如果是全文检索类型,会将内容进行分词,分词的结果就是由term组成的 。如果是不分词的字段,那么该字段的内容就是一个term 。
- 倒排索引(inverted index): lucene索引的通用叫法,即实现了term到doc list的映射 。
文章插图
- 正排数据:搜索引擎的通用叫法,即原始数据,可以理解为一个doc list 。
- doc values:Elasticsearch中的列式存储的名称,Elasticsearch除了存储原始数据、倒排索引,还存储了一份doc values,用作分析和排序 。doc values 的存在是因为倒排索引只对某些操作是高效的 。倒排索引的优势在于查找包含某个项的文档,而对于从另外一个方向的相反操作并不高效,即:确定哪些项是否存在单个文档里,聚合需要这种次级的访问模式 。
文章插图
2. lucene文件内容
lucene包的文件是由很多segment文件组成的,segments_xxx文件记录了lucene包下面的segment文件数量 。每个segment会包含如下的文件 。
文章插图
文章插图
一份数据写入Elasticsearch 会产生多份数据用于不同查询方式,会比原数据占用更多磁盘空间 。
对照上面的lucene文件表,进行简要归纳:
- 存储原文_source的文件.fdt .fdm .fdx;
- 存储倒排索引的文件.tim .tip .doc;
- 用于聚合排序的列存文件.dvd .dvm;
- 全文检索文件.pos .pay .nvd .nvm等;
- 加载到内存中的文件有.fdx .tip .dvm;
推荐阅读
- C语言指针经典知识汇总
- 中国十大名茶之都匀毛尖茶概说
- 湖北,茶业航母助推打造英山中部茶都
- ARP中间人攻击——截获他人上网记录之实战演练
- Nginx中配置https中引用http的问题
- 神奇的数据恢复算法
- 这一次,让你完全理解 HTTPS 到底是如何做到数据传输安全的
- 黑客是如何控制你手机的?出现这几种情况,你的手机可能已中招
- 使用Python「秒开」100GB+数据
- 中山唯大苞白山茶开花结果