【Elasticsearch专栏 08】深入探索:Elasticsearch中的Routing机制详解

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: Elasticsearch中的Routing机制允许用户根据自定义规则决定文档存储在哪个分片上。通过指定路由值,可以控制相关文档被路由到同一分片,优化查询性能和数据一致性。但需注意路由一致性和负载均衡问题。

Elasticsearch中的Routing机制详解

在深入研究Elasticsearch的内部工作原理时,不可避免地会遇到“Routing”这一概念。Routing是Elasticsearch中用于确定文档应存储在哪个分片上的机制。理解Routing的工作原理对于优化Elasticsearch集群的性能、确保数据的一致性和实现特定的数据布局策略至关重要。

01 Routing的基础

Elasticsearch是一个分布式搜索和分析引擎,能够处理大量数据。为了实现水平扩展和高可用性,Elasticsearch将数据分散存储在多个分片(Shard)上。每个索引由一个或多个分片组成,每个分片可以有零个或多个副本(Replica)。默认情况下,文档的路由是基于其ID进行的,但Elasticsearch也允许用户通过自定义路由值来控制文档的放置。

1.默认路由

当不指定路由值时,Elasticsearch使用文档的_id字段来计算其哈希值,该哈希值随后用于确定文档应存储在哪个分片上。这种默认路由策略确保具有相同ID的文档总是被路由到相同的分片上。

2.自定义路由

然而,在某些情况下,可能希望根据文档的其他属性(如用户ID、时间戳等)来控制文档的路由。这时,可以使用自定义路由值。通过指定路由值,可以确保具有相同路由值的文档被放置在相同的分片上。这对于某些用例(如确保特定用户的所有数据都存储在同一个分片上)非常有用。

02 Routing的使用场景

  1. 优化查询性能:通过将相关的文档路由到相同的分片上,可以减少跨分片查询的需要,从而提高查询性能。例如,如果的应用程序经常需要按用户ID检索文档,那么按用户ID进行路由将是有益的。
  2. 控制数据布局:在某些情况下,可能希望根据特定的业务需求来控制数据的物理布局。可能希望将特定时间范围内的文档存储在同一个分片上,以便进行更高效的时间范围查询。
  3. 确保数据一致性:通过自定义路由,可以确保对具有相同路由值的文档的读取和写入操作都在同一个分片上执行,从而减少数据不一致的风险。

03 如何使用Routing

在Elasticsearch中,可以通过以下几种方式使用Routing:

1. 索引文档时指定路由值

当索引一个新文档时,可以通过在请求中包含_routing参数来指定路由值。例如:

PUT /my_index/_doc/1?routing=user123
{
   
  "user_id": "user123",
  "title": "My first blog post"
}

在这个例子中,指定了routing=user123,这告诉Elasticsearch将文档路由到与user123哈希值对应的分片上。如果以后需要检索或更新这个文档,也需要在请求中包含相同的路由值。

2. 使用自定义路由字段

除了直接在请求中指定路由值外,还可以在索引的映射中定义一个自定义路由字段。例如:

PUT /my_index
{
   
  "mappings": {
   
    "properties": {
   
      "user_id": {
   
        "type": "keyword"
      },
      "title": {
   
        "type": "text"
      }
    }
  },
  "settings": {
   
    "index.routing_field": "user_id" 
  }
}

在这个例子中,通过设置index.routing_fielduser_id来告诉Elasticsearch使用user_id字段的值作为路由值。这样,当索引一个新文档时,Elasticsearch将自动使用user_id字段的值来计算路由哈希值。

3. 使用父/子关系

Elasticsearch还支持父/子文档关系,其中子文档的路由值由其父文档的ID确定。这种关系允许在相同的分片上存储相关的父/子文档,从而优化关联查询的性能。然而,需要注意的是,父/子关系在Elasticsearch 7.x版本之后已被弃用,并在后续版本中完全删除。因此,对于新的应用程序,建议使用其他方法来模拟父/子关系(如使用嵌套对象或单独的关联索引)。

04 Routing的注意事项

  1. 路由一致性:一旦为文档指定了路由值(无论是通过请求参数还是映射设置),所有对该文档的后续操作(如检索、更新、删除等)都必须使用相同的路由值。否则,Elasticsearch将无法找到文档或将其路由到正确的分片上。
  2. 分片均衡:虽然自定义路由可以提高查询性能和数据一致性,但它也可能导致某些分片上的负载过高。如果大量文档具有相同的路由值,那么这些文档将被集中在少数几个分片上,从而导致这些分片的负载显著增加。因此,在设计自定义路由策略时,需要仔细考虑数据的分布和负载均衡。
  3. 重新平衡和迁移:当集群的拓扑结构发生变化(如添加或删除节点、调整分片数量等)时,Elasticsearch会尝试重新平衡数据分布以确保集群的健康和性能。然而,当使用自定义路由时,这种重新平衡可能会变得更加复杂。因为具有相同路由值的文档总是被路由到相同的分片上,所以即使在集群重新平衡期间,这些文档也不会被迁移到其他分片。这可能导致某些分片上的数据量远远超过其他分片,从而影响集群的整体性能。

