同福

Elasticsearch的路由routing的应用技巧【20210622】

介绍

介绍

福哥今天要给大家讲讲关于Elasticsearch的路由功能,什么是路由?路由功能是干什么用的呢?听福哥娓娓道来!

首先,ES可以提供海量的数据的快速全文检索服务,这个“海量”的数据的量级远远不是一台服务器可以承受的了的,所以在大型搜索平台上使用ES实现搜索功能的话,必然会用到ES的集群。

默认路由

正常情况下,我们向ES集群(Cluster)添加一个文档的时候,假设ES集群有3个分片(Shard),那么ES会根据一个算法计算出这个文档应该保存到哪个分片上面,这个算法会保证数据会均匀地保存到每一个分片上面。这样做的好处是,一旦某个分片出了故障被撤掉了,ES集群里的任何索引都不会出现一个文档都查不到的情况,所有索引都只会丢失故障分片上面存储的文档而已,这个给修复故障分片争取了时间。

但是这样的分配有个弊端,就是由于文档均匀分配到多个分片上面了,所以每次查询索引结果都需要向多个分片发送请求,然后再将这些分片返回的结果融合到一起返回到终端。很显然这样一来系统的压力就会增大很多,如果索引数据量不大的情况下,效率会非常差。

自定义路由

为了解决这个问题,我们可以通过自定义路由功能告诉ES集群路由为XXX的文档都存到一个分片上面去,这样我们查询路由为XXX的索引的时候就可以得到更好的执行速度了!

创建索引

我们通过settings设置索引的分片数量。

PUT /tfams_2

{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 0
  }
}

查看分片

通过shards查看索引分片信息。

curl 'http://elasticsearch:9200/_cat/shards/tfams_2'

home/topic/2021/0622/22/a325885edc5202d7df9901a6c9d8fb62.png

添加文档

我们使用bulk添加3个文档。

test.json

{"index": {"_id": 1}}
{"doc": {"name": "PHP", "age": 35}}
{"index": {"_id": 2}}
{"doc": {"name": "Python", "age": 36}}
{"index": {"_id": 3}}
{"doc": {"name": "Java", "age": 37}}

bulk

curl -X POST -H 'Content-Type: application/json' --data-binary '@/tmp/test.json' 'http://elasticsearch:9200/tfams_2/tfams_2/_bulk'

再次查看分片

现在我们再来看看分片信息,可以看到刚添加的3个文档分配到了不同的分片里面。

home/topic/2021/0622/23/4a43e3a98953ff3cd0c8b6763ec72d39.png

添加路由文档

我们再往系统里面添加3个文档,这次我们给文档携带一个路由信息_routing=when_i_was_young,看看会发生什么。

test.json

{"index": {"_id": 4, "_routing": "when_i_was_young"}}
{"doc": {"name": "C/C++", "age": 38}}
{"index": {"_id": 5, "_routing": "when_i_was_young"}}
{"doc": {"name": "JavaScript", "age": 18}}
{"index": {"_id": 6, "_routing": "when_i_was_young"}}
{"doc": {"name": "Asp.net", "age": 28}}

bulk

curl -X POST -H 'Content-Type: application/json' --data-binary '@/tmp/test.json' 'http://elasticsearch:9200/tfams_2/tfams_2/_bulk'

再来查看分片

现在我们再来看看索引的分片信息,童鞋们可以看到最新添加的文档都分配到一个分片上面去了。

home/topic/2021/0622/23/96ed921a361cb018a8581cd67c245363.png

总结

今天福哥带着童鞋们学习了Elasticsearch的路由routing的使用技巧,通过自定义ES的路由可以合理地管理数据存储的路径,从而提高索引的执行效率,以发挥ES的最大性能。