Logstashでmultiple pipelineを利用したいと考えています。
通常はisolateするためにinputは異なるようにするものだと思っていますが、同一inputの場合はパフォーマンス等で有意になることは有るのでしょうか。
- 本来は、例えばsyslog転送やrsyncでファイルとして回収した上で、inputをファイルとして取り込むのが一番良さそうだと思ってはいます。
- 各サーバにfilebeatを配置し、logtypeで種類分けをして Logstash:5044へ送る、という設定をすると、logstash5044がパフォーマンス不足になり「multiple pipelineを使え」的なエラーが出たので検討しています。
例えば、以下のような状況を想定しています。
- 2種類のpipelineがある
- 今まではsingle pipelineでif httpd - else if ftpd のように、if文で分岐して処理していた
- worker等のパフォーマンスが足りなくなるくらいの量が来ている
- 下記のように2つの設定をmultiple pipelineで稼働させると、個別にworker等の設定ができるので、パフォーマンスは少しあげられる?(inputが違えば、パフォーマンスあげられそうな気はしますが…)
元のlogstash.yml
input {
beats {
port => "5044"
}
}
filter{
if [fields][logtype] == "httpd" {
grok {
<<処理を記載>>
}
} else if [fields][logtype] == "fptd" {
grok {
<<処理を記載>>
}
}
}
output{
if [fields][logtype] == "httpd" {
elasticsearch{
hosts => ["localhost:9200"]
index => "httdAccess-%{+YYYYMMdd}"
} else if [fields][logtype] == "ftpd" {
elasticsearch{
hosts => ["localhost:9200"]
index => "ftpAccess-%{+YYYYMMdd}"
}
}
multiple pipeline化したconfig
conf.d/httpd.yml
input {
beats {
port => "5044"
}
}
filter{
if [fields][logtype] == "httpd" {
grok {
<<処理を記載>>
}
}
}
output{
elasticsearch{
hosts => ["localhost:9200"]
index => "httdAccess-%{+YYYYMMdd}"
}
conf.d/ftpd.yml
input {
beats {
port => "5044"
}
}
filter{
if [fields][logtype] == "ftpd" {
grok {
<<処理を記載>>
}
}
}
output{
elasticsearch{
hosts => ["localhost:9200"]
index => "ftpdAccess-%{+YYYYMMdd}"
}
上記設定で起動すると、5044へ logtype: ftpd/httpd どちらを投げても処理してくれます。
- inputは共通で使われている?
- 両方のfilterを通っていると思われ、if分岐の場合と比べて 2倍の負荷になっている?