此次博客記錄來源於一次項目,需要往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 索引刷新時間間隔(越短越消耗資源)
1m為1分鍾。
刷新時會產生一個新的段,每一個段都會消耗文件句柄、內存和cpu運行周期
可以將 refresh_interval 設置為 -1 以加快導入速度。導入結束后,再將 refresh_interval 設置為一個正數
異步刷盤:
durability:async 異步
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
為了方便監控:可以使用kibana的xpack.
開啟方式:
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