マルチマシンでの RabbitMQ スループットの向上
-
20-12-2019 - |
質問
logstash と elasticsearch を使用してログ システムを構築しています。RabbitMQ は、2 つのログスタッシュ間のログ メッセージをキューに入れていました。
メッセージパスは以下のような感じです。
source log -> logstash -> rabbitMQ -> logstash(parse) -> elasticsearch
しかし、rabbitMQ にどれだけ多くのマシンを追加しても、メッセージの処理に使用されるマシン リソースは 1 つだけであることがわかりました。
クラスターはメッセージの損失を防ぐために信頼性と冗長性を高めるだけであるという記事をいくつか見つけました。
しかし、私が望むのは、マシンを追加して RabbitMQ クラスター全体のスループット (入出力) を向上させることです。
スループットを向上させるために RabbitMQ クラスターを構成するにはどうすればよいですか?
コメントは大歓迎です。
--
PS.ここにさらに情報を追加する必要があります。
私のシステム制限では、私がテストしたのは、4マシンのクラスターシステムで7000/秒のメッセージを受信し、1700/秒のメッセージを出力できますが、HAを有効にせず、1つの交換を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 つだけ使用していると思います。つまり、1 つの 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.