吐槽一個ES-reindex遷移的大坑
在做ES跨集群遷移的時候,用到了ES的reindex進(jìn)行數(shù)據(jù)遷移,查了很多資料,包括官方文檔仓坞,比如:
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" 這個配置項。而現(xiàn)在腰吟,我只想罵人无埃。
發(fā)生甚么事了
在ES中,一個doc在寫入ES時毛雇,會根據(jù)數(shù)據(jù)計算一個routing嫉称,根據(jù)該值計算推算出具體數(shù)據(jù)寫入到哪個分片中,具體的計算公式是:
shard = hash(routing) % number_of_primary_shards
routing是一個可變值灵疮,默認(rèn)是文檔的_id织阅,正常來說隨機生成的id得到的shard值,會使數(shù)據(jù)在各個shard間分配的非常均勻震捣。
而如果我們使用reindex進(jìn)行索引重建或數(shù)據(jù)遷移的時候荔棉,需要指定routing選項闹炉,具體的含義如下:
- keep : 和源索引的routing值保持一致,默認(rèn)值
- discard : 對每個routing設(shè)置為null
- =<some text> : 設(shè)置為=之后的文本
如果使用第三個润樱,設(shè)置為官方的示例 routing=cat剩胁,那就會導(dǎo)致所有doc的路由值都是cat,然后計算出來的目標(biāo)shard相同祥国,我這里使用6個shard,全部落在了shard2上晾腔。
導(dǎo)致有一個節(jié)點的數(shù)據(jù)遠(yuǎn)超其他節(jié)點:
有一個索引是123GB大小舌稀,全落在一個Shard上了,真是無Fuck說灼擂。
為什么會犯這么蠢的錯誤
首先是沒有好好看一遍官方文檔壁查,只是看了一些國內(nèi)的博客就開干了,國內(nèi)的博客全一模一樣剔应,全都是routing=cat睡腿,我還以為這是個優(yōu)化功能。甚至有一片博客說這個值通過掃描所有內(nèi)容來生成新的routing值峻贮。
有時候真的服了一些人席怪,自己沒能力寫一些內(nèi)容嗎?全是復(fù)制的纤控?那你當(dāng)作自己的文檔可以嗎挂捻?發(fā)表出來干嘛呢?真是服了4颉刻撒!自己實踐過嗎?耿导?声怔?
怪不得大家都用Google,國內(nèi)一查全一模一樣舱呻,都不知道啥版本的醋火,誰敢用啊。