Elasticsearch的路由(Routing)特性

2023-11-14

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所在的分片较大,出现数据偏移的情况,特别是多个这样的用户处于同一分片的时候,现象会更明显。具体的使用还是要结合实际的应用场景来选择的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch的路由(Routing)特性 的相关文章

随机推荐

  • 费曼技巧学习笔记

    博主狂言 技巧正文 技巧的详细步骤 技巧步骤一 技巧步骤二 技巧步骤三 技巧的提纲总结 费曼技巧可以解决的问题 费曼技巧的另一种描述四步学习法 步骤一 步骤二 步骤三 步骤四 博主读后感 博主狂言 初识费曼技巧 甚是熟悉 博主自认有那么一点
  • 基于Springboot实现Kafka消费数据

    本文介绍使用Kafka监听和订阅两种不同方式进行数据消费 1 配置文件 spring kafka bootstrap servers 192 168 1 16 9092 消费者 consumer group id alarmService
  • MySQL check table/optimize table/analyze table/REPAIR TABLE

    check table 检查InnoDB和MyIsam是否有错误 检查表或者视图是否存在错误 对 MyISAM 和 InnoDB 存储引擎的表有作用 对于 MyISAM 存储引擎的表进行表检查 也会同时更新关键字统计数据 CHECK TAB
  • 《ios零基础教程》-- ”Mac OS X的介绍”和一些“基础语法” 2014-3-18总结

    一 学前须知 讲的ios和c语言的一些发展历史 作为了解即可 二 Mac OS X简单介绍 讲的是对苹果电脑的一些操作和基础了解 感觉蛮有用的 以前都是用的windows 突然用这种高富帅装备 还真不习惯 装个软件都费劲 看了这个之后 对m
  • 1 Centos7安装(jdk8)Tomcat9并设置为开机启动

    一 安装过程 cd usr local src wget http mirrors hust edu cn apache tomcat tomcat 9 v9 0 12 bin apache tomcat 9 0 12 tar gz 可以下
  • 面试余额宝Java技术岗(1-4面题目):GC+spring+二叉树+Dubbo+线上调优+​​​​数据库索引+mq

    余额宝一面 JVM 内存分哪几个区 每个区的作用是什么 JVM有哪些回收算法 对应的收集器有哪些 GC 的两种判定方法 CMS 收集器与 G1 收集器的特点 hashmap源码问题 HashMap HashMap如何保证线程安全 Concu
  • Aix6.1下安装SWFTools

    该文章参考http tech sxinfo net jctj article do curMenu 14 childMenu 16 articleId 388 再结合我在实际上在Aix6 1上的安装经验来编写 相关文件的下载 ftp ftp
  • Linux 同步工具rsync 文件目录同步,增量备份的手段之一

    一 rsync介绍 rsync是linux系统下的数据镜像备份工具 使用快速增量备份工具Remote Sync可以远程同步 支持本地复制 或者与其他SSH rsync主机同步 它的特性如下 可以镜像保存整个目录树和文件系统 可以很容易做到保
  • 工具类库系列(十四)-FileData

    第十四个工具类 FileData 用于文本文件读取 保存 以及在内存中修改文本文件内容 读取 ifstream 保存 ofstream 修改内容 以string类型 获取 设置 文本文件内容 最大支持文件大小1M 上代码 FileData
  • 【多线程】线程安全、锁的同步和异步

    一 基本概念 线程安全 当多个线程访问某一个类 对象或方法 时 这个类始终都能表现出正确的行为 那么这个类 对象或方法 就是线程安全的 非线程安全 非线程主要是指多个线程对同一个对象中的同一个实例变量进行操作时会出现值被更改 值不同步的情况
  • cmake:foreach、endforeach

    foreach 为列表中的每个值计算一组命令 foreach
  • python 数据可视化- 地图

    import json from pyecharts charts import Map from pyecharts options import 读取数据文件 f open D 桌面 python 资料 可视化案例数据 地图数据 疫情
  • JWT安全

    文章目录 JWT是什么 为什么要使用JWT JWT的数据结构 JWT的工作过程 JWT是什么 JSON Web Token JWT 是一个开放标准 RFC 7519 它定义了一种紧凑的 自包含的方式 用于作为JSON对象在各方之间安全地传输
  • Markdown 常用语法汇总

    前言 Markdown 作为一种标记语言 本质上与HTML等无异 都是通过特定的语法 再经过渲染 才能呈现出最终效果 因为程序对 Markdown 语法的支持程度不同 故部分程序中可能无法使用一些较新的语法规则 本文将其常用的语法进行了汇总
  • k8s基础-kubectl node-shell 登录节点

    通过kubectl node shell可以直接登录任意节点主机 weops root node201 helm curl LO https github com kvaps kubectl node shell raw master ku
  • 抖音小程序分享 onShareAppMessage 例子

    onShareAppMessage function res let that this return desc title title 必须以 开头 path pages news detail id that data id 软件目录
  • word参考文献格式设置(国标下载)

    国标GBT7114免费下载查看第二步 1 设置国标GB格式 Word顶端 的 EndNote X7 选项卡 Bibliography 区域 Style 选择 Chinese Std GBT7714 Author Year 或 Chinese
  • matlab求传递函数在某个频率点的增益_了解一阶高通滤波器传递函数

    简要回顾一下 通过对S域电路的分析 可以得到低通滤波器的输入输出特性表达式 电路的VOUT VIN表达式是滤波器的传递函数 如果将该表达式与标准化形式进行比较 可以快速确定两个关键参数 即截止频率和最大增益 传递函数可以写成分子多项式除以分
  • CSS实现圣杯布局(双飞翼布局)的四种方式

    calc 函数 calc 函数用于动态计算长度值 需要注意的是 运算符前后都需要保留一个空格 例如 width calc 100 10px 任何长度值 都可以使用calc 函数进行计算 calc 函数支持 运算 calc 函数使用 标准的数
  • Elasticsearch的路由(Routing)特性

    Elasticsearch路由机制介绍 Elasticsearch的路由机制与其分片机制有着直接的关系 Elasticsearch的路由机制即是通过哈希算法 将具有相同哈希值的文档放置到同一个主分片中 这个和通过哈希算法来进行负载均衡几乎是