Запуск Logstash на нескольких узлах с плагином ввода JDBC - PullRequest
1 голос
/ 08 марта 2019

У меня есть базовая настройка высокой доступности для Logstash - два идентичных узла в двух отдельных зонах доступности AWS. Каждый узел запускает конвейер, который извлекает набор данных из кластера БД, а затем выводит его в нисходящий поток в кластер ELasticSearch для индексации. Это прекрасно работает с одним узлом Logstash, но два параллельно работающих узла отправляют одни и те же данные дважды в ES для индексации из-за того, что каждый узел отслеживает :sql_last_value отдельно. Поскольку я использую один и тот же идентификатор в качестве идентификатора документа на обоих узлах, все повторяющиеся данные просто обновляются, а не вставляются дважды. Другими словами, есть 1 вставка и 1 обновление на каждый набор данных. Это, очевидно, не очень эффективно и накладывает ненужную нагрузку на ресурсы ELK. Это ухудшается, когда добавляются дополнительные узлы Logstash.

Кто-нибудь знает лучший способ настройки параллельных узлов Logstash, чтобы каждый узел не извлекал один и тот же набор данных, если он уже был извлечен другим предыдущим узлом? Одним из решений для бедняков может быть создание общей папки NFS между узлами Logstash и запись каждого узла туда :sql_last_value, но я не уверен, с каким побочным эффектом я могу столкнуться с этой настройкой, особенно при высоких нагрузках. Спасибо!

1 Ответ

1 голос
/ 28 мая 2019

У нас тот же сценарий: 3 экземпляра logstash для обеспечения высокой доступности с несколькими базами данных в качестве источников данных.

На каждом экземпляре logstash установите и включите одинаковые jdbc-конвейеры, следуя этой логике:

  • найдите уникальный идентификатор в вашем наборе результатов для каждого документа (первичный ключ и т. Д.) Или создайте отпечаток , используя поля в результате (MD5, SHA, а не UUID). Этот идентификатор должен быть стабильным! Это должно быть то же самое на других узлах logstash, когда возвращаются те же сущности.
  • в выводе эластичного поиска используйте идентификатор или отпечаток пальца в качестве документа _id.

Вот упрощенный пример для простого случая (id является частью набора результатов):

input{
  jdbc{
     ...
     statement => "select log_id, * from ..."
     ...
  }
}
filter{...}
output{
  elasticsearch{
    ...
    index => "logs-%{+YYYY.MM.dd}"
    document_id => "%{[log_id]}"
    ...
  }
}

И вот вариант, когда в ваших данных отсутствуют уникальные идентификаторы, и вам необходимо сгенерировать отпечаток пальца.

input{
  jdbc{
     ...
     statement => "select * from ..."
     ...
  }
}
filter{
  fingerprint {
    method => "MD5"
    concatenate_all_fields => true
  }
}
output{
  elasticsearch{
    ...
    index => "logs-%{+YYYY.MM.dd}"
    document_id => "%{[fingerprint]}"
    ...
  }
}

В обоих случаях документы будут создаваться, когда они являются частью набора результатов для одного экземпляра logstash. Все остальные экземпляры logstash получат те же документы позже. Использование идентификатора / отпечатка пальца в качестве _id обновит ранее созданные документы вместо дублирования ваших данных.

У нас хорошо работает, попробуйте!

...