我有一项Flink工作,它是以每秒数千个文档的速度对Elasticsearch进行大量写入/更新。每次我查询时,都需要10-20秒才能得到响应。
在同一个集群上,我有第二个索引,完全相同,但是在这个索引上,写操作现在被调低到0。当我查询时,需要几毫秒的时间才能得到响应。
,即写掉查询需要几毫秒。对于查询的写操作,需要10-20秒。
CPU利用率10%,JVM压力70%。ES 7.8.
那时看来,写到碎片似乎在某种程度上减缓了读取速度。考虑到"profile": true,这是很奇怪的,它给我提供了毫秒的查询时间,但是took (总请求时间)是以秒为单位的,就像我看到的。
我的问题是,为什么会发生这种情况,以及如何优化它?
(我确实想过,也许我可以读取副本节点,但ES不支持读取副本节点类型https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html#node-roles )
发布于 2020-11-12 05:25:08
不确定您最初的refresh_interval值是什么,但是默认值是1秒,您显式地设置了这个值,这对搜索结果中返回的文档有很大影响。
Refresh使文档被写入搜索查询使用的片段,如果不进行刷新,您将得到过时的文档(对于现有的文档),在刷新后编写的新文档在搜索结果中也将不可用。
但这并不影响搜索查询的性能,在您的情况下,索引也在进行,搜索查询需要花费更多的时间来调试(请参阅CPU、内存、节点统计(搜索队列的队列大小和索引队列)等)。
顺便说一句,副本与shard有关,而不是节点,您可以很容易地动态地增加索引的副本,以提高搜索性能。
PUT /my-index-000001/_settings
{
"index" : {
"number_of_replicas" : 2 // no of replica you want to set.
}
}https://stackoverflow.com/questions/64793910
复制相似问题