介绍
介绍
福哥今天要给大家讲讲关于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'
添加文档
我们使用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个文档分配到了不同的分片里面。
添加路由文档
我们再往系统里面添加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'
再来查看分片
现在我们再来看看索引的分片信息,童鞋们可以看到最新添加的文档都分配到一个分片上面去了。
总结
今天福哥带着童鞋们学习了Elasticsearch的路由routing的使用技巧,通过自定义ES的路由可以合理地管理数据存储的路径,从而提高索引的执行效率,以发挥ES的最大性能。