前面研究过ES的get api
的整体思路,作为编写ES插件时的借鉴。当时的重点在与理解整体流程,主要是shardOperation()
的方法内部的调用逻辑,就弱化了shards()
方法。实际上shards()
方法在理解ES的结构层面,作用更大一些。我们还是从get api
入手来理解shards()
。先回顾一下get api
的使用流程:使用很简单。但是如果考虑到分布式,背后的逻辑就不简单了。 假如ES集群有3个节点,数据所在的索引也有3个分片,每个分片一个副本。即index的设置如下:那么id为1的doc该分发到那个分片呢? 这个问题需要一篇详细的博文解答,这里我们先简单给一个结论:不知存,焉知取。 再整理一下取数据的核心流程:上面两步都关联着一个核心的数据结构ClusterState
, 我们可以使用_cluster/state?pretty
来查看这个数据结构:整个结构比较复杂,我们慢慢拆解, 一步步逐个击破。 拆解的思路还是从使用场景入手。 即metadata中存储了集群中每个索引的分片和副本数量, 索引的状态, 索引的mapping, 索引的别名等。这种结构,能提供出来的功能就是根据索引名称获取索引元数据
, 代码如下:这里我们关注点就是clusterState.metaData().index(index)
这句代码,它实现了根据索引名称获取索引元数据的功能
。 通过元数据中的分片数结合文档id,我们就能定位出文档所在的分片。 这个功能在Delete, Index, Get 三类API中都是 香港云主机必须的。 这里我们也能理解为什么ES的索引分片数量不能修改: 如果修改了,那么hash函数就没法正确定位数据所在分片。routing_table
存储着每个索引的分片信息,通过这个结构,我们能清晰地了解如下的信息:假如一个分片有2个副本,且都分配在不同的节点上,那么get api
一共有三个数据节点可供选择, 选择哪一个呢?这里暂时不考虑带preference
参数。
为了使每个节点都能公平被选择到,达到负载均衡的目的,这里用到了随机数。参考RotateShuffer也就是说使用ThreadLocalRandom.current().nextInt()
生成随机数作为种子, 然后取的时候依次旋转。 Collections.rotate()
的效果可以用如下的代码演示:比如请求A得到的节点列表是[b,c,a], 那么请求B得到的节点列表是[c,a,b]。这样就达到了负载均衡的目的。通过这个nodes
获取到节点信息后,就可以发送请求了,ES所有内部节点的通信都是基于transportService.sendRequest()
。总结一下,本文基于get api
梳理了一下ES的ClusterState中的几个核心结构: metadata
,nodes
, routing_table
。 还有一个routing_nodes
这里没有用到。后面梳理清楚使用场景后再记录。
相关推荐: Python怎么解决新客人数、回购人数和总人数问题
今天小编给大家分享一下Python怎么解决新客人数、回购人数和总人数问题的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。读取流水筛选出合生元益生菌…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。