0

我在 AWS ECS 中运行 RabbitMQ Docker 映像 (rabbitmq:3-management)。它工作正常,没有任何问题。

然后我增加了一点复杂性,并使用相同的 RabbitMQ 创建了一个服务,但现在连接到 AWS 网络负载均衡器(我的最终目标是创建一个 RabbitMQ 集群,所以我需要负载均衡器后面的一些实例)。目标组配置了端口 5672,并使用同一端口进行健康检查。健康检查之间的间隔是 30 秒(它是最大可用的)。值为 5。在 ECS 运行状况检查中的服务配置中,宽限期为 120 秒。应该足以启动服务。发生的情况是,当我在几分钟后运行服务时,它会被杀死并重新启动:

service Rabbit-master (instance i-xxx) (port 5672) is unhealthy in target-group Rabbit-cluster-target-group due to (reason Health checks failed)

“几分钟”是指 2 或 5 或 9 分钟......它会有所不同。它不会在开始时发生,而是在一段时间后发生。我还看到 RabbitMQ 工作正常(在日志和管理面板中)。所以正是 ELB 导致了它的重启。并不是说第一个 RabbitMQ 死了,然后 ELB 重新启动它,不。

所以我的问题是我做错了什么以及如何在ECS中与ELB配对实现RabbitMQ的稳定工作?使用端口 5672 进行健康检查的想法是否错误?但是使用哪个端口呢?15672?

抱歉,如果我没有提供足够的详细信息。我描述了那些在我看来相关的东西。如果您需要更多内容,我将很乐意详细说明。谢谢!

4

3 回答 3

1

显然问题在于使用 NLB 的 IP 配置 RabbitMQ 服务的安全组。我没有立即想到这个想法,因为

  1. 重新启动不是在服务运行后立即发生,而是在几分钟后发生
  2. NLB 没有安全组,它们的 ID 也不是那么容易找到。

更多细节在这里:

https://forums.aws.amazon.com/thread.jspa?threadID=263245

和这里:

https://docs.aws.amazon.com/elasticloadbalancing/latest/network/target-group-register-targets.html#target-security-groups

于 2019-06-24T21:30:38.360 回答
0

您的健康检查网址有效吗?ALB 发生在我身上。我的情况是

  • 例如:TargetGroup 被映射到/api/profiles=> container:4000,但我的容器没有任何到 server 的路由api/profiles。因为 ALB 没有像前 Nginx 那样重写路径。它正在搜索 api/profiles容器中的路线,而我的路线只是 /profiles. 所以我改变了nginx中的路径然后它工作了。

如何诊断

于 2019-06-24T12:18:34.943 回答
0

在使用 ALB 附加服务时,指定运行状况检查路径或端口非常重要。

ALB 不会检查响应正文,但会检查状态码,因此唯一会返回200状态码的调用是curl -I http://127.0.0.1:15672 rest 将需要身份验证或 404 或 403,LB 将目标标记为不健康。

在此处输入图像描述

因为 15672 将返回 200。

在此处输入图像描述

此外,验证所需目标组的 ECS 任务的健康检查,它是否指向实例的正确端口。 在此处输入图像描述

第二个选项:此外,您可以为 LB 编写自定义健康检查,它将监控容器的两个端口,因为 ALB 检查健康检查一次只检查一个端口,一个简单的示例可以基于 nodejs,因此这意味着您有运行简单的节点应用程序,它将检查端口并响应 ALB 健康检查。

在这种情况下,您的健康检查将是/ping,端口将是3007

下面是我们用于此类 ECS 任务的代码,我们需要检查多个端口。

   var express = require('express');
const isAllReachable = require('is-all-reachable');
var request = require('request');
var app = express();

app.get('/ping', (req, res) => {

    isAllReachable([
        // first check if all reachable
        'http://localhost:15672'
        // 'http://localhost:otherport'
    ], (err, reachable, host) => {
        //if reachable then do API request if its responding
        if (reachable) {

            console.log("Health check passed");
            console.log("checking rabbitMQ");
            request.get('http://localhost:15672/api/vhosts', {
                'auth': {
                    'user': 'guest',
                    'pass': 'guest',
                    'sendImmediately': false
                }
            }, function(error, response, body) {
                console.log({
                    "status_code": response.statusCode,
                    "body": body
                })
                if (error) {
                    console.log(error)
                    console.log("failed to get vhosts");
                    res.status(500).send('health check failed');
                } else {
                    res.status(200).send('rabbit mq is running');
                }

            })
        } else {
            console.log("health check failed. ", "This server is not reachable", err);
            res.status(500).send('health check failed. one of the port is not reachable.');
            console.log(reachable)
        }
    });
});

    app.listen(3007, () => console.log('LB custom Health check server listening on port 3007!'));

对于 Rabbit 监控,可以深入探索rabbitmq 监控。

于 2019-06-24T14:34:16.590 回答