【问题标题】:Elasticsearch index/cache not clearing/stuckElasticsearch 索引/缓存未清除/卡住
【发布时间】:2014-10-22 20:54:49
【问题描述】:

我正在使用https://github.com/firebase/flashlight 来索引搜索数据

但是,今天早上我删除了整个firebase索引,所以它应该是空的(这之前已经工作过,但似乎当nodejs app.js在某些情况下崩溃,导致缓存“卡住”),但我仍然以某种方式从我的 nodejs 应用程序中看到旧的搜索结果......

我试过了:

http://localhost:9200/_cache/clear

和

http://localhost:9200/_flush
http://localhost:9200/firebase/_flush

他们都说成功了,但我还是得到了old results,似乎无处可去。

我还可以在控制台中看到它每 60 秒刷新一次,并且,删除整个 firebase 之前没有问题...

我什至在控制台中看到了一条消息housekeeping: found 60 orphans (removing them now),所以现在应该刷新它...

我尝试重新启动 elasticsearch 以及整个 Linux/Debian 服务器...

在 config.js 我有两个索引:

exports.paths = [
   {
      path:  "tags",
      index: "firebase",
      type:  "tag",
      filter: function(data) { return data.name !== 'system'; }
   },
   {
      path:  "tracks",
      index: "firebase",
      type:  "track",
      filter: function(data) { return data.name !== 'system'; }
   }
];

奇怪的是,我在使用“track”商店而不是使用“tag”商店时没有任何问题......

我在这里错过了什么?

// 更新!

所以,我刚刚在 nodejs 脚本运行时删除了 firebase tracks 索引,而脚本 crashed... 同样的问题,不同的索引。那么crashing script must cause it...那么,我该如何clear this stuck cache?

【问题讨论】:

  • 如果你重启了 flashlight 的工作进程,它会在重启时从数据中重新索引所有这些值,从而将它们放回 ES。
  • 好吧,它没有,我什至拼命地重新启动了整个服务器。它显示了在火力基地中根本不存在的结果。就好像缓存被特定的“标签”索引卡住了......
  • 所以,我刚刚在 nodejs 脚本运行时删除了 firebase tracks 索引并且脚本崩溃了......你猜怎么着?同样的问题,不同的指标。所以崩溃的脚本一定会导致它......
  • 当你说你在删除索引时,你的意思是你在ElasticSearch中删除它们吗?当你有一个脚本试图将数据放入索引时,你为什么要这样做?
  • "firebase tracks index",所以只删除Firebase中的整棵树

标签: node.js caching indexing elasticsearch firebase


【解决方案1】:

所以我通过简单地修复它:

curl -XDELETE localhost:9200/Firebase

感谢:https://github.com/elasticsearch/elasticsearch/issues/7541#issuecomment-54724302

我猜 Elastic 搜索不知道(也没有被告知)其当前索引的相关性,也许我正在使用的 Flashlight 脚本没有告知它索引应该是什么?但是,由于这仅在您突然删除整个 firebase 索引时节点脚本崩溃时才需要,因此它应该可以以某种方式捕获,但我很高兴我至少可以像这样修复它。重建索引现在不是一个大问题/任务,但将来可能是。

【讨论】:

    【解决方案2】:

    一个疯狂的猜测,也许你没有正确发布查询。您说您尝试过以下链接:

    http://localhost:9200/_cache/clear
    http://localhost:9200/_flush
    http://localhost:9200/firebase/_flush
    

    如果您从浏览器访问网址,它不会清除它们。你必须发布它们。如果你这样做了,你的问题是模棱两可的,GET 和 POST 都返回相同的结果(显示总数、成功和失败)。使用 curl 从命令行尝试此操作:

    curl -XPOST 'http://localhost:9200/_cache/clear'
    curl -XPOST 'http://localhost:9200/_flush'
    

    或者使用 JQuery 或使用 fiddler 创建 AJAX 请求。

    【讨论】:

    • 我真的希望就是这样,但在那之后它仍然会从它的 *** 中提取结果......而且看起来节点脚本的崩溃确实导致了它......
    • 如果我能找到这个缓存的保存位置,我开始怀疑 nodejs 在某处有一些缓存。我的意思是,我 100% 确定如果我要格式化可以修复它的驱动器 (;P),或者将它安装在不同的机器上。但我只想知道如何手动修复它...
    • 除非出现奇迹(和云存储),nodejs 必须从磁盘读取其数据。它必须使用标准 I/O 来做到这一点。因此,如果您在strace -f 下运行nodejs,它将为您提供一个巨大的 列表,其中包含nodejs 出于任何原因使用的所有文件。 ... 2>&1 | grep "^open(" | grep -v ENOENT | cut -f2 -d'"' | sort | uniq 会大大减少你需要检查的行数。
    【解决方案3】:

    尝试通过向您的 elasticsearch 服务器发送以下 POST 请求来优化您的指标:

    curl -XPOST 'http://localhost:9200/_optimize?max_num_segments=1&wait_for_merge=true'
    

    它使lucene真正从磁盘中删除已删除的文档并合并索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2014-10-14
      • 1970-01-01
      相关资源
      最近更新 更多