吐槽一个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
- =<some text> : 设置为=之后的文本
如果使用第三个,设置为官方的示例 routing=cat,那就会导致所有doc的路由值都是cat,然后计算出来的目标shard相同,我这里使用6个shard,全部落在了shard2上。
导致有一个节点的数据远超其他节点:
有一个索引是123GB大小,全落在一个Shard上了,真是无Fuck说。
为什么会犯这么蠢的错误
首先是没有好好看一遍官方文档,只是看了一些国内的博客就开干了,国内的博客全一模一样,全都是routing=cat,我还以为这是个优化功能。甚至有一片博客说这个值通过扫描所有内容来生成新的routing值。
有时候真的服了一些人,自己没能力写一些内容吗?全是复制的?那你当作自己的文档可以吗?发表出来干嘛呢?真是服了!!自己实践过吗???
怪不得大家都用Google,国内一查全一模一样,都不知道啥版本的,谁敢用啊。