ES:reindex中的坑

吐槽一个ES-reindex迁移的大坑

在做ES跨集群迁移的时候,用到了ES的reindex进行数据迁移,查了很多资料,包括官方文档,比如:

https://www.elastic.co/guide/en/elasticsearch/reference/5.4/docs-reindex.html#docs-reindex
https://blog.csdn.net/weixin_38920212/article/details/102461563

其中就用到了 "routing": "=cat" 这个配置项。而现在,我只想骂人。

发生甚么事了

在ES中,一个doc在写入ES时,会根据数据计算一个routing,根据该值计算推算出具体数据写入到哪个分片中,具体的计算公式是:

shard = hash(routing) % number_of_primary_shards

routing是一个可变值,默认是文档的_id,正常来说随机生成的id得到的shard值,会使数据在各个shard间分配的非常均匀。

而如果我们使用reindex进行索引重建或数据迁移的时候,需要指定routing选项,具体的含义如下:

  • keep : 和源索引的routing值保持一致,默认值
  • discard : 对每个routing设置为null
  • = : 设置为=之后的文本

如果使用第三个,设置为官方的示例 routing=cat,那就会导致所有doc的路由值都是cat,然后计算出来的目标shard相同,我这里使用6个shard,全部落在了shard2上。

导致有一个节点的数据远超其他节点:


有一个索引是123GB大小,全落在一个Shard上了,真是无Fuck说。


为什么会犯这么蠢的错误

首先是没有好好看一遍官方文档,只是看了一些国内的博客就开干了,国内的博客全一模一样,全都是routing=cat,我还以为这是个优化功能。甚至有一片博客说这个值通过扫描所有内容来生成新的routing值。

有时候真的服了一些人,自己没能力写一些内容吗?全是复制的?那你当作自己的文档可以吗?发表出来干嘛呢?真是服了!!自己实践过吗???

怪不得大家都用Google,国内一查全一模一样,都不知道啥版本的,谁敢用啊。

你可能感兴趣的:(ES:reindex中的坑)