ELK中logstash收集数据写入redis数据积压的问题

我们之前写过一篇logstash收集数据输出到redis的笔记:https://sulao.cn/post/739.html,可能我们有一点顾虑,redis单个key的最大value大小为512M,

在生产环境中收集集群机器的日志数据可能512M一会就会写满,所以写满以后导致了redis的数据积压,导致数据读写瓶颈,其实logstash写入和读取redis的时候使用list方式分别使用rpush和lblpop推入和删除已读数据,logstash插入数据到list的最后,logstash不断取走列表的第一个组数据并删除,redis读取数据非常快,所以一般情况下很难导致redis的数据积压

我们可以考虑将logstash中redis配置的data_type改为channel/pattern_channel,这样虽然能够避免可能导致redis数据积压的问题,但是当ES断线的时候导致读取不到断线时的消息,因为redis不支持重复消费订阅频道的信息

我们来看看配置例子

#cat /etc/logstash/conf.d/logstash.conf
input {
  beats {
    port => 5044
    codec => plain {
          charset => "UTF-8"
    }
  }
}

filter {
  grok {
    match => ["message", '%{IP:Client} - - \[%{HTTPDATE:timestamp}\] \"(%{WORD:method} %{NOTSPACE:request} HTTP/%{NUMBER:httpversion})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent}']
  }
  if "beats_input_codec_plain_applied" in [tags] {
    mutate {
      remove_tag => ["beats_input_codec_plain_applied"]
    }
  }
}

#output {
#  elasticsearch {
#    hosts => "172.26.61.61:9200"
#    manage_template => false
#    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
#  }
#}

output {
  redis {
    data_type => "channel" #工作方式
    host => "172.26.61.58"
    port => "6379"
    db => "0"
    #password => "123456"
    key => "nginx_log"
  }
}


#cat /etc/logstash/conf.d/redis.conf
input {
  redis {
    data_type => "channel" #工作方式
    host => "172.26.61.58"
    port => "6379"
    db => "0"
    #password => "123456"
    key => "nginx_log"
    threads => 1
  }
}

output {
  elasticsearch {
    hosts => "172.26.61.61:9200"
    manage_template => false
    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
  }
}


这种方式在需要扩展 logstash 成多节点集群的时候,会出现一个问题:通过频道发布的一条信息,会被所有订阅了该频道的 logstash 进程同时接收到,然后输出重复内容!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/745.html

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。