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"
- }'
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 -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"
- }
- }
- }
- }
- }'
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 '{}'
curl -XGET 'http://localhost:9200/forum/posts/?routing=Admin,Moderator' -d '{}'
路由机制的总结
实际上,如果不明确指明使用路由机制,实际上路由机制也是在发挥作用的,只是默认的路由值是文档的id而已。而个性化路由的需求主要是和业务相关的。默认的路由(如果是自动的生成的id)直观上会把所有的文档随机分配到一个分片上,而个性化的路由值就是和业务相关的了。这也会造成一些潜在的问题,比如user123本身的文档就非常多,有数十万个,而其他大多数的用户只有几个文档,这样的话就会导致user123所在的分片较大,出现数据偏移的情况,特别是多个这样的用户处于同一分片的时候,现象会更明显。具体的使用还是要结合实际的应用场景来选择的。
相关推荐
### Elasticsearch路由机制详解 #### 一、Elasticsearch 路由机制概述 Elasticsearch是一种高度可扩展的开源搜索引擎,其设计目的是处理大量数据,同时保持快速的响应时间。为了实现这一目标,Elasticsearch采用了...
Elasticsearch 直接路由插件此插件使文档能够根据以下公式路由到分片。 selected_shard = routing_key % number_of_shards 例如,考虑具有 5 个分片的 Elasticsearch 索引。 下表显示了文档将如何路由到分片,用于...
Elasticsearch是一个开源的全文搜索引擎,它以分布式、RESTful接口和实时性为特点,广泛应用于数据搜索和分析场景。这个"elasticsearch-7.6.2.zip"压缩包包含了Elasticsearch 7.6.2版本的源代码,允许开发者深入理解...
7. **路由(Routing)**:确定文档存储在哪个分片上的过程,通常基于文档的_id或自定义字段进行。 现在,我们开始安装Elasticsearch: 1. **下载**:首先,从Elasticsearch官方网站下载适合您操作系统的安装包。...
2. **routing参数**:用于控制文档路由到特定分片,提高搜索效率。 3. **存储过程**:讲解文档数据在Elasticsearch中的存储方式。 **七、ES存储原理** 1. **分段存储**:Elasticsearch将数据分段存储,每个段是不...
源码中,可以看到Elasticsearch如何实现节点间的通信、数据分片和副本机制,以及如何处理索引的自动路由和负载均衡。 学习Lucene 4.4和Elasticsearch的源码,可以帮助开发者深入理解信息检索的核心原理,包括倒排...
- **Replica**: `org.elasticsearch.cluster.routing` 和 `org.elasticsearch.cluster.service` 包下包含关于副本的路由和集群状态更新逻辑。 - **Search**: `org.elasticsearch.search` 包中的类涉及搜索算法,如 `...
Elasticsearch(ES)是一种分布式、RESTful风格的搜索和数据分析引擎,常用于大数据分析和实时搜索场景。它不依赖传统的SQL数据库语句,而是采用JSON文档格式和HTTP协议进行交互。本文将涵盖ES的安装、配置、Kibana...
在6.4版本中,Elasticsearch 继续优化了性能,提升了稳定性,并引入了一些新的特性和改进。这份中文文档将帮助我们深入理解并掌握 Elasticsearch 的核心概念和功能。 **一、基本概念** 1. **索引(Index)**:类似...
此外,Elasticsearch的术语还包含如Term(术语)、Field(字段)、Document(文档)、Index(索引)、Shard(分片)、Replica(副本)、Routing(路由)等,它们共同构成了Elasticsearch体系结构的基础。 在安装和...
Elasticsearch(简称ES)是一种基于Apache Lucene的开源全文搜索引擎,设计用于分布式、可扩展的实时搜索和分析引擎。它不仅能够提供全文检索功能,还可以进行数据分析,甚至实时监控。在大数据时代,Elasticsearch...
Elasticsearch的核心特性之一便是支持分布式的索引和搜索,这主要通过分片和副本机制实现。正确地规划分片策略对于确保系统的高可用性和高性能至关重要。 **2.1 合理设置分片数** - **分片的基本概念**:分片是在...
Elasticsearch(简称ES)是一种基于Lucene的分布式、RESTful搜索分析引擎,广泛应用于日志分析、实时监控、数据搜索等领域。以下精选的7道Elasticsearch面试题旨在帮助你深入理解其核心概念和技术: 1. **什么是...
从 5.0 版本开始,Elasticsearch 引入了内置的安全特性,如用户认证、角色权限管理,以及 SSL/TLS 加密,以增强数据安全。 ### 八、最佳实践 1. **合理规划索引和分片**:根据数据量和预期查询负载设置分片数量。 ...
8. **路由(Routing)**:当文档被索引时,Elasticsearch根据路由值决定将其分配到哪个分片。默认情况下,路由值是文档的_id,但也可以自定义。 9. **搜索(Search)**:Elasticsearch提供了强大的全文搜索功能,...
本篇将深入探讨Elasticsearch的基础知识,涵盖其核心概念、环境搭建、配置管理以及高级特性。 **一、Elasticsearch核心概念** 1. **文档(Document)**:Elasticsearch处理的基本单元,可以看作是JSON格式的数据对象...
Elasticsearch(简称ES)是一个基于Lucene的开源搜索引擎,它以其高可扩展性、实时性、分布式特性以及强大的数据分析能力而广受赞誉。在这个名为"es-maven"的项目中,我们看到的是Elasticsearch的源码,这为我们深入...
该命令启用集群的路由分配,允许 Elasticsearch 在节点变化时进行集群重平衡操作。 #### 高级数据恢复策略 除了基本的数据恢复机制外,Elasticsearch 还支持更高级的数据恢复策略,包括但不限于: - **快照和恢复...
Elasticsearch 的分布式特性使其能够水平扩展,通过添加更多节点来提高性能和容错性。 1. **分片(Shard)**: 索引被划分为多个分片,每个分片可以存在于不同的节点上,分片可以是主分片或副本分片。主分片用于写入...