У нас тот же сценарий: 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 обновит ранее созданные документы вместо дублирования ваших данных.
У нас хорошо работает, попробуйте!