zoukankan      html  css  js  c++  java
  • 【分布式搜索引擎】Elasticsearch写入和读取数据过程

    一、Elasticsearch写人数据的过程

    1)客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点)
    2)coordinating node,对document进行路由,将请求转发给对应的node(有primary shard)
    3)实际的node上的primary shard处理请求,然后将数据同步到replica node
    4)coordinating node,如果发现primary node和所有replica node都搞定之后,就返回响应结果给客户端

    二、Elasticsearch读取数据的过程

    1)客户端发送请求到任意一个node,成为coordinate node
    2)coordinate node对document进行路由,将请求转发到对应的node,此时会使用round-robin随机轮询算法,在primary shard以及其所有replica中随机选择一个,让读请求负载均衡
    3)接收请求的node返回document给coordinate node
    4)coordinate node返回document给客户端

    1.写入document时,每个document会自动分配一个全局唯一的id即doc id,同时也是根据doc id进行hash路由到对应的primary shard上。也可以手动指定doc id,比如用订单id,用户id。
    
    2.读取document时,你可以通过doc id来查询,然后会根据doc id进行hash,判断出来当时把doc id分配到了哪个shard上面去,从那个shard去查询

    三、Elasticsearch搜索数据过程

    es最强大的是做全文检索

    1)客户端发送请求到一个coordinate node
    2)协调节点将搜索请求转发到所有的shard对应的primary shard或replica shard也可以
    3)query phase:每个shard将自己的搜索结果(其实就是一些doc id),返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果
    4)fetch phase:接着由协调节点,根据doc id去各个节点上拉取实际的document数据,最终返回给客户端

    搜索的底层原理:倒排索引

    四、Elasticsearch写数据的底层原理

    1)先写入buffer,在buffer里的时候数据是搜索不到的;同时将数据写入translog日志文件。

    2)如果buffer快满了,或者到一定时间,就会将buffer数据refresh到一个新的segment file中,但是此时数据不是直接进入segment file的磁盘文件的,而是先进入os cache的。这个过程就是refresh。

    每隔1秒钟,es将buffer中的数据写入一个新的segment file,每秒钟会产生一个新的磁盘文件,segment file,这个segment file中就存储最近1秒内buffer中写入的数据。

    但是如果buffer里面此时没有数据,那当然不会执行refresh操作咯,每秒创建换一个空的segment file,如果buffer里面有数据,默认1秒钟执行一次refresh操作,刷入一个新的segment file中。

    操作系统里面,磁盘文件其实都有一个东西,叫做os cache,操作系统缓存,就是说数据写入磁盘文件之前,会先进入os cache,先进入操作系统级别的一个内存缓存中去。

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

    为什么叫es是准实时的?NRT,near real-time,准实时。默认是每隔1秒refresh一次的,所以es是准实时的,因为写入的数据1秒之后才能被看到。

    可以通过es的restful api或者java api,手动执行一次refresh操作,就是手动将buffer中的数据刷入os cache中,让数据立马就可以被搜索到。

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

      

  • 相关阅读:
    各种版本控制器的作用
    mybatis的一些特殊符号标识(大于,小于,等于,不等于)
    struts2的作用是什么
    js中给数组添加元素的方法有哪些
    springmvc中拦截器配置格式
    js中require()的用法----JS如何连接数据库执行sql语句或者建立数据库连接池
    hover()函数的用法
    error和exception的不同与相同
    cookie和session的区别有哪些
    数据库连接池的工作机制是什么
  • 原文地址:https://www.cnblogs.com/756623607-zhang/p/10598043.html
Copyright © 2011-2022 走看看