大白话讲解Elasticsearch的查询内部原理
Posted Java码农社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大白话讲解Elasticsearch的查询内部原理相关的知识,希望对你有一定的参考价值。
一、document数据路由到shard上的原理
1、什么叫document路由到shard上?
我们知道(即使不知道也没关系,以后文章会逐个讲解),ES一个索引(index)的数据(document)会被分为多片(shard),一条document数据只能存在于一个shard中。当创建document的时候,ES就决定了这个document是放在这个index的哪个shard上的。上面这个过程就叫数据路由(document routing)。
2、数据路由是怎么计算在哪个shard上的?
公式如下:看不懂没关系,后面会有例子和解释
hash(routing number) % number_of_primary shards
案例:
比如说一个索引下有3个primary shard,分别为P0,P1和P2
每次CRUD一个document的时候都会带过来一个routing number,这个routing值默认就是这个document_id(这个id可以自动生成也能手动指定一个上去,具体方法不懂的话我后面文章会讲解),假设这里document_id是1,也就是说routing number=1。
套入公式中是如下:
将1(routing number的值)传入一个hash函数中,会根据hash算法生成hash值,假设hash值的21,hash(routing number)=21,然后将21对这个index的primary shard的数量求余数,也就是说21 % 3 = 0,这个0就代表了P0,也就决定了这个document存放于P0上。
3、routing值的手动指定方式
上面说了,routing值默认是document的_id
怎么手动指定呢?
直接加routing=number,简单粗暴。
比如
PUT /index/type/id?routing=111
二、进入主题:Elasticsearch的查询内部原理
1、先看一张图
ES查询内部原理图
2、解释说明
1、客户端发送请求到任意(随机选择)一个node(节点),此时这个node就成为coordinate node(协调节点)
2、coordinate node(协调节点)对document数据进行路由,将请求转发到对应的node(节点),此时会使用随机轮询算法(具体怎么实现的就不讲解了),在primary shard以及其所有replica shard中随机选择一个,让读请求负载均衡。
3、接收请求的node查完数据后会将数据返回给coordinate node(协调节点)
4、coordinate node(协调节点)将数据返回给客户端(用户)。
注意是存在特殊情况的:document如果还在建立索引过程中,可能只有primary shard有,任何一个replica shard都没有,此时可能会导致无法读取document(会很快,近实时),但是document完成索引建立之后,primary shard和replica shard就都有了。
若有兴趣,欢迎来加入群,【Java初学者学习交流群】:458430385,此群有Java开发人员、UI设计人员和前端工程师。有问必答,共同探讨学习,一起进步!
以上是关于大白话讲解Elasticsearch的查询内部原理的主要内容,如果未能解决你的问题,请参考以下文章
推荐系统[九]项目技术细节讲解z1:Elasticsearch 如何进行快速检索(ES倒排索引和分词原理)以及倒排索引在召回中的应用。
Elasticsearch / Kibana Queries - 深度教程