【问题标题】:How to make sure Elastic Search is healthy before sending a command?如何在发送命令之前确保 Elastic Search 是健康的?
【发布时间】:2016-08-26 22:05:07
【问题描述】:

我正在使用来自 Javascript (NodeJS) 客户端的 Elastic Search 的 Bulk API 为一堆文档编制索引。每次通话我都会发送一千个文档。该实例处理它,直到它达到 100 次调用(大约 100K 文档)。然后它会返回 Service Unavailable (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 上运行。由于文档数量众多,也许扩大实例是一种解决方案。但我想在这样做之前弄清楚如何处理这个错误。即使我必须让我的代码变慢一些。

【问题讨论】:

    标签: node.js elasticsearch


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我认为我的实例永远不会是绿色的。考虑到这一点,可能扩大规模是唯一的解决方案。
    • 如果您的实例从不是绿色的,那么您没有足够的节点让副本位于与主分片不同的节点上。您可以将副本设置为 0,但这样就没有冗余了。
    • 您可以使用我的其他答案之一来诊断您没有达到绿色的原因:stackoverflow.com/a/23816954/2785358
    • 感谢您提供详细信息。我会检查你的答案。
    猜你喜欢
    • 1970-01-01
    • 2016-10-28
    • 2021-07-04
    • 1970-01-01
    • 2016-09-11
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多