为什么说Elasticsearch搜索是近实时的?

news/2024/7/7 6:41:19 标签: elasticsearch

通过前面两篇文章的介绍,我们大概已经知道了 Elasticsearch处理数据的流程,其中在Elasticsearch和磁盘之间还有一层称为FileSystem Cache的系统缓存,正是由于这层cache的存在才使得es能够拥有更快搜索响应能力。

我们都知道一个index是由若干个segment组成,随着每个segment的不断增长,我们索引一条数据后可能要经过分钟级别的延迟才能被搜索,为什么有种这么大的延迟,这里面的瓶颈点主要在磁盘。

持久化一个segment需要fsync操作用来确保segment能够物理的被写入磁盘以真正的避免数据丢失,但是fsync操作比较耗时,所以它不能在每索引一条数据后就执行一次,如果那样索引和搜索的延迟都会非常之大。

所以这里需要一个更轻量级的处理方式,从而保证搜索的延迟更小。这就需要用到上面提到的FileSystem Cache,所以在es中新增的document会被收集到indexing buffer区后被重写成一个segment然后直接写入filesystem cache中,这个操作是非常轻量级的,相对耗时较少,之后经过一定的间隔或外部触发后才会被flush到磁盘上,这个操作非常耗时。但只要sengment文件被写入cache后,这个sengment就可以打开和查询,从而确保在短时间内就可以搜到,而不用执行一个full commit也就是fsync操作,这是一个非常轻量级的处理方式而且是可以高频次的被执行,而不会破坏es的性能。

如下图: 

 



elasticsearch里面,这个轻量级的写入和打开一个cache中的segment的操作叫做refresh,默认情况下,es集群中的每个shard会每隔1秒自动refresh一次,这就是我们为什么说es是近实时的搜索引擎而不是实时的,也就是说给索引插入一条数据后,我们需要等待1秒才能被搜到这条数据,这是es对写入和查询一个平衡的设置方式,这样设置既提升了es的索引写入效率同时也使得es能够近实时检索数据。

refresh的用法如下:

POST /_refresh   //刷新所有的索引
POST /blogs/_refresh  //刷新指定的索引

refresh操作相比commit操作是非常轻量级的但是它仍然会耗费一定的性能,所以不建议在每插入一条数据后就执行一次refresh命令,es默认的1秒的延迟对于大多数场景基本都可以接受。

当然并不是所有的业务场景都需要每秒都refresh一次,如果你短时间内要索引大量的数据,为了优化索引的写入速度,我们可以设置更大的refresh间隔,从而提升写入性能,命令如下:

PUT /my_logs
{
  "settings": {
    "refresh_interval": "30s" 
  }
}

上面的参数是可以随时动态的设置到一个存在的索引里面,如果我们正在插入超大索引时,我们完全可以先关闭掉这个refresh机制,等写入完毕之后再重新打开,这样以来就能大大提升写入速度。

命令如下:

PUT /my_logs/_settings
{ "refresh_interval": -1 }  //禁用刷新机制

PUT /my_logs/_settings
{ "refresh_interval": "1s" }  //设置每秒刷新一次

注意refresh_interval的参数是可以带时间周期的,如果你只写了个1,那就代表每隔1毫秒刷新一次索引,所以设置这个参数时务必要谨慎。


http://www.niftyadmin.cn/n/787545.html

相关文章

TP5+商城小程序——微信登陆与令牌-初识T--意义与作用

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技aming 网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。

mipi协议_学习共享——MIPI

点击上方蓝字,记得关注我们!MIPI名词解释MIPI(Mobile Industry Processor Interface)移动行业处理器接口,是2003年由ARM,Nokia,ST,TI等公司成立的一个联盟发起的为移动应用处理器定制的开放标准。目的是把手机内部的接…

分治 求 逆序数

利用归并,逆序数等于 左边逆序数 右边逆序数,加上 左边 的每个数与右边的每个数构成的逆序数。归并过程 把 左边和右边按照从小到大排序 在 merge过程中发现a[右边] > a[左边] 说明 在此左边p1位置的右侧的数都能与此时的p2位置的 a[p2]构成逆序对。…

python共享内存通信_Java – Python共享内存通信

我们有一个用 Java编写的程序和一个用 Python编写的程序,并且需要以乒乓方式将它们组合在一起,每次交换一个长度为100,000的整数数组,并花费大约0.1-1秒来完成它们的工作:> Java做了一些工作并触发一个长度为100,000的int数组到…> Python,它做了一些工作并发…

ASP.Net1

一、Web应用程序与传统桌面应用程序的不同: 1.产品级的Web应用程序总是包括至少两台联网的机器:一台承载网站,另一台在Web浏览器中查看数据。 即:我们通过自己的电脑浏览Web程序,这个程序会向服务器读取命令&#xff0…

最长公共子序列 POJ1458

题目链接DP1、确定状态 maxLen[i][j]表示 a的左侧i个字符与b的左侧j个字符最长子序列长度2、边界条件&#xff08;初始&#xff09;maxLen[i][0] maxLen[0][j] 0;3、状态转移4、复杂度 状态数*计算每个状态所需时间 #include<stdio.h> #include<string.h> #defi…

python实现md5加密和解密_Python实现对字符串的加密解密方法示例

本文实例讲述了Python实现对字符串的加密解密方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;需求是是要将密码存在数据库里&#xff0c;所以要加密解密是可逆的&#xff0c;在数据库里不要有特殊字符&#xff0c;防止数据库备份和恢复中出错。安装PyCrypto&#…

Elasticsearch如何保证数据不丢失?

上篇文章提到过&#xff0c;在elasticsearch和磁盘之间还有一层cache也就是filesystem cache&#xff0c;大部分新增或者修改&#xff0c;删除的数据都在这层cache中&#xff0c;如果没有flush操作&#xff0c;那么就不能100%保证系统的数据不会丢失&#xff0c;比如突然断电或…