Elasticsearch 学习二(请求流程).
一、写入数据

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 条数据,协调节点要处理更多的数据,这会严重的影响性能。
参考博文:
Elasticsearch 学习二(请求流程).的更多相关文章
- Struts2框架学习(二)——访问流程及架构
		1.Struts2的执行流程 从客户端发送请求过来,先经过前端控制器(核心过滤器StrutsPrepareAndExecuteFilter)过滤器中执行一组拦截器(一组拦截器就会完成部分功能代码),拦 ... 
- Java开发学习(二十四)----SpringMVC设置请求映射路径
		一.环境准备 创建一个Web的Maven项目 参考Java开发学习(二十三)----SpringMVC入门案例.工作流程解析及设置bean加载控制中环境准备 pom.xml添加Spring依赖 < ... 
- OKHttp源码学习同步请求和异步请求(二)
		OKHttp get private void doGet(String method, String s) throws IOException { String url = urlAddress ... 
- SpringMVC学习笔记一(请求流程和配置,启动项目)
		springmvc请求流程: 1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3.处理器映 ... 
- dubbo系列二、dubbo请求流程记录
		目录 1.dubbo请求处理流程 1.1. consumer端处理流程 1.2.provider端处理流程 1.3.dubbo请求分析记录-图 泳道图 xmind图 2.dubbo请求核心说明 1.d ... 
- Elasticsearch学习总结 (Centos7下Elasticsearch集群部署记录)
		一. ElasticSearch简单介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticse ... 
- Struts2框架学习(二) Action
		Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ... 
- ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理
		分布式文档存储 ES分布式特性 屏蔽了分布式系统的复杂性 集群内的原理 垂直扩容和水平扩容 真正的扩容能力是来自于水平扩容–为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中 ES集群特点 ... 
- Elasticsearch笔记二之Curl工具基本操作
		Elasticsearch笔记二之Curl工具基本操作 简介: Curl工具是一种可以在命令行访问url的工具,支持get和post请求方式.-X指定http请求的方法,-d指定要传输的数据. 创建索 ... 
随机推荐
- uniapp和vue 父向子传值、传方法及子向父传值。(一看就会超级简约)
			1.父向子传值:父组件在引用子组件时通过自定义属性绑定自身需要传递的值(数据),子组件用props:[ '自定义' ]接收即可使用(props里数据是只读模式).(简约版:子绑定父的属性并用pro ... 
- Redis多线程原理详解
			本篇文章为你解答一下问题: 0:redis单线程的实现流程是怎样的? 1:redis哪些地方用到了多线程,哪些地方是单线程? 2:redis多线程是怎么实现的? 3:redis多线程是怎么做到无锁的? ... 
- open()和with open() as的区别
			2020-03-18 20:37:55 open()和with open() as的区别 1 file = open("test.txt","r") 2 fo ... 
- 聊聊 传统IO和网络IO
			IO 模型 传统 IO读写 磁盘IO主要的延时是由(以15000rpm硬盘为例): 机械转动延时(机械磁盘的主要性能瓶颈,平均为2ms) + 寻址延时(2~3ms) + 块传输延时(一般 ... 
- C语言讲义——全局变量和局部变量
			局部变量 普通的局部变量也叫动态变量,默认有个关键字叫auto,可以省略.有两种形式: 1.函数内的局部变量 2.复合语句内的局部变量:for(int i = 0; i<5; i++){-} 静 ... 
- Windows/Linux 代码共享,开发者称此举使Linux有了更差的结局
			英特尔近期披露了 Linux 图形驱动程序相关的一些细节并指出,英特尔的图形驱动程序现在已在 Windows/Linux 之间共享约 60% 的代码库,90~100% 的性能. 针对此事,红帽公司的高 ... 
- GAN和GAN的改进
			GAN 原始GAN中判别器要最小化如下损失函数,尽可能把真实样本分为正例,生成样本分为负例: 其中是真实样本分布,是由生成器产生的样本分布. 第一个式子我们不看梯度符号的话即为判别器的损失函数,log ... 
- 《Machine Learning in Action》—— 白话贝叶斯,“恰瓜群众”应该恰好瓜还是恰坏瓜
			<Machine Learning in Action>-- 白话贝叶斯,"恰瓜群众"应该恰好瓜还是恰坏瓜 概率论,可以说是在机器学习当中扮演了一个非常重要的角色了.T ... 
- Jmeter-BeanShell断言的运用一(JSON响应数据与数据库比对)
			前言 最近在学习BeanShell断言,发现有点强大哈,只要会写代码,就没有什么是断言不了的,哈哈哈,不过我现在只会写点蹩脚的代码,下面将介绍下如何将返回的JSON数据与数据库数据做对比. 注:本次涉 ... 
- MySQL(13)---MYSQL主从复制原理
			MYSQL主从复制原理 最近在做项目的时候,因为部署了 MYSQL主从复制 所以在这里记录下整个过程.这里一共会分两篇博客来写: 1.Mysql主从复制原理 2.docker部署Mysql主从复制实战 ... 
