Elasticsearch的路由(Routing)特性
Elasticsearch路由机制介绍
Elasticsearch的路由机制与其分片机制有着直接的关系。Elasticsearch的路由机制即是通过哈希算法,将具有相同哈希值的文档放置到同一个主分片中。这个和通过哈希算法来进行负载均衡几乎是一样的。
而Elasticsearch也有一个默认的路由算法:它会将文档的ID值作为依据将其哈希到相应的主分片上,这种算法基本上会保持所有数据在所有分片上的一个平均分布,而不会产生数据热点。
而我们为什么会需要自定义的Routing模式呢?首先默认的Routing模式在很多情况下都是能满足我们的需求的——平均的数据分布、对我们来说是透明的、多数时候性能也不是问题。但是在我们更深入地理解我们的数据的特征之后,使用自定义的Routing模式可能会给我们带来更好的性能。
假设你有一个100个分片的索引。当一个请求在集群上执行时会发生什么呢?
1. 这个搜索的请求会被发送到一个节点
2. 接收到这个请求的节点,将这个查询广播到这个索引的每个分片上(可能是主分片,也可能是复制分片)
3. 每个分片执行这个搜索查询并返回结果
4. 结果在通道节点上合并、排序并返回给用户
因为默认情况下,Elasticsearch使用文档的ID(类似于关系数据库中的自增ID,当然,如果不指定ID的话,Elasticsearch使用的是随机值)将文档平均的分布于所有的分片上,这导致了Elasticsearch不能确定文档的位置,所以它必须将这个请求广播到所有的100个分片上去执行。这同时也解释了为什么主分片的数量在索引创建的时候是固定下来的,并且永远不能改变。因为如果分片的数量改变了,所有先前的路由值就会变成非法了,文档相当于丢失了。
而自定义的Routing模式,可以使我们的查询更具目的性。我们不必盲目地去广播查询请求,取而代之的是:我们要告诉Elasticsearch我们的数据在哪个分片上。
原来的查询语句:“请告诉我,USER1的文档数量一共有多少”
使用自定义Routing(在USESR ID上)后的查询语句:“请告诉我,USER1的文档数量一共有多少,它就在第三个分片上,其它的分片就不要去扫描了”
指定个性化路由
所有的文档API(get,index,delete,update和mget)都能接收一个routing参数,可以用来形成个性化文档分片映射。一个个性化的routing值可以确保相关的文档存储到同样的分片上——比如,所有属于同一个用户的文档。
第一种方法,也是比较直观的方法就是直接在请求的URL中指定routing参数:
curl -XPOST 'http://localhost:9200/store/order?routing=user123' -d '
{"productName": "sample","customerID": "user123"
}'
这样我们就按照用户的customerID的值将具有相同customerID的文档置于同一分片上了。
第二种方法就是直接从文档中提取到对应的路由值:
curl -XPUT 'http://localhost:9200/store/order/_mapping' -d '
{"order": {"_routing": {"required": true,"path": "customerID"}}
}'
这样的方法和第一种方法在效果上一样的,但是有一点需要注意,相比于第一种方法这种方法的效率稍低,因为第一种方法直接就在请求的参数中确定了路由的值,而第二种方法中,首先需要将文档读入之后,再从中提取到对应的路由值。
利用路由机制的查询
利用路由机制的查询也是非常简单明了的,只需要在查询中指定对应的路由值即可:
curl -XGET 'http://localhost:9200/store/order/_search?routing=user123' -d '
{"query": {"filtered": {"query": {"match_all": {}},"filter": {"term": {"userID": "user123"}}}}
}'
通过指定的路由值 ,我们就可以直接定位到user123的文档所在的分片,而不用一股脑的向索引的所有节点都发送请求。这样的话,会大大减少系统资源的浪费。
当然,也可以同时指定多个路由值,方法也是显而易见的,只需要在查询参数中指定多个路由值即可:
curl -XGET 'http://localhost:9200/forum/posts/?routing=Admin,Moderator' -d '{}'
路由机制的总结
实际上,如果不明确指明使用路由机制,实际上路由机制也是在发挥作用的,只是默认的路由值是文档的id而已。而个性化路由的需求主要是和业务相关的。默认的路由(如果是自动的生成的id)直观上会把所有的文档随机分配到一个分片上,而个性化的路由值就是和业务相关的了。这也会造成一些潜在的问题,比如user123本身的文档就非常多,有数十万个,而其他大多数的用户只有几个文档,这样的话就会导致user123所在的分片较大,出现数据偏移的情况,特别是多个这样的用户处于同一分片的时候,现象会更明显。具体的使用还是要结合实际的应用场景来选择的。
Elasticsearch的路由(Routing)特性相关推荐
- Elasticsearch:路由 - routing
你是否考虑过 Elasticsearch 如何知道将文档存储在何处? 它如何知道在哪里寻找它们,以及是否检索.更新或删除它们? 这是一个令人兴奋的过程,一切都归结为路由的概念. 路由介绍 路由是确定文 ...
- 【elasticsearch】 elasticsearch document 路由 (routing) 到shard
文章目录 1.概述 2. 工作原理 2.1.数据路由(routing) 2.2.路由算法 2.3 routing_partition_size参数 3.primary shard数量不可变的谜底 4. ...
- Elasticsearch各个版本重要特性
Elasticsearch各个版本重要特性 Elasticsearch 5 Elasticsearch 6.0 Elasticsearch 7.0 Elasticsearch 8.0 Elastics ...
- 【OSPF外部路由-4类LSA(sum-asbr)和5类LSA(external)以及7类LSA(Nssa)】(OSPF的特殊区域)(外部路由选路特性)
目录 一.ospf外部路由产生的背景 1.背景: 2.ASBR:自治边界路由器 1)ASBR:自治边界路由器.(只要有一天ospf设备引入了外部路由,那么他就是ASBR) 其产生的LSA类型叫做AS- ...
- Elasticsearch之路由
什么使用路由 假设有一个100个分片的索引,当一个请求在集群上执行时会发生什么呢? 这个搜索的请求会被发送到集群中的一个节点上 接收到这个请求的节点,将这个查询转到这个索引的每个分片上(可能是主分片, ...
- java 路由_RabbitMQ入门:路由(Routing)
在上一篇博客<RabbitMQ入门:发布/订阅(Publish/Subscribe)>中,我们认识了fanout类型的exchange,它是一种通过广播方式发送消息的路由器,所有和exch ...
- RabbitMQ入门:路由(Routing)
在上一篇博客<RabbitMQ入门:发布/订阅(Publish/Subscribe)>中,我们认识了fanout类型的exchange,它是一种通过广播方式发送消息的路由器,所有和exch ...
- 网址路由Routing组件如何在mvc中生成网址
一.摘要 本篇文章从基础到深入的介绍ASP.NET MVC中的Routing组件. Routing翻译过来是"路由选择", 负责ASP.NET MVC的第一个工作:识别URL, 将 ...
- [Ext JS6]路由(Routing)及使用
文章目录 在应用中使用路由(Routing) 应用路由的实现方式 更新哈希 默认令牌-Token 带参数的哈希 哈希参数的格式 路由的处理 处理没有匹配的路由 在单个哈希使用多个路由 在应用中使用路由 ...
最新文章
- 层展开/关闭 - 运动缓冲效果
- 再谈 Promise
- 今天被编码搞惨了,页面和脚本的编码一致性
- java.exe 安装程序_java实现可安装的exe程序实例详解
- csi python 摄像头 树莓派_树莓派之摄像头和人脸识别
- linux网络编程之用select方法实现io复用(基于udp)
- C ++或Java,高频交易哪个更快?
- java循环的内部改变循环变量的值_java在for循环中怎样修改参数值?
- 【前端】数字媒体技术专业主要课程及就业方向
- Centos7 FastDFS 安装和配置启动
- 唐宇迪学习笔记7:梯度下降策略
- 数据结构与算法之树的孩子双亲存储结构的讲解
- 注册华为云用户: 访问官网 https://huaweicloud.com/ 注册华为云用户(需手机号验证) 登录并完成实名认证 为账号充值不少于100元(不用时可提现
- Web漏洞挖掘(一)登录认证模块的暴力破解实例
- Maven整合阿里云云效制品仓库 Packages(私服)
- JAVA毕业设计高校人事管理系统计算机源码+lw文档+系统+调试部署+数据库
- 教你如何用cmd命令清除流氓软件
- 决策规划算法相关知识之 POMDP模型
- 二进制转化成ascll_微机原理实验-二进制到ASCII码转换
- 血氧仪电路方案开发--PCBA方案