ITPub博客

首页 > IT基础架构 > > Elasticsearch之路由机制

Elasticsearch之路由机制

作者:格伯纳 时间:2020-06-01 13:50:10 0 删除 编辑

1. 存储路由

笔者以如下的url添加数据,其中的requestbody笔者没有复制上来,url中末尾的1代表添加的id,笔者改变末尾的id添加多条数据

http://127.0.0.1:9200/library/book/1?routing=art

library这个索引总共有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

2. 查询路由

如果elasticsearch存在多个分片,当elasticsearch接收到一个查询请求的时候,Coordinator节点如何知道该查询所需要的数据位于哪个分片上呢?其实这和用户的查询方式有关。

如果笔者执行如下这个查询请求,查询title中包含Werther关键字,在elasticsearch中会如何路由节点呢?

{
    "query": {
        "match": {
            "title": "Werther"
        }
    },
    "sort":{
        "year":{
            "order":"desc"
        }
    },
    "from":100,
    "size":100
}

当elasticsearch集群接受到用户请求的时候会经历如下流程

  1. 任何一个未被禁止成为Coordinator 的节点都有可能接受到用户的请求,该节点成为此次请求的Coordinator节点
  2. Coordinator节点将该查询请求广播到这个索引的3个分片上,执行查询的分片也可能是副本分片
  3. 每个分片执行查询请求,查询出title中包含Werther关键字的文档,并按照year字段排序,取出倒序的100条,并将结果返回给Coordinator节点,步骤2,3称为scatter phase
  4. Coordinator节点接受各个分片的响应结果,并将各个分片返回的数据按year字段排序,取出从第100个结果开始的100条数据,如果有任何一个分片宕机,Coordinator仍然会向客户端返回数据,只是某个分片的数据会丢失

上述的查询存在如下问题

  1. Coordinator不知道当前请求所需的数据存储在哪个分片上,所以向所有的data node广播查询请求
  2. Coordinator汇总排序结果非常消耗资源
  3. 任何一个分片查询失败都会影响最终的查询结果

2.1 带routing键的路由方式

在上文中笔者以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

2.2 默认id路由方式

如果以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的目标分片不在同一分片上

3. 使用别名简化路由

如果我们需要查询文科类型的书籍,我们需要使用如下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"
        }
    }
}

4. 总结

Elasticsearch是通过对主分片求余数的方式确定分片的,在数据量变大请求激增的情况下,如果我们添加主分片的数目以达到提高elasticsearch集群性能目的,那么原有的路由策略就会出现问题,elasticsearch如何解决这个问题呢?笔者会在扩容的文章探究这个问题

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3170463/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
管理员

注册时间:2018-03-30

  • 博文量
    2383
  • 访问量
    984272