0%

elasticsearch过程分析

elasticsearch过程分析

索引文档

当用户向一个节点提交了一个创建文档的请求,节点会计算文档应该加入到哪个分片中,每个节点都存储了每个分片存储在哪个节点的信息,因此协调节点会将请求发送到对应的节点,当主分片完成索引,会将请求发送到所有的副本,保持每个分片的数据都是最新的

每次写入新文档时,都会先写到内存中,然后将这一操作写入translog文件中,此时如果执行搜索,是无法索引到对应文档的。elasticsearch会每隔一段时间(index.translog.sync_interval)进行一次刷新操作,此时内存中的文档会被写入一个文件系统缓存中,并构成一个segment,此时segment内的文档可以被搜索到,但是还未写入磁盘,如果发生断电,这些文档仍可能丢失。

刷新周期

elasticsearch数据写入后是不会被马上搜索到,所以是准实时搜索。

elasticsearch数据写入后会将数据写入到memory buffer中,并将这一操作写入translog中。此时数据是不可被搜索到的。而如果直接将memory buffer中的数据写入到磁盘的话,就需要频繁的IO,会严重降低elasticsearch的性能。

elasticsearch在memory buffer和磁盘之间加入了一层页面高速缓存(File system cache),经过index.refresh_interval时间会将memory buffer的数据refresh到File system cache中,并清空memory buffer,此时写入的数据就可以读取到了。

File system cache依然是在内存中,为了保证持久性,还是需要flush到磁盘。

段合并

随着越来越多的文档写入,将会生成很多的segment,而translog也在不断的增大,当经过一段时间(index.translog.sync_interval)则执行fsync操作,将所有File system cache中的segment写入磁盘,而translog会被删除(如果fsync还没有执行突然断电了,此时的translog是保留的,elasticsearch可以根据translog来进行数据的还原和恢复)

segment过多也会导致查询性能的下降,所以elasticsearch会自动的进行segment的合并

好处

  • 当一些索引段合并为一个索引段的时候,会减少索引段的数量并提高搜索速度
  • 段合并时会移除被标记为已删除的那些文档,所以也会减少索引的容量

欢迎关注我的其它发布渠道