在多台机器上增加rabbitmq吞吐量

时间:2014-07-29 07:57:03

标签: elasticsearch rabbitmq logstash

我使用logstash和elasticsearch构建日志系统。 RabbitMQ用于在两个logstash之间对日志消息进行排队。

消息路径如下所示:

source log -> logstash -> rabbitMQ -> logstash(parse) -> elasticsearch

但我发现,无论我向RabbitMQ添加多少机器,它只需使用一台机器资源来处理消息。

我发现有些文章称集群只是增加了可靠性和冗余,以防止邮件丢失。

但我想要的是通过添加更多机器来增加整个RabbitMQ群集的吞吐量(进出)。

如何配置RabbitMQ群集以提高吞吐量?

感谢任何评论。

-

PS。我需要在这里添加更多信息。

在我的系统限制i测试中,可以在4个机器集群系统中接收7000 / s消息并输出1700 / s消息,但是不启用HA并且只将1个交换绑定到1个队列并且队列只绑定到1个节点。我猜1队列绑定到1个节点是吞吐量瓶颈。现在很难改变路由密钥,所以我们只有一个路由密钥,并希望将消息分发到不同的节点,以提高整个系统的吞吐量。

下面是我的logstash-indexer配置

rabbitmq {
codec       => "json"
auto_delete => false
durable     => true
exchange    => "logstash-exchange"
key         => "logstash-routingKey"
queue       => "logstash-queue"
host        => "VIP-of-rabbitMQ"
user        => "guest"
password    => "guest"

passive     => false
exclusive   => false


threads     => 4
prefetch_count => 512   }

1 个答案:

答案 0 :(得分:3)

您需要添加更多队列。我猜你只使用一个队列。换句话说,你绑定了一个erlang进程。你想要的是使用多个队列:

这是一个快速而又脏的示例,如何添加一些逻辑来使用logstash将消息发送到不同的队列:

filter {

  # check if path contains source subfolder
  if "foo" in [path] {
    mutate { add_field => [ "source", "foo"] }
  }
  else if "bar" in [path] {
    mutate { add_field => [ "source", "bar"] }
  }
  else {
    mutate { add_field => [ "source", "unknown"] }
  }
}

然后在你的输出中:

  rabbitmq {
    debug => true
    durable => true
    exchange_type => "direct"
    host => "your_rabbit_ip"
    key => "%{source}"
    exchange => "my_exchange"
    persistent => true
    port => 5672
    user => "logstash"
    password => "xxxxxxxxxx"
    workers => 12
  }

更新

看看这个人拥有的存储库: https://github.com/simonmacmullen

我想你会对这个感兴趣: https://github.com/simonmacmullen/random-exchange

This exchange type is for load-balancing among consumers.