文档章节

(转)Elasticsearch的路由(Routing)特性

木子SMZ
 木子SMZ
发布于 2018/07/13 10:28
字数 1430
阅读 62
收藏 1
curl -XPUT 'http://localhost:9200/store/order/_mapping' -d '
{
    "order": {
        "_routing": {
            "required": true,
            "path": "customerID"
        }
    }
}'

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

本文转载自:https://blog.csdn.net/cnweike/article/details/38531997

木子SMZ
粉丝 2
博文 34
码字总数 22804
作品 0
昌平
程序员
私信 提问
Elasticsearch的路由(Routing)特性

目录(?)[-] Elasticsearch路由机制介绍 指定个性化路由 利用路由机制的查询 路由机制的总结 Elasticsearch路由机制介绍 Elasticsearch的路由机制与其分片机制有着直接的关系。Elasticsearch...

allantaylor81
2015/08/11
0
0
Elasticsearch内核解析 - 数据模型篇

Elasticsearch是一个实时的分布式搜索和分析引擎,它可以帮助我们用很快的速度去处理大规模数据,可以用于全文检索、结构化检索、推荐、分析以及统计聚合等多种场景。 Elasticsearch是一个建...

少强
2018/04/16
0
0
ElasticSearch大数据分布式弹性搜索引擎使用—从0到1

阅读目录: 背景 安装 下载elasticsearch servicewrapper 包 elasticsearch servicewrapper开源包的配置小bug servicewrapper安装 chkconfig -add 加入linux启动服务列表 查找、下载rpm包 、...

王清培
2018/06/26
0
0
bboss elasticsearch v5.0.7.0 发布

The best elasticsearch highlevel java rest api-----bboss bboss elasticsearch v5.0.7.0发布 v5.0.7.0新增功能特性和改进 1.增加批量索引添加/修改方法,可以为list参数指定文档id 和文档...

bboss
2018/06/01
441
0
Elasticsearch内核解析 - 写入流程

目前的Elasticsearch有两个明显的身份,一个是分布式搜索系统,另一个是分布式NoSQL数据库,对于这两种不同的身份,读写语义基本类似,但也有一点差异。 写操作 实时性: 搜索系统的Index一般...

少强
2018/04/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊spring cloud的ConsulServiceRegistry

序 本文主要研究一下spring cloud的ConsulServiceRegistry ServiceRegistry spring-cloud-commons-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/client/serviceregistry/ServiceR......

go4it
7分钟前
0
0
Nextjs 学习 —— hooks

22

lemos
16分钟前
0
0
如何在spring mvc restful接口中定制化类型转换和格式化

1.痛点 最近小胖哥搞了个小程序,有几个spring mvc 接口传递了时间,时间用java 8 time 相关的api 来直接接收: 当使用根据ISO 8601格式化的参数向任何这些方法发送POST请求时,报出了如下异...

码农小胖哥
30分钟前
2
0
docker日志监控

日志处理机制 我们先来了解一下docker日志处理的机制,当启动一个容器的时候,它其实是docker daemon的一个子进程,docker daemon可以拿到你容器里面进程的标准输出,拿到标准输出后,它会通...

爱宝贝丶
31分钟前
2
0
域名已备案,但jsapi添加支付授权目录依然提示支付授权目录未通过ICP备案!!!

问题描述: 一网站域名xxx.cn已备案成功,在全国工业和信息化部(http://beian.miit.gov.cn/publish/query/indexFirst.action)查询到备案成功的,但是在微信商户平台配置jsapi添加支付授权目录...

闊苡訆涐囍醣
36分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部