问题表现是:
ES集群的cpu和负载都非常低,几乎与无数据写入时一致,indexing rate也很低,基本在2000-5000左右;
但是此时有6个大数据量的任务在并行往ES集群各自的索引写入,但是耗时都严重变长,比如正常1h运行完毕的写入任务可以变成14h才运行完毕。
问题解决如下:
正常在ES写入时,会把索引副本关闭,写完后再加副本。
但是当多个数据源,同时并行往一个ES集群的多个索引写入数据时,如果流程设计为:
数据源写入ES -> 写入完毕 -> 加副本、删除过期索引;
多个任务并行时,依据任务执行完毕顺序先后,先执行完毕的任务加副本和删索引,会影响到后面正在运行的任务的写入性能。
当加副本时,ES主分片会进行复制,此时会占用写入性能,导致写入速率降低;
当删过期索引时,会产生大量GC,如果写入任务本身数据量很大,本身GC很高,此时删索引就不太合适,也会影响写入性能。
所以正确的做法是:
等所有的任务都写入各自索引完毕后,再统一加副本和删除过期索引。
测试发现,采用这个操作后,在集群没有关闭负载均衡的情况下,写入速率很明显上来了,之前10h左右的很多任务,直接40min以内入库完毕。