如何防止Elasticsearch进行索引限制?

时间:2015-03-13 19:03:24

标签: performance indexing elasticsearch

我有一个40节点的Elasticsearch集群,它受到高索引请求率的影响。这些节点中的每一个都使用SSD以获得最佳性能。正如几个来源所建议的那样,我试图通过以下配置来防止索引限制:

indices.store.throttle.type: none

不幸的是,我仍然看到性能问题,因为群集仍会定期限制索引。以下日志证实了这一点:

[2015-03-13 00:03:12,803][INFO ][index.engine.internal    ] [CO3SCH010160941] [siphonaudit_20150313][19] now throttling indexing: numMergesInFlight=6, maxNumMerges=5
[2015-03-13 00:03:12,829][INFO ][index.engine.internal    ] [CO3SCH010160941] [siphonaudit_20150313][19] stop throttling indexing: numMergesInFlight=4, maxNumMerges=5
[2015-03-13 00:03:13,804][INFO ][index.engine.internal    ] [CO3SCH010160941] [siphonaudit_20150313][19] now throttling indexing: numMergesInFlight=6, maxNumMerges=5
[2015-03-13 00:03:13,818][INFO ][index.engine.internal    ] [CO3SCH010160941] [siphonaudit_20150313][19] stop throttling indexing: numMergesInFlight=4, maxNumMerges=5
[2015-03-13 00:05:00,791][INFO ][index.engine.internal    ] [CO3SCH010160941] [siphon_20150313][6] now throttling indexing: numMergesInFlight=6, maxNumMerges=5
[2015-03-13 00:05:00,808][INFO ][index.engine.internal    ] [CO3SCH010160941] [siphon_20150313][6] stop throttling indexing: numMergesInFlight=4, maxNumMerges=5
[2015-03-13 00:06:00,861][INFO ][index.engine.internal    ] [CO3SCH010160941] [siphon_20150313][6] now throttling indexing: numMergesInFlight=6, maxNumMerges=5
[2015-03-13 00:06:00,879][INFO ][index.engine.internal    ] [CO3SCH010160941] [siphon_20150313][6] stop throttling indexing: numMergesInFlight=4, maxNumMerges=5

在40个节点中的一个因各种预期原因而死亡之后发生限制。群集立即进入黄色状态,其中许多分片将开始在剩余节点上初始化。

知道为什么群集在明确配置后不继续加油?在节点发生故障后,有哪些其他建议让集群更快地返回绿色状态?

4 个答案:

答案 0 :(得分:3)

实际上对应于日志文件中maxNumMerges的设置称为index.merge.scheduler.max_merge_count。增加此以及 index.merge.scheduler.max_thread_count(其中max_thread_count< = max_merge_count)将增加单个索引中段所允许的同时合并的数量&#39 ; s分片。

如果索引率非常高,导致单个索引中有多个GB,那么您可能还想提出Elasticsearch默认设置对段 size 所做的其他一些假设。尝试提升floor_segment - 在考虑合并细分之前的最小尺寸,max_merged_segment - 单个细分的最大尺寸,以及segments_per_tier - 细分的细分数量在开始合并到新层之前大致相当于大小。在具有高索引速率和完成索引大小约120GB且每个索引有10个分片的应用程序中,我们使用以下设置:

curl -XPUT /index_name/_settings -d'
{
  "settings": {
    "index.merge.policy.max_merge_at_once": 10,
    "index.merge.scheduler.max_thread_count": 10,
    "index.merge.scheduler.max_merge_count": 10,
    "index.merge.policy.floor_segment": "100mb",
    "index.merge.policy.segments_per_tier": 25,
    "index.merge.policy.max_merged_segment": "10gb"
  }
}

此外,您可以采取一项重要措施来改善具有高索引率的应用程序的节点/节点重新启动恢复时间,这是利用 index recovery prioritization (在ES>中)。 = 1.7)。调整此设置,以便首先恢复接收最多索引活动的索引。你可能知道,"正常"分片初始化过程只是复制节点之间已经索引的段文件。但是,如果在初始化之前或初始化期间针对分片发生索引活动,则具有新文档的translog可能会变得非常大。在恢复过程中合并进入屋顶的情况下,这个translog的重播几乎总是罪魁祸首。因此,使用索引恢复优先级来恢复那些第一分片并使用较少的索引活动延迟分片,可以最小化translog的最终大小,这将显着缩短恢复时间。

答案 1 :(得分:2)

我们正在使用1.7并注意到类似的问题:即使IO未饱和,索引也会受到限制(在我们的例子中是Fusion IO)。

增加" index.merge.scheduler.max_thread_count"这个问题似乎已经消失了 - 到目前为止我们还没有看到更多的节流。

我会尝试设置" index.merge.scheduler.max_thread_count"至少报告的最大数量为numMergesInFlight(上面日志中 6 )。

https://www.elastic.co/guide/en/elasticsearch/reference/1.7/index-modules-merge.html#scheduling

希望这有帮助!

答案 2 :(得分:0)

您是否考虑过增加分片分配延迟,以便在主服务器开始宣传副本之前为节点提供恢复时间?

https://www.elastic.co/guide/en/elasticsearch/reference/current/delayed-allocation.html

答案 3 :(得分:0)

尝试将index.merge.scheduler.max_thread_count设置为1

https://www.elastic.co/blog/performance-considerations-elasticsearch-indexing