目录
参考1:
https://mp.weixin.qq.com/s/0Mryb5fxwaotj9KPo-BMAw
参考2:
Elasticsearch(ES)中的Segment具有不可变性,这是由其底层使用的Lucene索引结构所决定的。下面将分别解释Segment不可变性的原因、优点和缺点。
原因
- 性能优化:不可变的Segment允许Elasticsearch在读取时不需要加锁,从而减少了性能开销。
- 缓存效率:一旦Segment被加载到内存中,它就可以被缓存起来,供后续的读取操作使用,这减少了对磁盘I/O的需求。
- 数据一致性:由于Segment不可变,它们可以安全地被多个进程或线程访问,而不需要担心数据一致性问题。
优点
Segment不可变性带来了以下优点:
- 更新和删除操作的复杂性:由于Segment不可变,更新或删除操作实际上是通过创建新的Segment来实现的,这可能会导致数据的冗余和存储空间的浪费。
- 资源消耗:随着时间的推移,索引中可能会积累大量的Segment,这会消耗大量的文件句柄、内存和CPU资源。
- 搜索效率问题:如果Segment数量过多,每个搜索请求都需要检查更多的Segment,这会降低搜索效率。
- 维护成本:不可变的Segment需要定期通过合并操作来减少Segment的数量,这需要额外的维护成本和资源。
- 事务日志(Translog):
- 每次对文档的修改操作(包括创建、更新和删除)首先会被记录到一个名为Translog的事务日志中。这样即使在数据尚未刷新到磁盘之前,如果发生故障,Translog也能够保证数据不会丢失。
- 内存索引缓冲(In-Memory Indexing Buffer):
- 新的修改操作首先在内存中的索引缓冲区进行索引,当缓冲区达到一定条件(如大小或时间限制)时,会触发刷新(Refresh)操作。
- 刷新(Refresh)操作:
- Refresh操作会将内存中的索引缓冲区数据写入一个新的Segment,并使其对搜索可见,但这个过程并不会将数据持久化到磁盘。这样,新修改的数据就可以被搜索到,而不需要等待传统的commit操作。
- 提交点(Commit Point):
- 当进行Flush操作时,Elasticsearch会创建一个新的提交点,记录当前所有Segment的状态。这个提交点是持久化的,即使在故障后也能恢复数据。
- 删除和更新操作的处理:
- 对于删除操作,Elasticsearch会在.del文件中记录被删除文档的Segment和位置信息,查询时会过滤掉这些被标记为删除的文档。
- 对于更新操作,Elasticsearch实际上会标记原文档为删除,并在内存缓冲区中创建一个新的文档版本。当触发Refresh或Flush操作时,新版本的文档会被写入新的Segment。
- 段合并(Segment Merging):
- 随着时间的推移,Elasticsearch会将多个小的或旧的Segment合并成更大的Segment,这个过程称为Segment Merging。在合并过程中,Elasticsearch会应用所有相关的删除和更新操作,确保合并后的Segment只包含最新的数据。
- 查询时的版本应用:
- 当执行搜索查询时,Elasticsearch会查询所有Segment,并根据Translog中的最后记录和.del文件中的删除标记来应用最新的文档版本。这意味着即使数据在多个Segment中存在,最终返回给用户的搜索结果也会是最新的数据。
缺点
Segment不可变性也存在一些缺点:
总的来说,Segment的不可变性是Elasticsearch设计中的一个关键特性,它在提高性能和简化系统设计方面发挥了重要作用,但同时也带来了一些管理和维护上的挑战。
对于一条数据进行频繁修改 那么这条数据会存在于不同的segment中,检索的时候es内部是怎么实现将其全部检索到并且应用最新的值的呢
当对Elasticsearch中的一条数据进行频繁修改时,确实可能会在不同的Segment中存在该数据的多个版本。Elasticsearch通过以下机制来确保检索到的数据是最新的:
通过上述机制,Elasticsearch确保了即使数据在多个Segment中存在,用户也能够检索到最新版本的数据。同时,这也意味着Elasticsearch在设计上支持了高并发的读写操作,并且能够提供近实时的搜索能力。
No comments yet.