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

时间:2016-08-26 13:45:50

标签: 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上运行。由于文档数量众多,可能扩展实例是一种解决方案。但我想在走这条路之前弄清楚如何处理这个错误。即使我必须让我的代码慢一点。

1 个答案:

答案 0 :(得分:1)

您最好的选择是按照您的说法扩展群集,但您的加载过程也应该能够处理失败。

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

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

因此,在上面的示例中,您不想等待yellow,而是希望等待green