ES读写原理

这篇具有很好参考价值的文章主要介绍了ES读写原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ES读写原理

写入原理

ES读写原理

  1. 客户端请求发送到一个节点, 该节点被称为协调节点,协调节点解析请求发现为写请求,解析其doc id,计算其路由,将其发送到对应的主分片上 primary shard
  2. 数据会先被写入内存buff中,然后再写入translog,进行 2.1 2.2 的操作,数据会被写入磁盘上的translog文件。一旦数据被写入磁盘,es 宕机不会丢失数据。
  3. 3过程可以在2.1操作成功之后进行,也可以在 2.2操作成功之后进行。 如果3过程在2.1之后进行,那么es会存在数据丢失的风险,因为给客户端返回写入成功,但translog并未入磁盘,仍存在os cache中,os cache也在内存中,内存数据断电丢失,如果4过程之后,2.2过程执行之前宕机,数据丢失。如果3过程在2.2之后进行,则es不会出现数据丢失情况。 可以通过es的参数 来进行控制,设置为同步,会在每次写入translog时都写入磁盘,设置为异步,则2.2操作会异步进行,默认5s进行一次写磁盘操作(fsync)
  4. 数据经过5过程才会被search操作搜索得到, ps:当使用文档id进行get查询时,即使数据在内存buff中也可以搜索得到,5过程默认1s操作一次, 将内存buff中的数据写入os cache对应的segment file
  5. 6过程是将os cache中的segment file 写入磁盘,操作本质上与2.2一致,默认每半小时更新一次
  6. flush过程同时也会写一个commit到commit point中

Q: 为什么叫 es 是准实时的?

A: NRT,全称 near real-time。默认是每隔 1 秒 refresh 一次的,所以 es 是准实时的,因为写入的数据 1 秒之后才能被看到。可以通过 es 的 restful api 或者 java api,手动执行一次 refresh 操作,就是手动将 buffer 中的数据刷入 os cache中,让数据立马就可以被搜索到。只要数据被输入 os cache 中,buffer 就会被清空了,因为不需要保留 buffer 了,数据在 translog 里面已经持久化到磁盘去一份了。

Q: ES会丢失数据吗?

A: es宕机是否丢失数据主要看translog是否丢失数据, translog在写入时可以设置写入方式,通过设置每次写translog都写入磁盘,可防止translog数据的丢失,从而达到es宕机不丢失数据的目的。

读原理

ES读写原理
以上图三个节点为例,三个节点组成一个es集群,一个索引,3主3从。

  1. 当查询从客户端发送到节点2时,此客户端发送的请求被节点2接受并处理,此时我们称节点2为此次请求的协调节点,节点2会将查询发送到索引对应的三个分片,三个分片可能是主可能是从,es会根据负载均衡算法来决定查询请求发送到哪个分片。
  2. 各个分片会将查询结果的docid和排序字段返回给协调节点,注此时并不返回文档的全部数据。
  3. 协调节点根据各个分片返回的docid和排序字段进行排序,筛选出需要返回给客户端的文档docid
    使用docid去对应分片上拉取文档真实数据,返回给客户端

4 过程排序,数据若能完全在内存中,则使用快速排序(logn ~ n), 若内存放不下所有数据,就要借助文件进行排序,使用归并排序算法(nlogn)

es二阶段查询文章来源地址https://www.toymoban.com/news/detail-400311.html

  1. query阶段, 2,3,4为query阶段
  2. fetch阶段, 5,6为fetch阶段

到了这里,关于ES读写原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • es相关的官方客户端与spring客户端对比与介绍

    es提供的 TransportClient 传统的客户端,基于TCP传输协议与Elasticsearch通信。 已经被弃用,不推荐使用。 适用于Elasticsearch 5.x及以前的版本 因为Elasticsearch 6.x及以上版本已不再支持TCP Transport协议,TransportClient无法连接Elasticsearch集群。 RestHighLevelClient 是一个高级的REST客户端,主要用于与

    2024年02月02日
    浏览(58)
  • 自己编译RustDesk,并将自建ID服务器和key信息写入客户端

            今天总算是把编译环境给折腾清楚了,编译出来了至少能用,但说不上好用,问题还不少,官方的客户端就是要手工填写ID服务器地址和key才可以用,而且还容易被别人白嫖你搭建的服务器,当然如果拿到你编译后的客户端,也是存在被白嫖的可能。这方面还没有找

    2024年04月14日
    浏览(130)
  • Scala连接ES客户端

    大家好,我是楚生辉,在未来的日子里我们一起来学习大数据相关的技术,一起努力奋斗,遇见更好的自己! 本文详细的介绍了如何使用Scala语言连接上Elasticsearch客户端,有需要的小伙伴可以自行获取与学习~ 使用方法 写入ES中,就要规划,是写入到一个索引中,还是分割索

    2024年01月21日
    浏览(46)
  • ES客户端RestHighLevelClient的使用

    默认情况下,ElasticSearch使用两个端口来监听外部TCP流量。 9200端口:用于所有通过HTTP协议进行的API调用。包括搜索、聚合、监控、以及其他任何使用HTTP协议的请求。所有的客户端库都会使用该端口与ElasticSearch进行交互。 9300端口:是一个自定义的二进制协议,用于集群中各

    2024年02月03日
    浏览(53)
  • java用es客户端创建索引

    先用java创建esClient 创建es索引模板 新建索引 批量插入数据 1.先批量生成数据 2批量导入方法

    2024年02月11日
    浏览(46)
  • 【ES实战】ES创建Transports客户端时间过长分析

    2023年10月19日 在创建ES Transport客户端的时,当出现以下场景时,影响连接速度。 使用ES Transport 客户端创建与集群的链接。 连接地址里面有不存在的IP 在增加ES节点时,采用逐个增加的方式 整个建立链接的过程会非常耗时。 采用jar依赖如下 创建连接代码如下 输出结果 是否可

    2024年02月07日
    浏览(42)
  • SpringBoot集成Milo库实现OPC UA客户端:连接、遍历节点、读取、写入、订阅与批量订阅

    前面我们搭建了一个本地的 PLC 仿真环境,并通过 KEPServerEX6 读取 PLC 上的数据,最后还使用 UAExpert 作为OPC客户端完成从 KEPServerEX6 这个OPC服务器的数据读取与订阅功能。在这篇文章中,我们将通过 SpringBoot 集成 Milo 库实现一个 OPC UA 客户端,包括连接、遍历节点、读取、写入

    2024年02月09日
    浏览(54)
  • Java 获取客户端请求IP地址

    2024年02月15日
    浏览(35)
  • 1.6 服务器处理客户端请求

    客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)。 从图中我们可以看出,服务器程序处理来自客户端的查询请求大致需要经过三个部分,分别是 连接管理 、 解析与优化 、 存储引擎 。 客户端进程可以采用我

    2024年02月11日
    浏览(33)
  • ES查询客户端初始化(RestHighLevelClient)

    另外,如果说把es当成一个数据库使用,可以看下开源项目easy-es,操作更方便。文档地址:快速开始 | Easy-Es

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包