問題表現是:
ES集羣的cpu和負載都非常低,幾乎與無數據寫入時一致,indexing rate也很低,基本在2000-5000左右;
但是此時有6個大數據量的任務在並行往ES集羣各自的索引寫入,但是耗時都嚴重變長,比如正常1h運行完畢的寫入任務可以變成14h才運行完畢。
問題解決如下:
正常在ES寫入時,會把索引副本關閉,寫完後再加副本。
但是當多個數據源,同時並行往一個ES集羣的多個索引寫入數據時,如果流程設計爲:
數據源寫入ES -> 寫入完畢 -> 加副本、刪除過期索引;
多個任務並行時,依據任務執行完畢順序先後,先執行完畢的任務加副本和刪索引,會影響到後面正在運行的任務的寫入性能。
當加副本時,ES主分片會進行復制,此時會佔用寫入性能,導致寫入速率降低;
當刪過期索引時,會產生大量GC,如果寫入任務本身數據量很大,本身GC很高,此時刪索引就不太合適,也會影響寫入性能。
所以正確的做法是:
等所有的任務都寫入各自索引完畢後,再統一加副本和刪除過期索引。