寫入es速率優化


  此次博客記錄來源於一次項目,需要往es寫入百億條數據,環境采用【程序->kafka->logstash->es】的流程,搭建好之后發現寫入效率非常低,2000條/s,算下來寫夠一百億需要將近兩個月🐷然后就有了本次優化記錄。最終優化結果可以達到36000/s且穩定,3天就可以結束。🎉

服務配置:

Ip

192.168.210.111

192.168.210.112

192.168.210.113

Es集群

Es7.4

Es7.4

Es7.4

Logstash集群

Logstash7.4

Logstash7.4

Logstash7.4

內存

80G

80G

80G

CPU

5

5

5

內存配置:

全默認配置

數據格式:

13369998888,15666665478,2020-12-30 03:03:45,中國

Logstash配置:

Input:

Filter:

 

Output:

 

 

 

優化項:

內存優化:

 

Logstash

ES

jvm.options

(1G)->(16G)

(1G)->(16G)

效果:

寫入效率2000/s上升到5000/s(一個logstash

第二次優化項:

三個logstash並行寫入。

內存優化:

 

Logstash

ES

jvm.options

(1G)->(16G)

(16G)->(31G)

效果:

效果不明顯。

推測瓶頸在logstash

第三次優化項:

三個logstash並行寫入。

Logstash優化:

Input:

  generator (無中生有)

  

Filter:

  ruby 隨機生成手機號、時間

  

 

Output:

  

Logstash.yml:

  pipeline.batch.size: 30000 每批次寫入數據量 (越多越好,高效利用內存空間)

  pipeline.batch.delay: 2 每批次間隔時間(越短越好,高效利用CPU

  pipeline.workers: 5 工作核數(不超過CPU核數)

效果:

寫入效率5000/s上升到8000/s

推測瓶頸在es write線程

第四次優化項:

三個logstash並行寫入。

Es配置優化:

elasticsearch.yml

  thread_pool.write.size: 6 線程數(不超過CPU核數)

  thread_pool.write.queue_size: 500  隊列大小(越大吞吐量越大,但處理的就越慢)

效果:

  效果不明顯,並且在這時出現了es寫入速度跟不上logstash生產速度而產生的異常信息。

  retrying failedaction with response code:429

  以及

  Attempted tosend a bulk request to elasticsearch' but Elasticsearch appears to beunreachable or down!

推測瓶頸可能在磁盤IO

第五次優化項:

三個logstash並行寫入。

Es索引參數優化:

分片數:

  number_of_shards 主分片數

  number_of_replicas 副本分片數

  

 

 

 

 

刷新頻率:

  refresh_interval 索引刷新時間間隔(越短越消耗資源)

  1m1分鍾。

  刷新時會產生一個新的每一個段都會消耗文件句柄、內存和cpu運行周期

  

 

   

  可以將 refresh_interval 設置為 -1 以加快導入速度。導入結束后,再將 refresh_interval 設置為一個正數

異步刷盤:

  durabilityasync 異步

  flush_threshold_size translog的大小達到此值時會進行一次flush操作。默認是512mb

  sync_interval 控制數據從內存到硬盤的操作頻率,以減少硬盤IO,默認5s

  

 

效果:

寫入效率8000/s上升到15000/s

 

第六次優化項:

 

三個logstash並行寫入。

 

Logstash腳本優化:

 

Output:

  

 

  使用Es自動生成的id,寫入時不會每次去判斷這個ID是否存在。

 

效果:

 

寫入效率15000/s上升到20000/s

 

第七次優化項:

 

三個logstash並行寫入。

 

Es索引參數優化:

 

分片數:

 

  number_of_shards 主分片數

 

  number_of_replicas 副本分片數

  

 

 

   

  主分片數=集群節點數效果最佳

  需要注意的是:這個配置不支持動態修改,只能在創建索引的時候指定。

 

 

效果:

 

寫入效率20000/s上升到36000/s

 

 

為了方便監控:可以使用kibanaxpack.

 

開啟方式:

 

Logstash:logstash.yml

 

xpack.monitoring.enabled: true

 

xpack.monitoring.elasticsearch.hosts: ["http://ambari01:9200", "http://ambari02:9200","http://ambari03:9200"]

 

Es:elasticsearch.yml

 

xpack.monitoring.collection.enabled: true

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM