乾貨 | Elasticsearch Reindex性能提升10倍+實戰

2021-12-28 銘毅天下Elasticsearch
1、reindex速率極慢,是否有辦法改善?

以下問題來自社區:http://t.cn/RDOcX0O

問題1:reindex和snapshot的速率極慢,是否有辦法改善?

reindex和snapshot的速率比用filebeat或者kafka到es的寫入速率慢好幾個數量級(集群寫入性能不存在瓶頸),reindex/snapshot的時候CPU還是IO使用率都很低,是不是集群受什麼參數限制了reindex和snapshot的速率?

reindex不管是跨集群還是同集群上都很慢,大約3~5M/s的索引速率,會是什麼原因導致的?

問題2:數據量幾十個G的場景下,elasticsearch reindex速度太慢,從舊索引導數據到新索引,當前最佳方案是什麼?2、Reindex簡介

5.X版本後新增Reindex。

Reindex可以直接在Elasticsearch集群裡面對數據進行重建,如果你的mapping因為修改而需要重建,又或者索引設置修改需要重建的時候,藉助Reindex可以很方便的異步進行重建,並且支持跨集群間的數據遷移。比如按天創建的索引可以定期重建合併到以月為單位的索引裡面去。

當然索引裡面要啟用_source。

1POST _reindex
2{
3  "source": {
4    "index": "twitter"
5  },
6  "dest": {
7    "index": "new_twitter"
8  }
9}

3、原因分析

reindex的核心做跨索引、跨集群的數據遷移。

慢的原因及優化思路無非包括:

1)批量大小值可能太小。
需要結合堆內存、線程池調整大小;

2)reindex的底層是scroll實現,藉助scroll並行優化方式,提升效率;

3)跨索引、跨集群的核心是寫入數據,考慮寫入優化角度提升效率。

4、Reindex提升效率的方案 4.1 提升批量寫入大小值

默認情況下,_reindex使用1000進行批量操作,您可以在source中調整batch_size。

1POST _reindex
2{
3  "source": {
4    "index": "source",
5    "size": 5000
6  },
7  "dest": {
8    "index": "dest",
9    "routing": "=cat"
10  }
11}

批量大小設置的依據:

(1)使用批量索引請求以獲得最佳性能。
批量大小取決於數據、分析和集群配置,但一個好的起點是每批處理5-15 MB。

注意,這是物理大小。文檔數量不是度量批量大小的好指標。例如,如果每批索引1000個文檔,:

1)每個1kb的1000個文檔是1mb。

2)每個100kb的1000個文檔是100 MB。

這些是完全不同的體積大小。

(2)逐步遞增文檔容量大小的方式調優。
1)從大約5-15 MB的大容量開始,慢慢增加,直到你看不到性能的提升。然後開始增加批量寫入的並發性(多線程等等)。

2)使用kibana、cerebro或iostat、top和ps等工具監視節點,以查看資源何時開始出現瓶頸。如果您開始接收EsRejectedExecutionException,您的集群就不能再跟上了:至少有一個資源達到了容量。要麼減少並發性,或者提供更多有限的資源(例如從機械硬碟切換到ssd固態硬碟),要麼添加更多節點。

4.2 藉助scroll的sliced提升寫入效率

Reindex支持Sliced Scroll以並行化重建索引過程。 這種並行化可以提高效率,並提供一種方便的方法將請求分解為更小的部分。

sliced原理(from medcl)

1)用過Scroll接口吧,很慢?如果你數據量很大,用Scroll遍歷數據那確實是接受不了,現在Scroll接口可以並發來進行數據遍歷了。

2)每個Scroll請求,可以分成多個Slice請求,可以理解為切片,各Slice獨立並行,利用Scroll重建或者遍歷要快很多倍。

slicing使用舉例

slicing的設定分為兩種方式:手動設置分片、自動設置分片。

手動設置分片參見官網。

自動設置分片如下:

1POST _reindex?slices=5&refresh
2{
3  "source": {
4    "index": "twitter"
5  },
6  "dest": {
7    "index": "new_twitter"
8  }
9}

slices大小設置注意事項:
1)slices大小的設置可以手動指定,或者設置slices設置為auto,auto的含義是:針對單索引,slices大小=分片數;針對多索引,slices=分片的最小值。

2)當slices的數量等於索引中的分片數量時,查詢性能最高效。slices大小大於分片數,非但不會提升效率,反而會增加開銷。

3)如果這個slices數字很大(例如500),建議選擇一個較低的數字,因為過大的slices 會影響性能。

4.3 ES副本數設置為0

如果要進行大量批量導入,請考慮通過設置index.number_of_replicas來禁用副本:0。

主要原因在於:

1PUT /my_logs/_settings
2{
3    "number_of_replicas": 1
4}

4.4 增加refresh間隔

如果你的搜索結果不需要接近實時的準確性,考慮先不要急於索引刷新refresh。可以將每個索引的refresh_interval到30s。

如果正在進行大量數據導入,可以通過在導入期間將此值設置為-1來禁用刷新。完成後不要忘記重新啟用它!

設置方法:

1PUT /my_logs/_settings
2{ "refresh_interval": -1 }

5、小結

實踐證明,比默認設置reindex速度能提升10倍+。

遇到類似問題,多從官網、原理甚至源碼的角度思考,逐步拆解分析。

只要思維不滑坡,辦法總比問題多!

參考:

[1] Jest Reindex參考:http://t.cn/RDOyIc8
[2] 官網性能優化:http://t.cn/RDOyJqr
[3] 論壇討論:http://t.cn/RDOya3a

推薦閱讀:

Elasticsearch大文件檢索性能提升20倍實踐(乾貨)

上線必備 | 高性能ES5.X部署配置清單

重磅 | 死磕Elasticsearch方法論認知清單(全)

加入知識星球,更短時間更快習得更多乾貨!

