刷新写入磁盘时间间隔 refresh_interval
调优建议:
根据业务需求,如果对实时性要求不高(可以接受数据查询延迟时间的),可以将该值设置大一些,如30s,默认为1s;
-1 为不刷新,如果设置-1 ,也并非一直不会写入到磁盘,index_buffer也就是内存缓存默认是堆的10% 满了也会刷到segment
数据索引底层原理
这里先介绍一下数据索引底层原理
- 先写入buffer,在buffer里的时候数据是搜索不到的;同时将数据写入translog日志文件。
- 如果buffer到达阈值,或者到一定时间(即:refresh_interval),ES会将buffer中的数据refresh到一个新的segment file中,但是此时数据不是直接进入segment file的磁盘文件的,而是先进入os cache的。这个过程就是refresh。
- 每隔1秒钟,es就会将buffer中的数据写入到一个新的segment file,因此每秒钟产生一个新的磁盘文件(segment file),这个segment file中就存储最近1秒内buffer中写入的数据。如果buffer里面此时没有数据,就不会执行refresh操作;如果buffer里面有数据,默认1秒钟执行一次refresh操作,刷入一个新的segment file中。
- 操作系统里面存在操作系统缓存(os cache),数据写入磁盘文件之前会先进入os cache,先进入操作系统级别的一个内存缓存中。只要buffer中的数据被refresh到os cache中,数据就可以被检索到了。
- 可以通过es的restful api或者java api,手动执行一次refresh操作,就是手动将buffer中的数据刷入os cache中,让数据立马就可以被搜索到。只要数据被输入os cache中,buffer就会被清空了,因为不需要保留buffer了,数据在translog里面已经持久化到磁盘去一份了。
指定索引设置刷新时间
动态设置
PUT /{
index}/_settings
{
"refresh_interval": "2s"
}
强制刷新
如果要针对某次添加数据或数据变更进行强行刷新操作时,可以通过下列方式:
POST {index}/_doc?refresh
{
"title" : "深入理解 elasticsearch"
}
如上操作可以使数据马上写入,即可立即搜索可见。
重置 refresh_interval
重置为默认的refresh_interval 值 1s
PUT {
index}/_settings
{
"index" : {
"refresh_interval" : null
}
}
当我们大批量的往Elasticsearch索引录入数据时,通常会把refresh_interval 设置为 -1,这样会加快数据导入的速度,在数据导入完成后,再将该参数设置为正数。比如:1s。
当 refresh_interval 为 -1 时,意味着不刷新索引。
refresh_interval 的默认值是 1s。
数据初始索引时禁用刷新和副本机制若有一大批数据需要索引的时候(前提条件),由于刷新和副本机制对数据索引性能影响较大,可以将index.refresh_interval设置为-1,将index.number_of_replicas设置为0以禁用该两机制。直到本次数据全部索引完成后再将这两个参数调整至合理的值,然而应该明白性能与数据安全总是不能同时得到满足,完全看业务数据的重要性。
TODO Translog : 预写日志
https://blog.csdn.net/qq_21383435/article/details/109212665