ElasticSearch里面的路由功能介绍

原创 2017年06月21日 18:24:55

在ElaticSearch里面,路由功能算是一个高级用法,大多数时候我们用的都是系统默认的路由功能,我们知道一个es索引可以分多个shard和每个shard又可以有多个replia,那么现在思考一个问题,我们添加进去的数据,是如何分布在各个shard上面的,而查询时候它是又怎么找到特定的数据呢。

默认情况下,索引数据的分片规则,是下面的公式:

shard_num = hash(_routing) % num_primary_shards

_routing字段的取值,默认是_id字段或者是_parent字段,这样的取值在hash之后再与有多少个shard的数量取模,最终得到这条数据应该在被分配在那个一个shard上,也就是说默认是基于hash的分片,保证在每个shard上数据量都近似平均,这样就不会出现负载不均衡的情况,然后在检索的时候,es默认会搜索所有shard上的数据,最后在master节点上汇聚在处理后,返回最终数据。

但有时候,我们会有另外一种情况,比如说存储一年的数据,如果按hash去索引,那就是分布非常均匀,这样的话无论查询什么数据都会去所有的shard上查询,如果数据量比较大,那么响应速度就比较慢,但这时,我们通过调查发现,一年12个月的数据本身分布并不均匀,有几个月的数据偏多,有几个月的数据偏少,理想情况下,数据偏少的月,查询性能应该更快,但如果是基于hash分片,那么我们并不能实现这种需求,因为hash分片,查询时候必须要命中所有shard之后,查询的结果才是准的,这样以来,每次查询都要扫描所有shard,比如我已经知道数据本身就是1月份的,那其实最好的情况下,只查询1月的数据就行,而不需要把一年的数据都扫描一遍,导致最终的结果就是慢的更慢,快的也慢,所以我们要针对性的做优化。

那么如何优化,其实思路也比较明确了,那就是按照月份分区,每一个月的数据都存在指定的分区中,如果是mysql那就是每个月份一张表,然后查询时候,直接查询对应月份的数据即可,在es和solr中原理也大致如此,唯一不同的地方在于es和solr都比较方便的支持了路由字段的设置而如果是数据库,则需要自己通过中间件的方式来搞定,比如说mycat等。

下面来介绍如何在es中使用路由字段,先看一个官网给的简单的例子:

PUT my_index/my_type/1?routing=user1&refresh=true 
{
  "title": "This is a document"
}

GET my_index/my_type/1?routing=user1

上面的代码中,指定了一个用户属性作为路由进行分区,然后查询的时候也必须指定路由。这一点需要注意 只要在索引时候加入路由字段,那么在以后的get,delete,update操作中都必须使用路由字段,否则会出现问题。

当然,路由字段本身,也是可以被查询的,看下面的代码:

GET my_index/_search
{
  "query": {
    "terms": {
      "_routing": [ "user1" ] 
    }
  }
}

除此之外,路由字段,也可以指定多个:

GET my_index/_search?routing=user1,user2 
{
  "query": {
    "match": {
      "title": "document"
    }
  }
}

如果指定多个用户属性,那么es会仅仅查询关联了这两个route属性的shard

如果加入路由字段之后,其他的操作(indexing,getting,deleting,updating)都必须指定路由字段,为了避免在使用时忘记添加 路由字段,导致同类数据会分布在多个shard上,这就违反了路由的原则,所以我们可以在mapping中 设置路由字段是必须字段,否则会提示错误:

PUT my_index2
{
  "mappings": {
    "my_type": {
      "_routing": {
        "required": true 
      }
    }
  }
}

PUT my_index2/my_type/1 
{
  "text": "No routing value provided"
}

缺失路由字段会抛出异常:

routing_missing_exception

还需要注意到是如果使用了路由字段,那么_id字段只能由用户保证唯一性,因为同一个id的数据,如果路由字段不一样 它是可以被存在到多个shard中的,而默认情况下是不会出现这种情况的。

最后接着说开头的例子,如果某个月数据量偏大,全部路由到一个shard里面依然性能有问题,es也提供了 同一个路由的字段的数据可以被分配到多个shard上,注意这是是多个shard,而不是所有shard,当然这里面有一定 限制一般情况下,不建议使用这种模式。

对solr中路由感兴趣的朋友,可以查看我以前写的文章:

http://qindongliang.iteye.com/blog/2312193

参考资料:

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-routing-field.html



es route

{ "mappings": { "duser": { "_routing": { "required": true } } } } ...
  • u014017121
  • u014017121
  • 2017年05月05日 12:20
  • 476

Elasticsearch的路由(Routing)特性

Elasticsearch的路由机制与其分片机制有着直接的关系。Elasticsearch的路由机制即是通过哈希算法,将具有相同哈希值的文档...
  • cnweike
  • cnweike
  • 2014年10月14日 16:54
  • 15236

elasticsearch的路由选择

集群介绍: cluster 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这...
  • CCTV_End
  • CCTV_End
  • 2016年04月13日 18:55
  • 1376

Elasticsearch模块功能之-路由(routing)

索引分片分配能够控制索引分片在节点上怎么分布,那对于具体的文档能否控制具体节点的分布呢?答案是可以,根据路由公式shard = hash(routing) % number_of_primary_sh...
  • changong28
  • changong28
  • 2014年08月07日 22:56
  • 6405

elasticsearch 自定义hash function (routing)

本次研究基于elastic search verison 2.1.1 为何想要自定义hash function? 本意是想提高elasticsearch的indexing速度。 具体思路就是: 1.将...
  • zhanlanlubai
  • zhanlanlubai
  • 2016年05月31日 16:28
  • 1659

Elasticsearch的使用场景深入详解

了解了ES的使用场景,ES的研究、使用、推广才更有价值和意义。1、场景—:使用Elasticsearch作为主要的后端传统项目中,搜索引擎是部署在成熟的数据存储的顶部,以提供快速且相关的搜索能力。这是...
  • wojiushiwo987
  • wojiushiwo987
  • 2016年08月17日 08:40
  • 24784

Elasticsearch模块功能之-索引别名(Index aliases )

Elasticsearch的API支持给索引起别名,有了别名之后可以像使用索引一样使用它。但不只是这些,一个别名可以映射多个索引,所以在需要经常指定多个索引查询的情况下,大可将所查询的索引起一个别名来...
  • changong28
  • changong28
  • 2014年08月07日 19:38
  • 7419

ElasticSearch17:图解剖析document路由原理

1.document路由到shard上,是什么意思? 我们知道,一个index的数据会分成多片, 每片都在一个shard中,所以,一个document 只能存在于一个shard中。 当客户端创建do...
  • m0_37557582
  • m0_37557582
  • 2017年12月29日 13:42
  • 14

ElasticSearch(ES)中的分片查询方式

原文地址:http://www.bubuko.com/infodetail-836737.html Es查询的时候默认是随机从一些分片中查询数据,可以通过配置让es从某些分片中查询数据 1:_l...
  • tanga842428
  • tanga842428
  • 2017年03月09日 08:34
  • 2590

elasticsearch的5种分片查询优先级

elasticsearch可以使用preference参数来指定分片查询的优先级,使用时就是在请求url上加上preference参数,如:http://ip:host/index/_search?p...
  • ganshougudu8
  • ganshougudu8
  • 2015年03月18日 13:27
  • 1345
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ElasticSearch里面的路由功能介绍
举报原因:
原因补充:

(最多只允许输入30个字)