一、写入数据

1、ES 的任意节点都可以作为协调(Coordinating)节点接受请求(包括新建、索引或者删除请求),每个节点都知道集群中任一文档位置;

2、协调节点会通过 routing 字段计算出一个主分片(primary shard),并把请求路由到主分片所在节点(routing 是一个可变值,默认是文档的 _id) ;

shard = hash(routing) % number_of_primary_shards

tips:这就解释了为什么我们要在创建索引的时候就确定好主分片的数量,并且永远不会改变这个数量:因为如果数量变化了,那么所有之前路由的值都会无效,文档也再也找不到了。

3、在主分片节点上,数据会先被写入(index buffer)中,同时写入 translog,这个时候数据还不能被搜索到(这个也是 es 是近实时搜索的原因);

tips:整个过程大部分在内存中,如果断电就会导致数据丢失。因此,ES 引入了 translog,数据写入内存时,会同时写入 translog(会立即落盘),来保证数据不丢失。

4、经过一段时间(默认 1s)或者 index buffer 满了(默认 jvm 的 10%),会将 index buffer 中的文档 refresh 到系统文件缓存(os cache),然后再刷入到 lucene 的底层文件 segment 中,同时建立倒排索引,这个时候文档是可以被搜索到的;

5、 由于 segment 的不可变性,随着 segment 越来越多,每打开一个 segment 就会消耗一个文件句柄,导致查询性能越来越差。这时,ES 后台会有一个单独线程专门合并 segment,将零碎的小的 segment 合并成一个大的 segment;

6、经过一段时间(默认30 min)或者 tanslog 满了(默认512M),会将文件系统缓存的 segment 落盘;

7、如果主分片所在的节点请求执行成功,它会将请求同步转发到副本分片所在节点,做到主副数据的一致性,一旦所有的副本分片都报告成功,主分片节点将向协调节点报告成功,协调节点向客户端报告成功。因此,数据写入,主副本之间采用的是同步写入过程。

tips:写一致性默认的策略是 —— Quorum ,即大多数的分片副本状态没问题才允许执行写操作。

8、当集群中某个节点宕机,该节点上所有分片中的数据全部丢失(既有主分片,又有副分片);丢失的副分片对数据的完整性没有影响,丢失的主分片在其他节点上的副分片会被选举成主分片;所以整个索引的数据完整性没有被破坏。

9、如果是删除操作,refresh 的时候就会生成一个 .del 文件,逻辑删除,将这个 document 标识为 deleted 状态,在搜索的搜索的时候就不会被搜索到了。

10、如果是更新操作,就是将原来的 document 标识为 deleted 状态,然后新写入一条数据。

二、查询数据

GET my-index/_doc/0

1、ES 的任意节点都可以作为协调(Coordinating)节点接受请求,每个节点都知道集群中任一文档位置;

2、协调节点对 id 进行路由,从而判断该数据在哪个 shard,然后将请求转发给对应的节点,此时会使用随机轮询算法,在 primary shard 和 replica shard 中随机选择一个,让读取请求负载均衡,

3、处理请求的节点返回 document 给协调节点。

4、协调节点,返回 document 给客户端。

三、检索数据

GET /my-index/_search
{
"query": {
"match_all": {}
}
}

1、ES 的任意节点都可以作为协调(Coordinating)节点接受请求,每个节点都知道集群中任一文档位置;

2、协调节点进行分词等操作后,去查询所有的 shard 节点。

3、所有 shard 将满足条件的数据(id、排序字段等)信息返回给协调节点。

4、协调节点将数据重新进行排序,获取到真正需要返回的数据的 id。

5、协调节点再次请求对应的 shard (此时有 id 了,可以直接定位到对应shard)。

6、获取到全量数据,返回给客户端。

tips: ES 要尽量避免深度分页查询,因为每个 shard 都会返回 from+size 的数据。比如我们要每页显示 10 条,查询第 10000 页数据,那么每个分片就要返回10010 条数据,协调节点要处理更多的数据,这会严重的影响性能。





参考博文:

  1. 分布式系统的 Quorum 策略
  2. 协调节点

