Назад | Перейти на главную страницу

Нужна помощь в увеличении производительности logstash

Мы находимся в процессе развертывания стека ELK и нуждаемся в совете и общих рекомендациях относительно производительности кластера и, в частности, logstash.

Итак, текущая настройка, которая у нас есть, состоит в том, что у нас есть 1 узел кибаны, 2 узла logstash и 4 эластичных узла. Узлы logstash используют 8 виртуальных ЦП и 32 ГБ ОЗУ каждый и получают данные системного журнала с помощью nginx в качестве балансировщика нагрузки. Эластичные узлы имеют 8 виртуальных ЦП и 64 ГБ ОЗУ каждый. Размер кучи установлен на 1/2 RAM для всех узлов.

В настоящее время мы обрабатываем около 4-5000 событий в секунду, но планируем увеличить количество событий в секунду. При текущем количестве событий мы видим, что оба узла logstash используют около 90% ЦП. Теперь мы обрабатываем бревна перед тем, как переместить их на эластичный с помощью нескольких фильтров. Они здесь:

3000-фильтр-syslog.conf:

filter {
  if "syslog" in [tags] and "pre-processed" not in [tags] {
    if "%ASA-" in [message] {
      mutate {
        add_tag => [ "pre-processed", "Firewall", "ASA" ]
      }
      grok {
        match => ["message", "%{CISCO_TAGGED_SYSLOG} %{GREEDYDATA:cisco_message}"]
      }
      syslog_pri { }

        if "_grokparsefailure" not in [tags] {
          mutate {
          rename => ["cisco_message", "message"]
          remove_field => ["timestamp"]
          }
        }

 grok {
      match => [
        "message", "%{CISCOFW106001}",
        "message", "%{CISCOFW106006_106007_106010}",
        "message", "%{CISCOFW106014}",
        "message", "%{CISCOFW106015}",
        "message", "%{CISCOFW106021}",
        "message", "%{CISCOFW106023}",
        "message", "%{CISCOFW106100}",
        "message", "%{CISCOFW110002}",
        "message", "%{CISCOFW302010}",
        "message", "%{CISCOFW302013_302014_302015_302016}",
        "message", "%{CISCOFW302020_302021}",
        "message", "%{CISCOFW305011}",
        "message", "%{CISCOFW313001_313004_313008}",
        "message", "%{CISCOFW313005}",
        "message", "%{CISCOFW402117}",
        "message", "%{CISCOFW402119}",
        "message", "%{CISCOFW419001}",
        "message", "%{CISCOFW419002}",
        "message", "%{CISCOFW500004}",
        "message", "%{CISCOFW602303_602304}",
        "message", "%{CISCOFW710001_710002_710003_710005_710006}",
        "message", "%{CISCOFW713172}",
        "message", "%{CISCOFW733100}"
      ]
    }

    }
  }
}

3010-фильтр-jdbc.conf:

filter {
  if "syslog" in [tags] {
    jdbc_static {
      loaders => [
        {
          id => "elkDevIndexAssoc"
          query => "select * from elkDevIndexAssoc"
          local_table => "elkDevIndexAssoc"
        }
      ]
      local_db_objects => [
        {
          name => "elkDevIndexAssoc"
          index_columns => ["cenDevIP"]
          columns => [
            ["cenDevSID", "varchar(255)"],
            ["cenDevFQDN", "varchar(255)"],
            ["cenDevIP", "varchar(255)"],
            ["cenDevServiceName", "varchar(255)"]
          ]
        }
      ]
      local_lookups => [
        {
          id => "localObjects"
          query => "select * from elkDevIndexAssoc WHERE cenDevIP = :host"
          parameters => {host => "[host]"}
          target => "cendotEnhanced"
        }
      ]
      # using add_field here to add & rename values to the event root
      add_field => { cendotFQDN => "%{[cendotEnhanced[0][cendevfqdn]}" }
      add_field => { cendotSID => "%{[cendotEnhanced[0][cendevsid]}" }
      add_field => { cendotServiceName => "%{[cendotEnhanced[0][cendevservicename]}" }
      remove_field => ["cendotEnhanced"]
      jdbc_user => "user"
      jdbc_password => "password"
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      jdbc_driver_library => "/usr/share/java/mysql-connector-java-8.0.11.jar"
      jdbc_connection_string => "jdbc:mysql://84.19.155.71:3306/logstash?serverTimezone=Europe/Stockholm"
      #jdbc_default_timezone => "Europe/Stockholm"
    }
  }  
}

Есть ли способ отладить то, что отнимает столько мощности процессора? У кого-нибудь есть рекомендации, что делать, поскольку нам нужно обрабатывать гораздо больше журналов?

Вот результат jstat:

jstat -gc 56576
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
68096.0 68096.0  0.0   68096.0 545344.0 66712.9  30775744.0 10740782.3 113316.0 93805.9 16452.0 13229.3   1341  146.848   6      0.449  147.297

Спасибо

Вот несколько советов, которые помогут вам с настройкой производительности.

По возможности используйте несколько конвейеров

Logstash 6.0 представил возможность легко запускать несколько конвейеров. Вы можете использовать это для разделения логики обработки событий, если это имеет смысл. Например. вы можете различить два или более типа входов / выходов и их промежуточные процессы фильтрации.

Читать Вот и Вот для некоторых советов по использованию нескольких конвейеров.

Условная логика

Затем попробуйте посмотреть, можете ли вы вообще уменьшить условную логику в своих фильтрах. Чем больше логики if..else у вас будет, тем больше будет нагрузка на ЦП для Logstash.

Получите ценную статистику, чтобы узнать, что вызывает высокую загрузку ЦП

Вам обязательно стоит использовать API статистики узла для Logstash, чтобы увидеть, что происходит внутри вашего текущего конвейера обработки событий.

curl -XGET 'localhost:9600/_node/stats/process'

Вы также можете посмотреть другие типы статистики. (Например, попробуйте конвейеры, а также процесс). Проверьте эту страницу для получения дополнительной информации об использовании API для запроса статистики Logstash. Скорее всего, это подскажет вам, где происходит действительно напряженный процесс.

Удачи!