对多个Logstash配置使用相同的连接

时间:2018-09-07 14:20:43

标签: java elasticsearch logstash

我正在使用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...

这很糟糕。

是否可以对所有脚本使用相同的连接? 所有这些脚本之间的唯一区别是参数id和索引名称,每个客户端将具有不同的id和不同的索引:

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

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

我没有JDBC输入方面的经验,但我假设它将为每个文档(每行)内部一个字段中的每一列编制索引。

因此,您不必在查询中针对特定用户进行过滤,而只需将所有行添加到同一索引中即可。之后,您可以针对特定用户使用Kibana进行过滤(假设您想使用Kibana来分析数据)。过滤也可以通过ES查询来完成。

使用这种方法,您只需要配置1个logstash。

答案 1 :(得分:0)

有几种方法可以实现此目的,您将需要与他们一起找到适合您的方法。

根据我使用JDBC输入的经验,您选择的所有列都将成为文档中的字段。 JDBC输入返回的每一行将产生一个新文档。

如果选择客户端ID而不是将其用作参数/谓词,则可以在弹性搜索输出中使用该ID,并将其附加到索引输出中。

每个文档(行)随后将根据客户端ID路由到索引。 这非常类似于其基于日期的索引策略,并且在logstash中默认支持。

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

请记住,logstash引入所有列名称时,它们会自动小写。在logstash中,它们都区分大小写。

答案 2 :(得分:0)

我决定不为每个客户使用1个索引,而是决定为所有客户使用1个索引,并在查询中对客户进行过滤。 效果很好,没有性能问题。

请检查此以获取更多信息:My post on elastic forum