Elasticsearch 底层是如何实现数据存储的?比如数据的存储流程和管理机制
Elasticsearch 底层是如何实现数据存储的?比如数据的存储流程和管理机制
回答重点
Elasticsearch 底层的数据存储主要依赖于 Apache Lucene,它通过将数据存储在倒排索引的结构中来实现快速的全文搜索。简言之,Elasticsearch 会将插入的数据文档拆分成一个个的“倒排索引”(Inverted Index),然后存储在分片(Shard)中。每个索引由多个分片组成,每个分片又进一步拆分为多个段(Segment)。这些段是 Lucene 管理数据存储和检索的基本单元。
扩展知识
1) 倒排索引:倒排索引是一种高效的文本检索数据结构。它主要包括两个部分:词典(dictionary)和倒排列表(postings list)。词典包含了文档中出现的所有单词,而倒排列表为每个单词储存对应的文档和位置信息。倒排索引使得 Elasticsearch 能够迅速的找到包含特定关键词的文档。
2) 分片和副本:为了实现数据的分布式存储和高可用性,Elasticsearch 将索引拆分为分片(primary shard),并为每个分片复制多个副本(replica shard)。这样做不仅可以提升读取性能,还能在某些分片失效时保证数据不丢失。默认情况下,一个索引有5个主分片和1个分片副本。
3) 段(Segment)管理:Lucene 将每个分片进一步拆分为多个段。段是不可变的文件,存储最终的数据。每个索引操作(比如新增或更新文档)都会生成新的段,这些段会定期进行合并操作(Merge),以减少文件数量并优化查询性能。
4) 文档写入流程:
- 当我们向 Elasticsearch 插入一条数据,数据首先被写入到名为 translog 的事务日志文件中,该过程确保数据不会丢失,即使节点突然宕机。
- 同时,数据会被解析,构建倒排索引,并写入到段文件中。
- 默认情况下,Elasticsearch 每隔一秒钟会刷新 translog,将缓存中的变更写入到新的段中,并构建新的倒排索引结构。
5) 数据管理:
- 刷新(Refresh):默认情况下,Elasticsearch 每秒进行一次刷新,来执行数据持久化和倒排索引创建。
- 合并(Merge):为了避免段文件数量增长太多,Lucene 会定期进行段合并。合并会将小段合并成大段,减少文件数量,提升查询效率。合并策略是 Elasticsearch 性能调优的重要的一环。
6) 数据查询:倒排索引的结构使得查询效率非常高。当用户发起查询请求时,Elasticsearch 会用查询关键词在倒排索引中迅速找到对应的文档列表,从而实现快速的全文检索功能。
Comments