【问题标题】:Use the same connection for multiple Logstash configurations对多个 Logstash 配置使用相同的连接
【发布时间】:2018-09-07 14:20:42
【问题描述】:

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

有什么想法吗?

【问题讨论】:

    标签: java elasticsearch logstash


    【解决方案1】:

    我没有使用 JDBC 输入的经验,但我假设它会为每个文档(每行)内的一个自己的字段中的每一列建立索引。

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

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

    【讨论】:

      【解决方案2】:

      有几种方法可以实现这一点,您需要与它们一起玩才能找到适合您的方法。

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

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

      然后每个文档(行)将被路由到基于客户端 ID 的索引。 这与他们基于日期的索引策略非常相似,并且在 logstash 中默认支持。

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

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

      【讨论】:

        【解决方案3】:

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

        查看更多信息:My post on elastic forum

        【讨论】:

          猜你喜欢
          • 2014-03-14
          • 2021-08-10
          • 2023-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-25
          • 1970-01-01
          • 2021-04-27
          相关资源
          最近更新 更多