先放一张整体图,有一个总体、清晰的了解。

elasticsearch shard--refresh

elasticsearch shard的refresh发生在从下面的图一到图二的过程中:

图一:

elasticsearch shard--refresh

图二:

elasticsearch shard--refresh

commit point本身是一个磁盘文件,包含了已经fsync到磁盘上的segments。in-memory buffer是内存的一块区域,用于存储上一次refresh后,下一次refresh之前的新增加(更新也是新增)的document记录生成的inverted index。translog类似于oracle中的redo,记录操作以便重放、以及根据id实时检索最新的document记录。不在本次讲解范围内,先略去不管。

在图一,新增加(更新也是新增)的document记录生成的inverted的索引,会首先存储在内存中的in-memory buffer中,然后在默认情况下,会每隔1s(index.refresh_interval)fresh一次,生成新的segment。然后此segment会被打开(只为描述fresh,此处忽略磁盘flush的问题)打开后,就可以被文档检索请求检索到对应的更新记录。在segment被打开之前,记录在其上的记录,是检索不到的。如上面图2。以上就是fresh的的逻辑。下面说一下fresh相关的参数:

index.search.idle.after:索引的动态参数。一个分片在多久没有接收search、get请求后,可以被视为是idle空闲的。默认值是30s。

index.refresh_interval:索引的动态参数。设置分片两次refresh的间隔。设置为-1可以禁用refresh。如果没有显示设置的话,当一个分片变为idle之后,再次接收到search/get请求时,请求会等待直到下一次默认refresh后,读取数据返回。这是对于bulk批量索引的优化,加速批量索引处理。显示设置一个值,可以打破这个逻辑。

在索引document的时候,可以携带在url中携带refresh参数。例如:

POST  test_index/_doc?refresh

?refresh可以跟下面几种参数:

1,空值或者true:例如POST  test_index/_doc?refresh=true或者POST  test_index/_doc?refresh  。表示立即refresh 结果。以在当前请求结果中能反映本次更新的记录。会降低性能。

2,wait_for:例如:POST  test_index/_doc?refresh=wait_for 。请求会等待,直到后台refresh后才返回。

3,false:默认值,等同于不加?refresh  url参数。例如:POST  test_index/_doc?refresh=false 或者POST  test_index/_doc  请求处理成功后返回,依赖es默认refresh机制。

在实际操作当中,根据实际需要设置index.search.idle.after、index.refresh_interval 配置参数,以及refresh请求参数,灵活满足业务需求同时提升操作性能。

 

相关文章: