提升 Elasticsearch 索引性能 TOP 十小技巧,你用到幾個(gè)?
Elasticsearch 是一個(gè)功能強(qiáng)大的搜索和分析引擎,能夠快速存儲(chǔ)、搜索和分析海量數(shù)據(jù)。
在 Elasticsearch 的核心組件中,索引性能至關(guān)重要。索引(動(dòng)詞)過(guò)程負(fù)責(zé)將數(shù)據(jù)添加到 Elasticsearch 中,而索引性能的好壞直接影響到搜索查詢(xún)的效率。
本文將分享提升 Elasticsearch 索引性能的 10 個(gè)實(shí)用技巧,幫助大家更高效地使用 Elasticsearch。
你一共用到幾個(gè)?有沒(méi)有更好的使用小技巧?歡迎留言補(bǔ)充交流。
1. 選擇合適的硬件
要提升 Elasticsearch 的索引性能,首先需要確保硬件配置到位。
Elasticsearch 對(duì)內(nèi)存 (RAM)、CPU 和 磁盤(pán) I/O 的依賴(lài)性較高,因此選擇合適的硬件至關(guān)重要。建議選擇具備充足內(nèi)存和 CPU 資源的服務(wù)器,并優(yōu)先使用 SSD 磁盤(pán)以提高磁盤(pán) I/O 性能,從而減少索引時(shí)間。
Elasticsearch 官方文檔強(qiáng)調(diào):
- 搜索性能受存儲(chǔ)和計(jì)算資源的影響較大。如果搜索受限于I/O,建議增大文件系統(tǒng)緩存或使用更快的存儲(chǔ)設(shè)備(如SSD);
- 若受限于CPU,則應(yīng)使用更快的處理器。
- 相比遠(yuǎn)程存儲(chǔ),本地直連存儲(chǔ)通常性能更佳,配置更簡(jiǎn)單,延遲更低。遠(yuǎn)程存儲(chǔ)在高負(fù)載下性能可能較差,但經(jīng)過(guò)優(yōu)化后也能達(dá)到可接受的效果。
- 在確定存儲(chǔ)架構(gòu)前,應(yīng)通過(guò)基準(zhǔn)測(cè)試評(píng)估實(shí)際負(fù)載下的性能,并根據(jù)需要與供應(yīng)商合作進(jìn)行調(diào)優(yōu)。https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-search-speed.html
2. 使用 Bulk API 批量索引
Elasticsearch 提供了一個(gè) Bulk API,允許在單次請(qǐng)求中索引多個(gè)文檔。與一次索引一個(gè)文檔相比,批量索引能顯著提高性能,因?yàn)闇p少了網(wǎng)絡(luò)往返的開(kāi)銷(xiāo),提高了索引過(guò)程的效率。
Elasticsearch 官方文檔強(qiáng)調(diào):
- 建議在單節(jié)點(diǎn)、單分片上進(jìn)行基準(zhǔn)測(cè)試,逐步增加批量請(qǐng)求的文檔數(shù)量(100、200、400等)以找到最佳批量大小。
圖片
圖示僅供參考遞增批量值
- 當(dāng)索引速度趨于平穩(wěn)時(shí),即為最佳值。
- 若數(shù)據(jù)量相近,寧可選擇較小批次,以避免內(nèi)存壓力。
- 通常批量請(qǐng)求不宜超過(guò)幾十 MB,否則可能會(huì)對(duì)集群造成內(nèi)存負(fù)擔(dān)。
3. 在批量索引時(shí)禁用刷新
Elasticsearch 默認(rèn)每秒刷新索引一次,這意味著每次添加新文檔后,索引會(huì)立即可搜索。
然而,在批量索引時(shí),這種行為會(huì)顯著降低索引性能。
在進(jìn)行大量數(shù)據(jù)寫(xiě)入時(shí),可以暫時(shí)禁用自動(dòng)刷新,待批量索引完成后再啟用。
# 禁用刷新
PUT /my_index/_settings
{
"refresh_interval": "-1"
}
# 完成批量索引后重新啟用
PUT /my_index/_settings
{
"refresh_interval": "30s"
}https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.html
4. 調(diào)整刷新間隔
除了在批量索引時(shí)禁用刷新外,還可以通過(guò)增加默認(rèn)的刷新間隔來(lái)提升索引性能。減少 Elasticsearch 每秒的刷新次數(shù),可以降低系統(tǒng)的開(kāi)銷(xiāo),從而提高索引速度。
不過(guò),需要注意的是,刷新間隔增加后,新添加的文檔不會(huì)立即可見(jiàn),因此在某些實(shí)時(shí)性要求較高的場(chǎng)景中需要謹(jǐn)慎調(diào)整。
正確做法建議:在數(shù)據(jù)加載階段將 refresh_interval 設(shè)置為較高值,例如 30s,完成后再恢復(fù)到默認(rèn)值 1s。
5. 優(yōu)化文檔設(shè)計(jì)
文檔的設(shè)計(jì)對(duì)索引性能有很大影響。避免使用過(guò)于龐大和復(fù)雜的文檔,盡量減少嵌套字段的使用,尤其是深層嵌套結(jié)構(gòu),因?yàn)樗鼈儠?huì)顯著降低索引速度。
干貨 | Elasticsearch 索引設(shè)計(jì)實(shí)戰(zhàn)指南
Elasticsearch Nested 選型,先看這一篇!
正確做法:
- 盡量減少文檔大小(不要過(guò)大,比如:一本書(shū)導(dǎo)入一個(gè)文檔),避免過(guò)多的嵌套。
- 僅保留必要的字段,避免存儲(chǔ)多余信息。
6. 減少索引的字段數(shù)量
過(guò)多的字段會(huì)顯著增加索引的時(shí)間,因?yàn)?Elasticsearch 需要對(duì)每個(gè)字段進(jìn)行分析和映射。
僅索引需要用于搜索的字段,其余字段可以設(shè)置為 index: false。
PUT /my_index
{
"mappings": {
"properties": {
"description": { "type": "text" },
"comments": { "type": "text", "index": false } # 不需要搜索的字段
}
}
}正確做法建議:減少不必要的字段,僅對(duì)需要搜索和聚合的字段進(jìn)行索引。
7. 優(yōu)化磁盤(pán)性能
Elasticsearch 的主分片數(shù)據(jù)會(huì)寫(xiě)入節(jié)點(diǎn)的文件系統(tǒng),因此磁盤(pán)速度對(duì)索引性能有重要影響。
選擇速度快、容量大的磁盤(pán),如 SSD,可以顯著提升索引效率。——多么正確的廢話(huà)!但是很多咨詢(xún)的球友企業(yè)不提供硬件支撐,在機(jī)械磁盤(pán)做再足優(yōu)化也無(wú)濟(jì)于事。