相關焦點

  • elasticsearch 基礎 —— ReIndex
    收錄於話題 #elasticsearch        discard 將值設置為null        =<some text> 將值設置為指定值,設置方式如下:POST _reindex{ "source": { "index": "source", "query": {//設置查詢條件 "ma
  • Python更新Elasticsearch數據方法大全
    通過 index API 來對已有的文檔實現更新,其實是進行了一次 reindex 的操作如 ES 中已有數據如下通過代碼將其更新:es.index(index="test", doc_type="doc", id="dfebcXcBCWwWKoXwQ2Gk", body={            "name": "Python編程實戰
  • Elastic App Search初體驗
    開發人員通過AppSearch提供的Api降數據提交給AppSearch,AppSearch富化數據並索引到Elasticsearch,客戶可以在網站或App等各種端進行數據的檢索;了解了AppSearch之後,接下來我們進行實戰演練。
  • 這4種Python更新Elasticsearch數據的方法你都會嗎?
    大家好,我是村長今天總結一下通過 Python 更新 Elasticsearch 數據的幾個方法Elasticsearch 是一個實時的分布式搜索分析引擎,它能讓你以前所未有的速度和規模,去探索你的數據。
  • 深入淺出 spring-data-elasticsearch - 實戰案例詳解(四)
    - 《我們仨》 』運行環境:JDK 7 或 8,Maven 3.0+技術棧:SpringBoot 1.5+, Spring Data Elasticsearch 1.5+ ,ElasticSearch 2.3.2本文提綱一、搜索實戰場景需求二、運行 spring-data-elasticsearch-query 工程三、spring-data-elasticsearch-query
  • 嚴選 | Elastic中文社區201902錯題本
    因此,我從2018年4月——至今,每月都會梳理出了Elasticsearch中文社區的精華乾貨——簡稱:Elastic錯題本,問題大多來自Medcl、wood大叔等大牛的精彩回復,結合實戰嚴選的核心問題。放在了GitHub上。
  • SpringBoot+Elasticsearch實戰
    環境與配置服務端:elasticsearch-6.3.2    1臺客戶端:elasticsearch 6.4.1服務端配置文件:elasticsearch.ymlcluster.name版本Spring Boot 2.0.5默認的elasticsearch版本很低,這裡我們用最新版本6.4.1如果啟動過程中出現java.lang.NoClassDefFoundError: org/elasticsearch/common
  • ElasticSearch聚合實戰+優化
    /guide/cn/elasticsearch/guide/current/_returning_empty_buckets.html ),最基本的按照時間進行聚合的:{ "size/guide/cn/elasticsearch/guide/current/_extended_example.html ):{ "size" : 0, "aggs": {
  • SpringBoot 集成 Elasticsearch 實戰
    環境與配置服務端:elasticsearch-6.3.2 1 臺客戶端:elasticsearch 6.4.1服務端配置文件:elasticsearch.ymlcluster.name則說明,elasticsearch 依賴的 jar 包版本不一致,統一改成 6.4.1 即可另外,Spring Boot 2.0.5 依賴的 spring-data-elasticsearch 版本是 3.0.1,需要升級到 3.1.02.0.5 依賴2.
  • Elasticsearch高級調優方法論之——根治慢查詢!
    在實戰業務場景中,經常會出現遠遠低於預期查詢速度的慢查詢。作為分布式系統的Elasticsearch,可能有各種影響查詢性能的因素,包括外部因素,如負載均衡設置,網絡延遲(帶寬,NIC卡/驅動程序)等。本文主要討論可能導致慢查詢的原因以及如何在Elasticsearch的上下文中識別它們?本文主要源於常見慢查詢故障的排除方法,閱讀本文的前提需要你對Elasticsearch的原理有大致的了解。
  • Elasticsearch 性能監控基礎
    1、Elasticsearch簡要組成在開始探索性能指標之前,讓我們來看看Elasticsearch的工作原理,在elasticsearch中,集群由一個或者更多的節點組成,如下圖: 如果要修改可能需要reindex。副本數可以在後期被修改。 為了防止數據丟失,主節點的調度機制會確保主副分片不會出現在同一個數據節點上。二、我們要監控哪些Elasticsearch metric
  • SpringBoot+ ElasticSearch實現全文搜索功能
    ;import org.elasticsearch.action.search.SearchResponse;import org.elasticsearch.client.RestClient;import org.elasticsearch.client.RestHighLevelClient;import org.elasticsearch.common.text.Text;import org.elasticsearch.index.query
  • 網際網路公司Elasticsearch應用案例分享
    一、京東到家訂單中心 Elasticsearch 演進歷程三、去哪兒:訂單中心基於elasticsearch 的解決方案四、Elasticsearch 在58集團信息安全部的應用國內現在有大量的公司都在使用 Elasticsearch,包括攜程、滴滴、今日頭條、餓了麼、360安全、小米、vivo等諸多知名公司。
  • Elasticsearch 使用中文分詞
    IK Analysis 插件IK Analysis 插件(https://github.com/medcl/elasticsearch-analysis-ik/)就是一款專門用於 Elasticsearch 的分詞器,可以友好的處理中文。
  • 渣渣菜雞的 ElasticSearch 源碼解析 —— 環境搭建
    :124) 8    at org.elasticsearch.cli.Command.main(Command.java:90) 9    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93)10    at org.elasticsearch.bootstrap.Elasticsearch.main
  • 在elasticsearch中使用function_score查詢
    location":{                   "origin":{ "lon":116.402688, "lat":39.91416 }, "offset":"5km", "scale":"10km
  • 全網必會的搜索技術-ElasticSearch(一)
    當實時建立索引時, Solr會產生io阻塞,查詢性能較差, Elasticsearch具有明顯的 優勢。大型網際網路公司,實際生產環境測試,將搜尋引擎從Solr轉到 Elasticsearch以後 的平均查詢速度有了50倍的提升。
  • ElasticSearch 極簡教程
    當實時建立索引時, Solr會產生io阻塞,查詢性能較差, Elasticsearch具有明顯的優勢。ElasticSearch vs Solr 總結1. 二者安裝都很簡單。2.與傳統 SQL 資料庫管理系統(其花費10秒鐘以上的時間來獲取所需的搜索查詢數據)相比,Elasticsearch 可以在10毫秒內完成此操作。
  • ElasticSearch介紹
    /cn/products/elasticsearchGithub:https://github.com/elastic/elasticsearch總結:1、elasticsearch是一個基於Lucene的高擴展的分布式搜索伺服器,支持開箱即用。
  • ElasticSearch安裝
    使用ElasticSearch進行開發需要下載ElasticSearch、kibana、elasticsearch-head。後兩者非必選安裝,但是後兩者可以幫助查看數據和進行測試數據的導入。默認分配jvm空間大小為2g,修改jvm空間分配vim /opt/elasticsearch-5.0.0/config/jvm.options2、配置文件elasticsearch.yml的權限異常,導致啟動失敗後面伺服器部署ElasticSearch在進行討論