Elasticsearch 中的数据存储流程简述 ?
参考回答
Elasticsearch 的数据存储流程包括多个步骤,从数据的接收到最终存储在磁盘上的过程。以下是 Elasticsearch 中数据存储的简要流程:
1. 数据接收与解析
- 当用户通过 RESTful API 提交数据时,数据会首先被 Elasticsearch 接收到。数据通常以 JSON 格式提交,其中包含要索引的文档内容以及与文档相关的元数据(如
_id、_index、_type等)。 - Elasticsearch 会解析这些文档,提取出各个字段以及字段类型,以便进行后续处理。
2. 索引与分片(Sharding)
- 索引(Index):数据被索引到指定的索引中。在 Elasticsearch 中,索引是一个逻辑概念,类似于数据库中的表,包含一组文档和相关的元数据。
- 分片(Sharding):为了处理大规模数据,Elasticsearch 将每个索引的数据分成多个 分片。每个分片是一个独立的 Lucene 索引,数据会根据一定的规则(如文档 ID 哈希)分配到不同的分片上。
例如,如果创建一个名为
products的索引,Elasticsearch 会将其数据分为多个分片,并将分片分布到集群中的各个节点上。
3. 文档存储与倒排索引(Inverted Index)
- 文档存储:Elasticsearch 将每个文档的内容存储在分片的内存映射文件(mmap)中,并为每个字段创建 倒排索引。倒排索引是 Elasticsearch 搜索性能的核心,通过倒排索引可以快速查找包含特定词条的文档。
-
字段分析与索引:对于文本字段,Elasticsearch 使用 分析器(Analyzer) 将字段值进行分词、标准化(如去停用词、大小写转换等),然后存储词项(tokens)在倒排索引中。而对于数值、日期等字段,Elasticsearch 会将其直接存储,并且创建适合数值计算的索引结构。
举例:假设索引有一个文档:
{ "name": "Laptop", "description": "A high performance laptop" }Elasticsearch 会把
name和description字段中的文本内容拆分成词项,并在倒排索引中记录下这些词项的位置和出现的文档。
4. 副本(Replication)
- 副本:Elasticsearch 为每个分片创建 副本,副本是原始分片的完整复制。副本不仅提供数据冗余以保证高可用性,还能提高查询性能。
-
副本分配会在集群中其他节点上进行,使得即便某个节点或分片出现故障,副本可以确保数据的可用性。
例如,如果有一个主分片
shard1,Elasticsearch 会在其他节点上创建该分片的副本replica1,确保即使主分片不可用,副本仍然可以提供查询服务。
5. 数据写入流程(刷新与刷新间隔)
- 写入操作:当文档被写入 Elasticsearch 后,首先会写入 内存中的缓冲区(Translog) 和 内存索引。缓冲区中的数据会被定期刷新到磁盘,以保证数据的一致性和可靠性。
- 刷新操作:每当达到一定条件时(如缓冲区达到阈值或时间间隔到达),数据会被刷新到磁盘并更新倒排索引。刷新是将内存中的数据持久化到磁盘,确保数据在硬盘上可用。
- 刷新频率:通常,Elasticsearch 每 1 秒刷新一次。这个过程会影响写入性能,因为每次刷新都会导致磁盘 I/O 操作。
6. 段(Segment)与合并(Merge)
- 段(Segment):每个分片包含多个 段(segments),每个段是一个不可变的 Lucene 索引,存储了一定数量的文档。段的创建是因为每次刷新时,Elasticsearch 会将内存中的数据存储到一个新的段文件中。
- 段合并(Segment Merging):为了优化存储空间和提高查询性能,Elasticsearch 会定期合并多个小的段。合并会移除标记为删除的文档,并将多个小段合并为一个大段,从而减少存储空间的浪费,并提升查询性能。
7. 存储路径与文件结构
- Elasticsearch 将数据存储在磁盘上,每个分片有自己的目录。每个分片的目录下包含多个 段文件 和 索引元数据,这些文件由 Lucene 使用来进行索引和搜索。
- 每个段文件包含倒排索引数据、存储字段数据和其他元数据。文档数据通常会被拆分成多个文件存储,并且不同类型的字段数据(如文本、数值等)可能会被存储在不同的文件中。
8. 数据删除与更新
- 删除操作:Elasticsearch 不会立即物理删除文档,而是标记文档为删除状态。实际删除操作会在段合并时执行,合并过程会删除那些标记为删除的文档。
- 更新操作:更新操作本质上是删除旧文档并插入新文档。更新时,Elasticsearch 会将新的文档插入到新的段中,而原来的文档会被标记为删除。
9. 事务日志(Translog)
- 事务日志:在写入操作过程中,所有的文档变更(插入、更新、删除)都会先记录在 事务日志(translog) 中。这确保了在 Elasticsearch 重启或崩溃的情况下,尚未刷新到磁盘的操作不会丢失。
- 事务日志会随着刷新操作逐渐被清理和删除。
总结
Elasticsearch 的数据存储流程包括:
1. 数据接收:通过 RESTful API 接收数据。
2. 分片与索引:数据被分配到多个分片,并根据分析器进行索引。
3. 倒排索引:为文本字段建立倒排索引,其他字段根据类型创建适合的索引结构。
4. 副本:为每个分片创建副本,保证数据的高可用性。
5. 刷新与段:数据定期刷新到磁盘,并形成段(segments)。段合并优化存储。
6. 存储:数据以段文件的形式存储在磁盘上。
7. 删除与更新:删除和更新操作通过标记删除和插入新文档实现。
8. 事务日志:确保在 Elasticsearch 重启时数据不丢失。
通过这种方式,Elasticsearch 能够高效地存储、索引和查询大规模数据,并在分布式环境中提供高可用性和性能。