圖示僅為方便大家直觀認(rèn)知
正確做法建議:盡量使用 NVMe SSD,尤其是在處理大量日志或時(shí)間序列數(shù)據(jù)時(shí)。
8. 索引生命周期 ILM 管理
當(dāng)一個(gè)索引過(guò)大時(shí),管理起來(lái)會(huì)變得困難,導(dǎo)致搜索和索引性能下降。可以考慮將索引分為每日或每周的索引,這在處理時(shí)間序列數(shù)據(jù)(如日志事件)時(shí)尤其有用。
Elasticsearch ILM 索引生命周期管理常見(jiàn)坑及避坑指南
視頻 | Elasticsearch ILM索引生命周期管理
干貨 | Elasticsearch 索引生命周期管理 ILM 實(shí)戰(zhàn)指南
干貨 | Elasticsearch索引生命周期管理探索(rollover 5.X 版本階段)
圖片
正確做法:
對(duì)于日志數(shù)據(jù),使用按日期滾動(dòng)的索引,如
logs-2024-11-01、
logs-2024-11-02。定期刪除過(guò)期的索引以釋放存儲(chǔ)空間。
9. 防止映射爆炸
如果使用動(dòng)態(tài)映射,可能會(huì)導(dǎo)致字段數(shù)量過(guò)多,從而引發(fā)映射爆炸的問(wèn)題。
建議定義顯式映射來(lái)控制字段數(shù)量,避免自動(dòng)檢測(cè)新字段。
PUT /my_index
{
"mappings": {
"dynamic": "strict", # 禁止自動(dòng)添加字段
"properties": {
"user": { "type": "keyword" },
"message": { "type": "text" }
}
}
}正確做法:使用 dynamic: strict 控制自動(dòng)映射。
定期清理不再使用的字段。
10. 優(yōu)化 Translog 性能
在Elasticsearch 8.x中,調(diào)整translog(事務(wù)日志)設(shè)置可以提高性能和數(shù)據(jù)持久性。主要設(shè)置包括:
translog的持久性(index.translog.durability)、
同步間隔(index.translog.sync_interval)、
刷新閾值大小(index.translog.flush_threshold_size)。
通過(guò)合理配置這些參數(shù),可以在保證數(shù)據(jù)安全的同時(shí),優(yōu)化系統(tǒng)性能。
以下是優(yōu)化 Elasticsearch 8.x 中 Translog 性能的推薦配置:
參數(shù)名稱(chēng) | 含義 | 性能優(yōu)先配置 | 數(shù)據(jù)安全優(yōu)先配置 |
| 控制 Translog 的持久性方式。 |
|
|
| 定義 Translog 異步刷新的時(shí)間間隔(僅在 |
|
|
| 當(dāng) Translog 大小達(dá)到此閾值時(shí),觸發(fā)一次 Lucene 刷新(Flush)。 |
|
|
小結(jié)
Elasticsearch 是處理大規(guī)模數(shù)據(jù)的必備工具,但要充分發(fā)揮其性能,必須優(yōu)化索引過(guò)程。通過(guò)遵循上述 10 個(gè)技巧,你可以顯著提升 Elasticsearch 的索引效率,從而提高搜索和分析的能力。




























