一渔呵、背景
1. 當(dāng)你的數(shù)據(jù)量過大怒竿,而你的索引最初創(chuàng)建的分片數(shù)量不足,導(dǎo)致每個(gè)分片上承載的數(shù)據(jù)量太大扩氢,數(shù)據(jù)入庫變慢耕驰,此時(shí)需要擴(kuò)大分片的數(shù)量,而索引的分片數(shù)一旦創(chuàng)建录豺,就無法修改
2. 當(dāng)數(shù)據(jù)的mapping需要修改朦肘,但是大量的數(shù)據(jù)已經(jīng)導(dǎo)入到索引中了,重新導(dǎo)入數(shù)據(jù)到新的索引太耗時(shí)双饥,但是在es中一個(gè)字段的mapping在定義并且導(dǎo)入數(shù)據(jù)之后是不能再修改的
這些情況下媒抠,你就需要考慮嘗試使用reinde,重建索引了咏花。
es提供了_reindex這個(gè)API趴生,相對(duì)于我們重新導(dǎo)入數(shù)據(jù)肯定會(huì)快不少,實(shí)測(cè)速度大概是bulk導(dǎo)入數(shù)據(jù)的5-10倍昏翰。
二苍匆、關(guān)于reindex
5.x版本后新增Reindex。
Reindex可以直接在Elasticsearch集群里面對(duì)數(shù)據(jù)進(jìn)行重建矩父,如果你的mapping因?yàn)樾薷亩枰亟鄙#只蛘咚饕O(shè)置修改需要重建的時(shí)候,借助Reindex可以很方便的異步進(jìn)行重建窍株,并且支持跨集群間的數(shù)據(jù)遷移民轴。比如按天創(chuàng)建的索引可以定期重建合并到以月為單位的索引里面去。
當(dāng)然索引里面要啟用_source球订。
reindex和snapshot的速率極慢后裸,是否有辦法改善?
reindex和snapshot的速率比用filebeat或者kafka到es的寫入速率慢好幾個(gè)數(shù)量級(jí)(集群寫入性能不存在瓶頸)冒滩,reindex/snapshot的時(shí)候CPU還是IO使用率都很低微驶,是不是集群受什么參數(shù)限制了reindex和snapshot的速率?
reindex不管是跨集群還是同集群上都很慢开睡,大約3~5M/s的索引速率因苹,會(huì)是什么原因?qū)е碌模?/p>
數(shù)據(jù)量幾十個(gè)G的場(chǎng)景下,elasticsearch reindex速度太慢篇恒,從舊索引導(dǎo)數(shù)據(jù)到新索引扶檐,當(dāng)前最佳方案是什么?
三胁艰、使用reindex數(shù)據(jù)遷移
1款筑、創(chuàng)建新的索引
注意:在創(chuàng)建索引的時(shí)候要把表結(jié)構(gòu)也要?jiǎng)?chuàng)建好(也就是mapping).
2智蝠、復(fù)制數(shù)據(jù)
使用最簡(jiǎn)單、基本的方式奈梳。
1)代碼請(qǐng)求:
2)利用命令
$? curl? -X? POST? 'xx.xx.xx.xx:9200/_reindex'? -d {"source":{"index":"old_index"},"dest":{"index":"new_index"}}
如果新的index中有數(shù)據(jù)杈湾,并且可能發(fā)生沖突,那么可以設(shè)置version_type? ? "version_type": "internal"? 或者不設(shè)置攘须,則Elasticsearch強(qiáng)制性的將文檔轉(zhuǎn)儲(chǔ)到目標(biāo)中漆撞,覆蓋具有相同類型和ID的任何內(nèi)容。
數(shù)據(jù)遷移效率
如果我們只是進(jìn)行少量的數(shù)據(jù)遷移利用普通的reindex就可以很好的達(dá)到要求阻课,但是當(dāng)我們發(fā)現(xiàn)我們需要遷移的數(shù)據(jù)量過大時(shí)叫挟,我們會(huì)發(fā)現(xiàn)reindex的速度會(huì)變得很慢艰匙。
數(shù)據(jù)量幾十個(gè)G的場(chǎng)景下限煞,elasticsearch reindex速度太慢,從舊索引導(dǎo)數(shù)據(jù)到新索引员凝,當(dāng)前最佳方案是什么署驻?
reindex的核心做跨索引、跨集群的數(shù)據(jù)遷移健霹。
慢的原因及優(yōu)化思路無非包括:
1)批量大小值可能太小旺上。需要結(jié)合堆內(nèi)存、線程池調(diào)整大刑锹瘛宣吱;
2)reindex的底層是scroll實(shí)現(xiàn),借助scroll并行優(yōu)化方式瞳别,提升效率征候;
3)跨索引、跨集群的核心是寫入數(shù)據(jù)祟敛,考慮寫入優(yōu)化角度提升效率疤坝。
可行方案:
1、提升批量寫入大小值馆铁。
默認(rèn)情況下跑揉,_reindex使用1000進(jìn)行批量操作,您可以在source中調(diào)整batch_size埠巨。
批量大小設(shè)置的依據(jù):
1历谍、使用批量索引請(qǐng)求以獲得最佳性能。
批量大小取決于數(shù)據(jù)辣垒、分析和集群配置望侈,但一個(gè)好的起點(diǎn)是每批處理5-15 MB。
注意乍构,這是物理大小甜无。文檔數(shù)量不是度量批量大小的好指標(biāo)扛点。
例如,如果每批索引1000個(gè)文檔:
1)每個(gè)1kb的1000個(gè)文檔是1mb岂丘。
2)每個(gè)100kb的1000個(gè)文檔是100 MB陵究。
這些是完全不同的體積大小。
2奥帘、逐步遞增文檔容量大小的方式調(diào)優(yōu)铜邮。
1)從大約5-15 MB的大容量開始,慢慢增加寨蹋,直到你看不到性能的提升松蒜。然后開始增加批量寫入的并發(fā)性(多線程等等)。
2)使用kibana已旧、cerebro或iostat秸苗、top和ps等工具監(jiān)視節(jié)點(diǎn),以查看資源何時(shí)開始出現(xiàn)瓶頸运褪。如果您開始接收EsRejectedExecutionException惊楼,您的集群就不能再跟上了:至少有一個(gè)資源達(dá)到了容量。要么減少并發(fā)性秸讹,或者提供更多有限的資源(例如從機(jī)械硬盤切換到ssd固態(tài)硬盤)檀咙,要么添加更多節(jié)點(diǎn)。
3璃诀、借助scroll的sliced提升寫入效率
Reindex支持Sliced Scroll以并行化重建索引過程弧可。 這種并行化可以提高效率,并提供一種方便的方法將請(qǐng)求分解為更小的部分劣欢。
sliced原理(from medcl)
1)用過Scroll接口吧棕诵,很慢?如果你數(shù)據(jù)量很大氧秘,用Scroll遍歷數(shù)據(jù)那確實(shí)是接受不了年鸳,現(xiàn)在Scroll接口可以并發(fā)來進(jìn)行數(shù)據(jù)遍歷了。
2)每個(gè)Scroll請(qǐng)求丸相,可以分成多個(gè)Slice請(qǐng)求搔确,可以理解為切片,各Slice獨(dú)立并行灭忠,利用Scroll重建或者遍歷要快很多倍膳算。
slicing使用舉例
slicing的設(shè)定分為兩種方式:手動(dòng)設(shè)置分片、自動(dòng)設(shè)置分片弛作。手動(dòng)設(shè)置分片參見官網(wǎng)涕蜂。
自動(dòng)設(shè)置分片如下:
slices大小設(shè)置注意事項(xiàng):
1)slices大小的設(shè)置可以手動(dòng)指定,或者設(shè)置slices設(shè)置為auto映琳,auto的含義是:針對(duì)單索引机隙,slices大小=分片數(shù)蜘拉;針對(duì)多索引,slices=分片的最小值有鹿。
2)當(dāng)slices的數(shù)量等于索引中的分片數(shù)量時(shí)旭旭,查詢性能最高效。slices大小大于分片數(shù)葱跋,非但不會(huì)提升效率持寄,反而會(huì)增加開銷。
3)如果這個(gè)slices數(shù)字很大(例如500)娱俺,建議選擇一個(gè)較低的數(shù)字稍味,因?yàn)檫^大的slices 會(huì)影響性能。
效果實(shí)踐證明荠卷,比默認(rèn)設(shè)置reindex速度能提升10倍+模庐。
四、參考
使用es reindex api 修改和遷移數(shù)據(jù)腳本
https://blog.csdn.net/weixin_38920212/article/details/102461563
Elasticsearch中refresh_interval參數(shù)
https://zhuanlan.zhihu.com/p/378295340
Elasticsearch Reindex性能提升10倍+實(shí)戰(zhàn)
https://blog.csdn.net/laoyang360/article/details/81589459
吐槽一個(gè)ES-reindex遷移的大坑:reindex中routing=cat
http://www.reibang.com/p/f3cab97074ce
Elasticsearch Reference [5.4] ? Document APIs ? Reindex API
https://www.elastic.co/guide/en/elasticsearch/reference/5.4/docs-reindex.html#docs-reindex
ElasticSearch:Reindex數(shù)據(jù)遷移使用
https://blog.csdn.net/u011487470/article/details/119894530
Elastic如何動(dòng)態(tài)擴(kuò)大主分片僵朗?
https://elasticsearch.cn/question/1904
如果目前索引已存在赖欣,如何增加分片數(shù)量?
https://elasticsearch.cn/question/1430