大白话讲解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的查询内部原理的主要内容,如果未能解决你的问题,请参考以下文章

大白话讲解神经网络算法,原理如此简单!

用通俗易懂的大白话讲解Map/Reduce原理

推荐系统[九]项目技术细节讲解z1:Elasticsearch 如何进行快速检索(ES倒排索引和分词原理)以及倒排索引在召回中的应用。

Elasticsearch / Kibana Queries - 深度教程

用图讲解 ElasticSearch 搜索原理,你就明白了!

ElasticSearch - ElasticSearch基本概念及集群内部原理