无论才能、知识多么卓著,如果缺乏热情,则无异纸上画饼充饥,无补于事。

ES udpate upsert性能如何优化?

Elasticsearch | 作者 wangxinrong | 发布于2020年09月30日 | 阅读数:8685

ES版本5.6,数据量在3000万左右,数据更新频率比较频繁,总共的更新速度大概是1w/s-5w/s。
最新的数据先进kafka,再由flink消费写入ES。
目前发现在默认的ES配置下,bulk update或者upsert的速度始终上不去,所有节点的cpu使用率才25%左右,速度最高只能到1w/s左右。
如果改成这些数据全部是插入,不做更新操作,那么cpu可以跑满,而且kafka的消费绝对没有积压。
试过增加节点,效果很小,速度看起来有一点点的增加。试过增加分片数,有效果,但仍然不是很明显。
 
请问是什么原因导致这个现象呢,增加分片对写入速度有提升又是为什么呢?
像这种场景,有没有办法直接的提升update/upsert速率,或者间接解决,比如全部用插入的方式写入,查询时同一个id的记录取时间最近的数据。那么查询方式还有删除旧数据这块怎么设计比较好
已邀请:

zmc - ES PAAS、JuiceFS

赞同来自: jiankunking

1.update是先get再insert然后再delete(标记删除)旧的文档,和insert相比,肯定update耗时多
2.由于一次操作完成时长多,线程池数量有限,导致cpu只有25%(猜测...)
3.适当增加ES分片,对写入是有一点提高,因为相当于多出来了lucene进程,可以接收的请求多了,付出的代价就是分片多了之后同步数据是需要消耗性能的,然后查询更是会性能降低
4.客户端使用层面:可以全部使用insert提高性能,然后定时去delete,定时(低峰期)合并segment,优化数据结构
5.集群本身层面:可以控制refresh的频率,translog设置,副本可以先干掉(写完再补回来),线程池参数修改-------这些都是危险操作,评估后再进行实践

pony_maggie - 公众号:犀牛饲养员的技术笔记

赞同来自:

在上面基础上补充:
1. 使用ES自动的id,不要指定id
2. 提高操作系统 filesystem cache
3. 关注下 index_buffer_size 这个参数

wangxinrong

赞同来自:

在不改业务逻辑的情况下,只能指定id来做更新。
改线程池大小、设置translog异步写、加大refresh interval、index buffer size这些以前测试过都没有明显提高,或者说几乎没有提高。
 
改业务逻辑的话,不知道怎么样保持像不改业务逻辑那样的效果。例如有10条数据,9条更新频繁,1条几天都不更新一次。那么如果我每次都是新写入,查询时取时间最近的记录,这个好办,但删旧数据时,怎么办呢,如果根据时间删掉当天之前的全部数据,那么原来的10条数据可能只剩下9条了。

要回复问题请先登录注册