Elasticsearch 学习二(请求流程).的更多相关文章

  1. Struts2框架学习(二)——访问流程及架构

    1.Struts2的执行流程 从客户端发送请求过来,先经过前端控制器(核心过滤器StrutsPrepareAndExecuteFilter)过滤器中执行一组拦截器(一组拦截器就会完成部分功能代码),拦 ...

  2. Java开发学习(二十四)----SpringMVC设置请求映射路径

    一.环境准备 创建一个Web的Maven项目 参考Java开发学习(二十三)----SpringMVC入门案例.工作流程解析及设置bean加载控制中环境准备 pom.xml添加Spring依赖 < ...

  3. OKHttp源码学习同步请求和异步请求(二)

    OKHttp get private void doGet(String method, String s) throws IOException { String url = urlAddress ...

  4. SpringMVC学习笔记一(请求流程和配置,启动项目)

    springmvc请求流程: 1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3.处理器映 ...

  5. dubbo系列二、dubbo请求流程记录

    目录 1.dubbo请求处理流程 1.1. consumer端处理流程 1.2.provider端处理流程 1.3.dubbo请求分析记录-图 泳道图 xmind图 2.dubbo请求核心说明 1.d ...

  6. Elasticsearch学习总结 (Centos7下Elasticsearch集群部署记录)

    一.  ElasticSearch简单介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticse ...

  7. Struts2框架学习(二) Action

    Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...

  8. ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理

    分布式文档存储 ES分布式特性 屏蔽了分布式系统的复杂性 集群内的原理 垂直扩容和水平扩容 真正的扩容能力是来自于水平扩容–为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中 ES集群特点 ...

  9. Elasticsearch笔记二之Curl工具基本操作

    Elasticsearch笔记二之Curl工具基本操作 简介: Curl工具是一种可以在命令行访问url的工具,支持get和post请求方式.-X指定http请求的方法,-d指定要传输的数据. 创建索 ...

随机推荐

  1. Mac读写ntfs软件究竟哪一款适合我们?

    生活中我们免不了会使用一些硬盘设备来存储文件或者是数据,然而绝大多数的移动硬盘都是ntfs格式.Mac读写ntfs软件有很多,究竟哪一款适合我们? 首先,我们一起了解一下什么是ntfs格式.ntfs, ...

  2. selenium元素定位检查

    自动化测试的重点就是定位元素,然而定位元素没办法一步一步运行调试检查,每次都需要从代码的开始运行,检查起来效率极低. 一直想找一个能检查唯一性工具或者方法.百度发现一篇文章https://blog.c ...

  3. python办公入门3:xlrd操作工作表

    工作表 1 import xlrd 2 3 #接受工作表 4 data=xlrd.open_workbook("data.xlsx") 5 #查询第一个工作表的打开状态 6 pri ...

  4. Java基础教程——Socket编程

    Socket通常也称作"套接字",用于描述IP地址和端口,可以用来实现不同虚拟机或不同计算机之间的通信. --百度百科 套接字允许应用程序插入到网络中,并与插入到网络中的其他应用程 ...

  5. PHP后台基本语法使用笔记

    1. PHP中报500错误时如何查看错误信息 //将如下的代码放入PHP的文件中ini_set("display_errors","On"); error_re ...

  6. Docker 入门介绍

    Docker是什么 从发布到现在 docker一直很受关注,在一定程度是改变了软件行业 如果你还不知道 docker 是什么是不是有点out了,接下来我们来介绍docker是什么,解决了什么问题,好处 ...

  7. 新手上路A4——多JDK环境变量的配置

    目录 配置单个JDK的方法 配置2+JDK的方法 方法 补充 检查JDK版本是否切换成功 前面讲了如何选择Java版本. 以及JDK8和JDK11的下载安装配置 有想法的人就开始发动他们优秀的小脑袋瓜 ...

  8. 阻止brew自动更新

    export HOMEBREW_NO_AUTO_UPDATE=true  

  9. 这可能是最为详细的Docker入门总结

    写在前面 毕设是关于区块链的,自然就用到了docker,感觉到了docker的强大.学习源于总结,所以找了一些资料,这篇文章原作写的不错,看了好多遍哈哈. 这可能是最为详细的Docker入门总结 市面 ...

  10. 第4.8节 三目运算、del和pass语句

    一.三目运算 Python的三目运算与C语言的三目运算非常类似,具体语法如下: 条件为真的赋值表达式   if  条件   else 条件为假的表达式 三目运算实际上就是一种表达式计算,当对应if后面 ...