• 【ElasticSearch】ES 读数据,写数据与搜索数据的过程


    ES读数据的过程:

      1.ES客户端选择一个node发送请求,该请求作为协调节点(coordinating node);

      2.corrdinating node 对 doc id 对哈希,找出该文档对应所在的shards,将请求转发到对应的node,

      此时会使用round-robin 随机轮询算法,在primary shard 和 replica shard 之中选择一个 ,实现读请求的负载均衡;

      3.接受请求的node 返回给document 给coordinate node;

      4.coordinate node 返回document 给客户端;

    ES写数据的过程:

      1.ES客户端选择一个node发送请求,该请求作为协调节点(coordinating node);

      2.协调节点 对 doc id 对哈希,找出该文档存放的primary shard,将请求转发到该shard对应的节点;

      3.节点收到请求,primary shard处理写入,然后将数据同步到对应的replica shard 所在的节点;

      4.协调节点 发现 主分片和副分片都写入完成后 返回响应结果给 ES 客户端;

      

    ES搜索数据的过程:

      1..ES客户端选择一个node发送请求,该请求作为协调节点(coordinating node);

      2. 协调节点将请求发送到所有的shard ,包括primary shard 或者是 replica shard

      3. shard 将搜索到的数据 也就是doc id 返回给协调节点

      4. 协调节点根据doc id ,将请求分发到doc id 对应的shard 去获取完整的document ,然后将数据返回给ES 客户端

     ES写数据的底层原理:

      1.shard 收到写入请求后,写到内存buffer,同时写入到translog((每个shard都对应一个translog文件),注意内存buffer里面的数据是搜索不到的

      2.shard 会每隔1秒执行refresh操作,将buffer内的数据刷到os cache级别的缓存中去(这里是文件系统缓存),生成新的segement,buffer内的数据被刷到os cache中,

        buffer被清空,此时,这个数据也能被搜索到了

      3.重复1,2两个步骤,数据会被写入到一个一个的os cache 的 segment file 中去,并刷到磁盘中去,但是每次写入,translog 会越来越大,到达一定长度将会触发 commit 操作

      commit 操作 

        将buffer内的现有数据refresh 到os cache中,清空buffer,然后将一个commit point 写入到磁盘中,里面标识这个commit point对应的所有segment file

        同时强行将os cache 里面的数据fsync到磁盘文件中去,最后清空现有的translog文件,重启一个新的translog文件;

        fsync+清空translog, 操作就是 flush,默认30分钟执行一次flush,如果translog 文件过大(默认512M)也会触发flush操作,flush

      注意:os 文件系统中的translog的数据写到磁盘中 translog文件中 fsync的操作默认每5s 执行一次;

    参考:

    https://blog.csdn.net/wang7075202/article/details/111308905

    https://blog.csdn.net/lsgqjh/article/details/83022206

    https://www.jianshu.com/p/15837be98ffd

    https://blog.csdn.net/wx1528159409/article/details/105973336/

    https://blog.csdn.net/u013129944/article/details/93720081

    https://developer.51cto.com/art/202009/625293.htm

      

  • 相关阅读:
    DataSnap(MIDAS)三层架构中,常用事件及其触发顺序
    如何让中间层MIDAS/DATASNAP支持大量的并发用户并且控制连接数量
    插件之注册插件和注册插件中的模块
    TField.ProviderFlags
    datasnap生命期LifeCycle
    datasnap服务器支持的参数类型
    TDSAuthenticationManager的用法
    泛型实现的对象池
    服务器端如何防止DDOS
    获得客户端的信息
  • 原文地址:https://www.cnblogs.com/july-sunny/p/14412919.html
Copyright © 2020-2023  润新知