当前位置:   article > 正文

ElasticSearch中的路由机制_elasticsearch路由机制

elasticsearch路由机制

什么是ElasticSearch路由?

elasticsearch的路由机制决定一个文档存储到索引的哪一个分片上,即文档分片的路由,公式如下:

shard_num = hash(_routing) % num_shards

上面的_routing默认指的是文档ID,如果想要修改这个默认值,只需要在插入数据的时候指定路由的key即可

  1. // 1、创建索引 2分片0副本
  2. PUT route_test/
  3. {
  4. "settings": {
  5. "number_of_shards": 2,
  6. "number_of_replicas": 0
  7. }
  8. }
  9. // 2、查看各分片信息
  10. GET _cat/shards/route_test?v
  11. index shard prirep state docs store ip node
  12. route_test 1 p STARTED 0 230b 172.17.0.1 fuE-zT9
  13. route_test 0 p STARTED 0 230b 172.17.0.1 fuE-zT9
  14. // 3、插入第一条数据 a
  15. PUT route_test/_doc/a?refresh
  16. {
  17. "data": "A"
  18. }
  19. // 4、此时再看各分片信息
  20. index shard prirep state docs store ip node
  21. route_test 1 p STARTED 0 261b 172.17.0.1 fuE-zT9
  22. route_test 0 p STARTED 1 3.3kb 172.17.0.1 fuE-zT9
  23. // 5、插入第二条数据 b
  24. PUT route_test/_doc/b?refresh
  25. {
  26. "data": "B"
  27. }
  28. // 6、此时再看各分片信息
  29. index shard prirep state docs store ip node
  30. route_test 1 p STARTED 1 3.3kb 172.17.0.1 fuE-zT9
  31. route_test 0 p STARTED 1 3.3kb 172.17.0.1 fuE-zT9
  32. // 7、查看该索引下的数据
  33. GET route_test/_search
  34. {
  35. "took": 1,
  36. "timed_out": false,
  37. "_shards": {
  38. "total": 2,
  39. "successful": 2,
  40. "skipped": 0,
  41. "failed": 0
  42. },
  43. "hits": {
  44. "total": 2,
  45. "max_score": 1.0,
  46. "hits": [
  47. {
  48. "_index": "route_test",
  49. "_type": "_doc",
  50. "_id": "a",
  51. "_score": 1.0,
  52. "_source": {
  53. "data": "A"
  54. }
  55. },
  56. {
  57. "_index": "route_test",
  58. "_type": "_doc",
  59. "_id": "b",
  60. "_score": 1.0,
  61. "_source": {
  62. "data": "B"
  63. }
  64. }
  65. ]
  66. }
  67. }

上面的例子解释一下:

先是创建了一个2分片0副本的索引,然后往里面插了两条数据a和b,文档a进入了编号为0的分片,文档b进入了编号为1的分片

  1. // 8、插入第三条数据 指定路由值key1
  2. PUT route_test/_doc/c?routing=key1&refresh
  3. {
  4. "data": "C"
  5. }
  6. // 9、查看分片信息 可以看出c进到了编号为1的分片 也就是说key1路由对应编号1分片
  7. index shard prirep state docs store ip node
  8. route_test 1 p STARTED 2 6.8kb 172.17.0.1 fuE-zT9
  9. route_test 0 p STARTED 1 3.4kb 172.17.0.1 fuE-zT9

这次带着路由值来插入数据c,路由值为key1,通过上面的结果,可以看出key1路由对应着编号为1的分片

更有意思的来了,之前已经入库的数据 a和b 我现在想要再让他们带着路由入一次库

  1. // 步骤11:插入 docid=a 的数据,并指定 routing=key1
  2. PUT route_test/_doc/a?routing=key1&refresh
  3. {
  4. "data": "A with routing key1"
  5. }
  6. // es返回信息
  7. {
  8. "_index": "route_test",
  9. "_type": "_doc",
  10. "_id": "a",
  11. "_version": 1,
  12. "result": "created", // 注意这里是created,因为文档a之前没有在分片1里面出现过
  13. "forced_refresh": true,
  14. "_shards": {
  15. "total": 1,
  16. "successful": 1,
  17. "failed": 0
  18. },
  19. "_seq_no": 2,
  20. "_primary_term": 1
  21. }

这时就有问题了,一个索引里竟然有两个相同ID的文档,分片0里面出现了一次,分片1里面竟然又出现了一次

可以总结出一个规律:ES索引中的ID唯一性是由路由来保证的,我们修改并打破了默认的路由规则,就产生了一些问题,ID不再唯一了

  1. // 步骤12 插入文档b 路由值仍然为key1
  2. PUT route_test/_doc/b?routing=key1&refresh
  3. {
  4. "data": "B with routing key1"
  5. }
  6. // ES返回结果
  7. {
  8. "_index": "route_test",
  9. "_type": "_doc",
  10. "_id": "b",
  11. "_version": 2,
  12. "result": "updated", // 因为分片1之前就有文档b,你又插入了一次,这次就是更新了,没毛病
  13. "forced_refresh": true,
  14. "_shards": {
  15. "total": 1,
  16. "successful": 1,
  17. "failed": 0
  18. },
  19. "_seq_no": 3,
  20. "_primary_term": 1
  21. }
  22. // 步骤13 查看分片信息
  23. index shard prirep state docs store ip node
  24. route_test 1 p STARTED 3 10.7kb 172.17.0.1 fuE-zT9
  25. route_test 0 p STARTED 1 3.4kb 172.17.0.1 fuE-zT9
  26. 此时分片0里面的数据:a
  27. 此时分片1里面的数据:b c a

        ES shard的实质是Lucene的索引,所以其实每个shard都是一个功能完善的倒排索引。ES能保证docid全局唯一是采用do id作为了路由,所以同样的docid肯定会路由到同一个shard上面,如果出现docid重复,就会update或者抛异常,从而保证了集群内docid唯一标识一个doc。但如果我们换用其它值做routing,那这个就保证不了了,如果用户还需要docid的全局唯一性,那只能自己保证了。

        很多时候自定义路由是为了减少查询时扫描shard的个数,从而提高查询效率。默认查询接口会搜索所有的shard,但也可以指定routing字段,这样就只会查询routing计算出来的shard,提高查询速度。使用方式也非常简单,只需在查询语句上面指定routing即可,允许指定多个

  1. GET route_test/_search?routing=key1,key2
  2. {
  3. "query": {
  4. "match": {
  5. "data": "b"
  6. }
  7. }
  8. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/713296
推荐阅读
相关标签
  

闽ICP备14008679号