Мы находимся в процессе развертывания стека 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. Скорее всего, это подскажет вам, где происходит действительно напряженный процесс.
Удачи!