首页 > IT基础架构 > > Elasticsearch之路由机制
笔者以如下的url添加数据,其中的requestbody笔者没有复制上来,url中末尾的1代表添加的id,笔者改变末尾的id添加多条数据
http://127.0.0.1:9200/library/book/1?routing=artlibrary这个索引总共有5个分片,笔者想知道,如果笔者以routing=art的路由策略添加数据,那么数据究竟会存储到哪个节点中呢?elasticsearch不会告诉用户具体的某条数据存储到哪个分片中,但是Elasticsearch提供了如下的Api,当我们指定routing=art的时候,elasticsearch会路由到哪个节点
http://127.0.0.1:9200/library/_search_shards?routing=art它的响应结果如下,elasticsearch显示routing=art的两个目标分片,其中一个分片是主分片,另外一个分片是副本分片
{
"nodes": {
"lQLESgJoS12387zrTI5V7w": {
"name": "node-1",
"ephemeral_id": "oL9hNCHvRCehV3om_NZb9g",
"transport_address": "127.0.0.1:9302",
"attributes": {}
},
"gfGyP8AQTAGpTN12JIKp8w": {
"name": "node-2",
"ephemeral_id": "EvBwNnTiQs2FCsZ3_alyyw",
"transport_address": "127.0.0.1:9300",
"attributes": {}
}
},
"indices": {
"library": {}
},
"shards": [
[
{
"state": "STARTED",
"primary": false,
"node": "gfGyP8AQTAGpTN12JIKp8w",
"relocating_node": null,
"shard": 1,
"index": "library",
"allocation_id": {
"id": "1IBgTt2iSiG7jm9YBa3XOA"
}
},
{
"state": "STARTED",
"primary": true,
"node": "lQLESgJoS12387zrTI5V7w",
"relocating_node": null,
"shard": 1,
"index": "library",
"allocation_id": {
"id": "QnB4xSFfRQqqxwdRUpkbqA"
}
}
]
]
}Elasticsearch是通过下面的公式计算出目标分片的,简单的说就是求一个余数
shard = hash(routing) % primary_shards_num
如果elasticsearch存在多个分片,当elasticsearch接收到一个查询请求的时候,Coordinator节点如何知道该查询所需要的数据位于哪个分片上呢?其实这和用户的查询方式有关。
如果笔者执行如下这个查询请求,查询title中包含Werther关键字,在elasticsearch中会如何路由节点呢?
{
"query": {
"match": {
"title": "Werther"
}
},
"sort":{
"year":{
"order":"desc"
}
},
"from":100,
"size":100
}当elasticsearch集群接受到用户请求的时候会经历如下流程
上述的查询存在如下问题
在上文中笔者以art为路由键将数据存储到指定分片中,所以笔者可以以相同的路由方式将请求路由给分片1即可
上述查询的requestBody不变,我们指定路由策略,提示Coordinator查询分片1
http://127.0.0.1:9200/library/book/_search?routing=art如果我们希望查询多个路由key的分片,我们可以将routing设置为多值,以逗号进行分割
http://127.0.0.1:9200/library/book/_search?routing=art,tech如果以id的方式进行查询,比如如下代码,又会发生什么呢
curl -XGET 'http://localhost:9200/library/book/AXAZneexUrtT20En6TpH'Elasticsearch默认情况下会以id进行分片,如果查询给定了id,那么就能确认该数据所在的分片号,Coordinator直接查询该分片即可
有一种情况值得注意,如果路由出错会存在明明有该id的数据但是却找不到该数据的特殊情况
笔者以如下的路由方式存储数据
http://127.0.0.1:9200/library/book/2?routing=art如果在查询数据时候使用如下方式
http://127.0.0.1:9200/library/book/2查询的时候就会取不到数据,因为查询时elasticsearch发现我们没有指定路由策略,并且使用id的方式查询数据,那么elasticsearch就会以id进行路由,但是以id的路由目标分片和routing的目标分片不在同一分片上
如果我们需要查询文科类型的书籍,我们需要使用如下url
http://127.0.0.1:9200/library/book/_search?routing=art如果文科类型的书籍查询需求非常多比如
查询最近1年出版的文科书籍
查询外文小说名著
查询国内小说名著
每个查询语句都要带上路由策略,代码不容易维护,elasticsearch提供了别名机制可以比较好的解决这个问题,比如创建一个文科别名类型的路由策略
http://127.0.0.1:9200/_aliases
{
"actions": {
"add": {
"index": "library",
"alias": " artBook",
"routing": "art"
}
}
}Elasticsearch是通过对主分片求余数的方式确定分片的,在数据量变大请求激增的情况下,如果我们添加主分片的数目以达到提高elasticsearch集群性能目的,那么原有的路由策略就会出现问题,elasticsearch如何解决这个问题呢?笔者会在扩容的文章探究这个问题
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3170463/ ,如需转载,请注明出处,否则将追究法律责任。