【问题标题】:Elasticsearch: get up to date size of an indexElasticsearch:获取索引的最新大小
【发布时间】:2017-03-03 05:21:40
【问题描述】:

问:如何获取自上次刷新以来的最新索引的size(使用_stats)?

我正在对 Elasticsearch 集群进行一些性能测试。代码有效:

Create INDEX
Set refresh_interval to -1 (don't refresh while inserting)
Insert 2000 documents into INDEX
Set refresh_interval back to 1 (default)

Force a refresh of INDEX
Get _stats of INDEX (particularly to get the size)

我的理解是当文件are indexed时,它们首先被插入到一个ES内存缓冲区中。强制刷新将导致 ES 为仍在缓冲区中的文档创建一个 Lucene 段。 (还有一些其他情况,文档缓冲区也会清空到 Lucene 段中。)

我相信refreshing the index 将保证到那时为止的文档都是可搜索的。我希望 ES 使可搜索的文档也反映在 _stats 中。但是,我发现统计请求的大小不确定(例如,它可能是 520 字节而不是 23602)。

我尝试在刷新后、_stats 调用之前休眠我的进程,但成功率各不相同。但我想知道是否有适当的、一致的解决方案来获取最新的统计数据? (或者,如果我的理解不正确)。

示例

插入 2000 个文档后,我立即在 Sense 中手动(重复)运行 _stats 并检查结果。在一段时间内,大约 5 秒,我会看到:

"primaries": {
  "docs": {
    "count": 2000,
    "deleted": 0
  },
  "store": {
    "size_in_bytes": 520,
    "throttle_time_in_millis": 0

那么(随着 ES 突然变得和最近的变化一致),我看看:

"primaries": {
  "docs": {
    "count": 2000,
    "deleted": 0
  },
  "store": {
    "size_in_bytes": 23602,
    "throttle_time_in_millis": 0

只要没有添加新文档,这个结果就会无限期地持续下去。

【问题讨论】:

  • 是什么让您认为“这似乎是错误的”?向我们展示一些数字以及您的期望。
  • 啊,对。我发现_stats 调用中的索引大小不正确。我使用bulk 调用索引了 1000 个文档(每个文档都包含时间戳、双精度和字符串列表)。我在索引上调用refresh。然后我在索引上调用stats。响应显示索引总共为 130 字节。我可以稍后从 Sense 手动调用 _stats,然后看到现在有 135976 字节(Marvel 还在索引摘要页面上显示了这个更大、合理的数字)。
  • 你能显示你正在运行的命令列表(即你的代码)吗?
  • 我可以,但是很长。不过,更一般地说,我希望对 ES 实际上在做什么我称之为_stats 有一些直觉。我会再挖一些,尽快回来。
  • 我很担心你的刷新电话,特别是因为你有一个错字:refresh_interal 应该是refresh_interval

标签: elasticsearch


【解决方案1】:

我认为这与INDEX_STORE_STATS_REFRESH_INTERVAL_SETTING有关,见https://github.com/elastic/elasticsearch/blob/5.1/core/src/main/java/org/elasticsearch/index/store/Store.java#L133-L134

默认为 10 秒,但您可以通过 index.store.stats_refresh_interval 更改该值。我不知道这会带来多少性能开销,因此如果您考虑更改该值,请仔细测试。

这也用于单元测试,见https://github.com/elastic/elasticsearch/blob/5.1/core/src/test/java/org/elasticsearch/index/store/StoreTests.java#L760

【讨论】:

  • 谢谢,很好的发现。因此,从更通用的角度来看,我认为可以通过以下方式更改此设置:PUT /my_index { "settings": { "index.store. stats_refresh_interval": 1 } }
  • 设置应该是一个带有时间值的字符串,所以创建一个1秒统计刷新间隔的索引是PUT /my_index { "settings": { "index.store.stats_refresh_interval": "1s" } }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 2017-01-13
  • 2015-12-11
  • 1970-01-01
  • 2020-12-09
  • 2013-10-09
  • 1970-01-01
相关资源
最近更新 更多