国内外新闻动态,ASO干货,行业资讯。 德普优化,出海必备ASO数据分析平台! 投稿请发送至邮箱:2902675294@qq.com

Elasticsearch分片路由(Routing)配置

资讯快闻 蓝天白云 2798℃ 0评论

Elasticsearch路由机制

       当你索引一个文档,它被存储在单独一个主分片上。Elasticsearch是如何知道文档属于哪个分片的呢?当你创建一个新文 档,它是如何知道是应该存储在分片1还是分片2上的呢?

shard = hash(routing) % number_of_primary_shards

       routing 值是一个任意字符串,它默认是 _id 但也可以自定义。这个 routing 字符串通过哈希函数生成一个数字,然后除以 主切片的数量得到一个余数(remainder),余数的范围永远是 0 到 number_of_primary_shards – 1 ,这个数字就是特定文档所 在的分片。所以么主分片的数量只能在创建索引时定义且不能修改。如果主分片的数量在未来改变了,所有先前的路由值就 失效了,文档也就永远找不到了。

 

定制自己的Routing值

假设你有一个100个分片的索引。当一个请求在集群上执行时会发生什么呢?

1. 这个搜索的请求会被发送到一个节点

2. 接收到这个请求的节点,将这个查询广播到这个索引的每个分片上(可能是主分片,也可能是复制分片)

3. 每个分片执行这个搜索查询并返回结果

4. 结果在通道节点上合并、排序并返回给用户

 

首先默认的Routing模式在很多情况下都是能满足我们的需求的——平均的数据分布、对我们来说是透明的、多数时候性能也不是问题。但是在我们更深入地理解我们的数据的特征之后,使用自定义的Routing模式可能会给我们带来更好的性能。自定义路由值可以确保所有相关文档——例如属于同一个人的文档——被保存在同一分片上

如何在ES上指定Routing属性:

方法一:

curl -XPOST ‘http://localhost:9200/index_name/type_name?routing=123123 ’ -d ‘
{
“productName”: “sample”,
“productID”: “123123”
}’

方法二:

curl -XPUT ‘http://localhost:9200/index_name/type_name/_mapping’ -d ‘
{
“type_name”: {
“_routing”: {
“required”: true,
“path”: “productID”
}
}
}’

       方法二和方法一在效果上一样的,但是有一点需要注意,相比于第一种方法这种方法的效率稍低,因为第一种方法直接就在请求的参数中确定了路由的值,而第二种方法中,首先需要将文档读入之后,再从中提取到对应的路由值。在ES 2.0以后的版本,方法二也因此被删除。

 

利用路由机制的查询

所有的文档API( get 、 index 、 delete 、 bulk 、 update 、 mget )都接收一个 routing 参数,它用来自定义文档到分片的 映射。

curl -XGET ‘http://localhost:9200/index_name/type_name/_search?routing=123123 ‘ -d ‘

{

“query” : {

      “match” : {

              “productName” : “sample”

         }

    }

}’

通过指定的路由值,我们就可以直接定位到123123的文档所在的分片,而不用一股脑的向索引的所有节点都发送请求。这样的话,会大大减少系统资源的浪费。

当然,也可以指定多个路由值进行查询:

curl -XGET ‘http://localhost:9200/index_name/type_name/_search?routing=123123,13331 ‘ -d ‘  {}’

路由机制的总结

实际上,如果不明确指明使用路由机制,实际上路由机制也是在发挥作用的,只是默认的路由值是文档的id而已。而个性化路由的需求主要是和业务相关的。默认的路由(如果是自动的生成的id)直观上会把所有的文档随机分配到一个分片上,而个性化的路由值就是和业务相关的了。这也会造成一些潜在的问题,比如productID为123123的文档就非常多,有数十万个,而其他大多数的用户只有几个文档,这样的话就会导致productID为123123所在的分片较大,出现数据偏移的情况,特别是多个这样的用户处于同一分片的时候,现象会更明显。具体的使用还是要结合实际的应用场景来选择的。

 

转载请注明:德普微新文 » Elasticsearch分片路由(Routing)配置

喜欢 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址