node.js - 如何在发送命令之前确保 Elastic Search 是健康的?

标签 node.js elasticsearch

我正在使用来自 Javascript (NodeJS) 客户端的 Elastic Search 的 Bulk API 为一堆文档编制索引。每次通话我都会发送一千个文档。该实例处理它,直到它达到 100 次调用(大约 100K 文档)。然后它返回一个 服务不可用 (503) 错误。

在打一个新电话之前,我会等待上一个电话完成并额外等待一秒钟。

搜索这个问题,我发现了一篇关于 Rails 修复的帖子:https://medium.com/@thetron/dealing-with-503-errors-when-testing-elasticsearch-integration-in-rails-ec7a5f828274 .作者使用以下代码使错误消失:

before do
    repository.create_index!
    repository.client.cluster.health wait_for_status: ‘yellow’
end

基于此,我写了以下内容:

const body = [
    // 1K actions/docs
];
elastic.cluster.health({
    waitForStatus: 'yellow',
    timeout: '60s', // I also tried using the default timeout
    requestTimeout: 60000
}, function (error, response) {
    if (!!error) {
        console.error(error);
        return;
    }
    elastic.bulk({
        body: body
    }, function (error, response) {
        if (!!error) {
            console.error(error);
            return;
        }
        console.log('Success!');
    });
});

不确定它是否有任何区别,但该实例正在 AWS 上运行。由于文档数量众多,也许扩大实例是一种解决方案。但我想在这样做之前弄清楚如何处理这个错误。即使我必须让我的代码变慢一些。

最佳答案

您最好的选择是按照您所说的那样扩展您的集群,但您的加载过程也应该能够处理故障。

话虽如此,以下是 Elasticsearch 集群状态:

  • red - 至少有一个未分配的主分片
  • 黄色 - 至少有一个未分配的副本碎片
  • 绿色 - 一切都已分配且健康

  • 所以在你上面的例子中,你不想等待 yellow , 你要等green .

    关于node.js - 如何在发送命令之前确保 Elastic Search 是健康的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39167870/

    相关文章:

    search - 是否可以检查 Elasticsearch 中给定的索引和类型中是否存在documentIds列表?

    json - 识别 Kibana 和 ElasticSearch 中的时间戳

    node.js - 通过 GraphQL 检索单个和多个对象

    node.js - 为什么当我尝试使用 eslint nodejs api 时不应用 eslint 插件?

    javascript - 尝试从 html 表单和 Node.js 发送数据

    javascript - socket.io 错误 - 'Uncaught, unspecified "错误“事件。”

    elasticsearch - ElasticSearch获取字段,即使它们为空或为空

    javascript - Sendgrid:渲染 ejs 模板,然后作为电子邮件发送。

    ruby-on-rails - 如何测试 ElasticSearch Logstash 和 Kibana

    Elasticsearch反向match_phrase