Используйте одно и то же соединение для нескольких конфигураций Logstash - PullRequest
0 голосов
/ 07 сентября 2018

Я использую Logstash 2.4.1 для загрузки данных в Elasticsearch 2.4.6. У меня есть следующая конфигурация Logstash:

input {
    jdbc {
        jdbc_connection_string => "jdbc:oracle:thin:@database:1521:db1"
        jdbc_user => "user"
        jdbc_password => "password"
        jdbc_driver_library => "ojdbc6-11.2.0.jar"
        jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"
        parameters => { "id" => 1 }
        statement => "SELECT modify_date, userName from user where id = :id AND modify_date >= :sql_last_value"

        schedule => "*/1 * * * *"
        tracking_column => modify_date
    }
}
output {
    elasticsearch { 
        hosts => ["localhost:9200"]
        index => "index1"
        document_type  => "USER"
    }
    stdout { codec => rubydebug }
}

Итак, за каждую минуту он идет в базу данных, чтобы проверить, есть ли новые данные для Elastic. Работает отлично, но есть одна проблема: У нас около 100 клиентов, и все они находятся в одном экземпляре базы данных.

Это означает, что у меня есть 100 сценариев и 100 экземпляров Logstash, что означает 100 открытых подключений:

nohup ./logstash -f client-1.conf Logstash startup
nohup ./logstash -f client-2.conf Logstash startup
nohup ./logstash -f client-3.conf Logstash startup
nohup ./logstash -f client-4.conf Logstash startup
nohup ./logstash -f client-5.conf Logstash startup
and so on...

Это просто плохо.

Можно ли как-то использовать одно и то же соединение для всех моих скриптов? Единственная разница между всеми этими сценариями - это идентификатор параметра и имя индекса, у каждого клиента будет свой идентификатор и свой индекс:

parameters => { "id" => 1 }
index => "index1"

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Есть несколько способов реализовать это, вам нужно будет поиграть с ними, чтобы найти тот, который подходит именно вам.

По моему опыту с вводом JDBC все выбранные вами столбцы становятся полями в документе. Каждая строка, возвращенная входными данными JDBC, приведет к новому документу.

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

Каждый документ (строка) затем направляется в индекс на основе идентификатора клиента. Это очень похоже на их стратегию индекса на основе даты и поддерживается по умолчанию в logstash.

https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html#plugins-outputs-elasticsearch-index

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

0 голосов
/ 13 сентября 2018

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

Проверьте это для получения дополнительной информации: Мой пост на эластичном форуме

0 голосов
/ 07 сентября 2018

У меня нет опыта ввода JDBC, но я предполагаю, что он будет индексировать каждый столбец в собственном поле внутри каждого документа (для каждой строки).

Так что вам не нужно фильтровать конкретного пользователя в запросе, а просто добавить все строки в один и тот же индекс. После этого вы можете фильтровать с помощью Kibana конкретного пользователя (предполагается, что вы хотите использовать Kibana для анализа данных). Фильтрация также может быть выполнена с помощью запроса ES.

При таком подходе вам нужна только 1 конфигурация logstash.

...