ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ES的写入与查询的工作原理

2022-06-06 00:35:11  阅读:303  来源: 互联网

标签:buffer segment 写入 shard 查询 file 数据 ES


一、ES写数据的大致步骤:

  1、客户端发送请求过来一条数据(document)

      随机选择集群中的一个节点Node2(此时Node2就是协调节点),对数据hash一下,来决定数据要写到哪个shard上去

  2、协同节点将数据路由到对应的primary shard上去

  3、primary shard写完数据,并将数据同步到其他replica shard上去

  4、当协同节点感知shard写完病同步完,会返回写成功的响应结果给客户端。

二、数据写入primary shard的原理:

  1、数据是先写入内存buffer的,同时数据写入translog日志文件中,此时ES客户端是查询不到这条数据的;

  2、若buffer快满了或者到一定时间,就会将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 中

  数据写入segment file之前,会先写入Os cache操作系统缓存中去

  只要buffer中数据被refresh,刷入os  cache中就代表这个数据可以被搜索到了

  只要数据被刷入os cache中,buffer就会被清空了,因为不需要保留buffer了,数据在translog文件里面已经持久化到磁盘去一份了。

注:为什么ES是准实时的?NRT,near real-time准实时,默认每隔1秒refresh一次,所以ES是准实时的,因为写入的数据1秒后才能被看到。可以通过es的restful api或者 java api手动refresh,让数据立马被搜索到。

  3、只要数据进入os cache,此时就可以让这个segment file的数据对外提供搜索了

  4、重复1-3步,translog日志文件会变得越来越大,当达到一定阈值时,触发commit操作

    buffer的数据每隔1秒被刷到os cache中去就被清空了,故buffer的数据始终可以保持住,不会填满es进程的内存的。

    每写一条数据到buffer,同时会写入一条到translog日志文件中去;

  5、commit操作发生的第一步,就是将buffer中现有的数据refresh到os cache中去,清空buffer

  6、将一个commit point写入到磁盘文件,里面标识着这个commit point对应的所有segment file

  7、强行将os cache中目前所有的数据都fsync全量同步到磁盘文件中去

    translog日志文件的作用?执行commit之前,数据是停留在buffer或者os cache中的,一旦机器宕机了,内存中的数据就全丢了。所以要将对应的数据写入一个专门的日志文件translog中,一旦机器宕机,再次重启的时候,ES会自动读取translog文件日志数据并恢复到内存buffer和os cache中去

  8、将现有的translog清空,然后再次重启启用一个新的translog,此时commit操作完成

    默认每30分钟会自动执行一次commit,但若translog过大也会触发commit

    整个commit过程也叫flush操作,可以通过es api手动执行flush操作将所有os cache数据刷到磁盘文件中去;

  9、translog其实也是先写入os cache的,默认每隔5秒刷一次到磁盘中去,所以默认情况下可能有5秒的数据会仅仅停留在buffer或者translog的os cache中,若此时机器宕机了会丢失5秒的数据,也可以将translog设置成每次写操作必须直接fsync到磁盘,但性能会差很多。

  10、如果是删除操作,commit时会生成一个.del文件,里面将某个doc标识为deleted状态,那么搜索时根据.del文件就知道这个doc被删除了

  11、若是更新操作,就是将原来的doc标识为deleted状态,然后新写入一条数据。

  12、buffer每refresh一次,就会产生一个segment file文件,所有默认情况下是1秒一个segment file文件,segment file会越来越多,此时会定期执行merge操作合并文件;

  13、每次merge时,会将多个segment file合并成一个,同时这里会讲标识为deleted的doc给物理删除掉,然后将新的segmentfile写入磁盘,这里会写一个commit point标识所有新的segment file,然后打开segment file共搜索使用,同时删除旧的segment file。

三、ES读数据的过程:

  1、客户端发送请求到任意node,成为coordinate node协同节点

  2、协同节点对document进行路由,将请求转发到对应的node,此时会使用round- robin随机轮询算法,在primary shard以及其所有replica中随机选择一个,让读请求负载均衡;

  3、接受请求的node返回document给协同节点

  4、协同节点返回document给客户端;

注:写入了某个document,会自动分配一个全局唯一的ID->doc ID,同时也是根据docid进行hash路由到对应的primary shard上去

  可以通过docid来查询,根据docid进行hash来判断当时把do I'd分配到哪个shard上去,从哪个shard去查询

四、ES搜索数据的过程:全文检索

  1、客户端发送请求到一个coordinate node

  2、协调节点将搜索请求转发到所有的shard对应的primary shard或者replica shard

  3、query phase:每个shard将自己的搜索结果(其实就是一些docid)返回给协调节点,由协调节点进行数据合并、排序、分页等操作,生产出最终结果;

  4、fetch phase:接着由协调节点,根据docid去各个节点上拉取实际的document数据,最终返回给客户端。

标签:buffer,segment,写入,shard,查询,file,数据,ES
来源: https://www.cnblogs.com/blackdd/p/16345714.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有