05 如何处理Routing的问题

1. 监控和调整

在使用自定义路由时,密切监控集群的状态和性能至关重要。通过使用Elasticsearch提供的监控工具和API,可以定期检查分片的负载、查询性能等指标,并根据需要调整路由策略或集群配置。

2. 谨慎选择路由字段

选择适当的路由字段对于避免数据倾斜和确保负载均衡至关重要。理想情况下,路由字段应该具有足够的唯一性,以便将文档均匀分布到不同的分片上。同时,也要避免使用那些可能导致大量文档具有相同路由值的字段。

3. 考虑使用哈希路由

为了避免数据倾斜和确保负载均衡,可以考虑使用哈希路由。哈希路由通过对路由字段进行哈希计算来生成一个唯一的哈希值,然后将具有相同哈希值的文档路由到相同的分片上。这种方法可以确保文档在分片上的均匀分布,从而避免某些分片上的负载过高。

4. 重新索引和重新分片

如果集群的性能受到严重影响,并且无法通过调整路由策略或监控来解决,可能需要考虑重新索引和重新分片。这涉及到创建一个新的索引,将数据从旧索引迁移到新索引,并根据需要调整分片数量和配置。虽然这个过程可能需要一些时间和资源,但它可以帮助恢复集群的性能和平衡数据分布。

06 结论

Routing是Elasticsearch中一个强大而灵活的功能,它允许用户根据自定义规则控制文档的存储和检索。通过合理使用Routing机制,可以提高查询性能、确保数据一致性并优化系统负载。然而,也需要注意路由一致性、负载均衡和数据重新平衡等问题。通过仔细监控和调整集群配置,可以充分发挥Routing机制的优势,从而构建高效、可靠和可扩展的Elasticsearch集群。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
6月前
|
存储 自然语言处理 NoSQL
深入解析Elasticsearch的内部数据结构和机制:行存储、列存储与倒排索引之倒排索引(三)
深入解析Elasticsearch的内部数据结构和机制:行存储、列存储与倒排索引之倒排索引(三)
|
6月前
|
存储 自然语言处理 NoSQL
深入解析Elasticsearch的内部数据结构和机制:行存储、列存储与倒排索引之列存(二)
深入解析Elasticsearch的内部数据结构和机制:行存储、列存储与倒排索引之列存(二)
|
6月前
|
存储 JSON NoSQL
深入解析Elasticsearch的内部数据结构和机制:行存储、列存储与倒排索引之行存(一)
深入解析Elasticsearch的内部数据结构和机制:行存储、列存储与倒排索引之行存(一)
|
7月前
|
数据采集 数据挖掘 索引
Elasticsearch “指纹”去重机制,你实践中用到了吗?
Elasticsearch “指纹”去重机制,你实践中用到了吗?
94 7
|
7月前
|
Kubernetes Java 索引
Elasticsearch 源码探究 001——故障探测和恢复机制
Elasticsearch 源码探究 001——故障探测和恢复机制
103 0
|
存储 消息中间件 缓存
【ElasticSearch从入门到放弃系列 九】Elasticsearch原理机制探索
【ElasticSearch从入门到放弃系列 九】Elasticsearch原理机制探索
247 0
|
存储 分布式计算 网络协议
白话Elasticsearch64-zen discovery集群发现机制
白话Elasticsearch64-zen discovery集群发现机制
209 0
|
数据挖掘
白话Elasticsearch53-深入聚合数据分析之Collect Model_bucket优化机制:深度优先、广度优先
白话Elasticsearch53-深入聚合数据分析之Collect Model_bucket优化机制:深度优先、广度优先
85 0
|
缓存 Java 数据挖掘
白话Elasticsearch50-深入聚合数据分析之doc values机制
白话Elasticsearch50-深入聚合数据分析之doc values机制
109 0
|
自然语言处理 搜索推荐 索引
白话Elasticsearch23-深度探秘搜索技术之通过ngram分词机制实现index-time搜索推荐
白话Elasticsearch23-深度探秘搜索技术之通过ngram分词机制实现index-time搜索推荐
137 0