我正在使用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"
有什么想法吗?
答案 0 :(得分:0)
我没有JDBC输入方面的经验,但我假设它将为每个文档(每行)内部一个字段中的每一列编制索引。
因此,您不必在查询中针对特定用户进行过滤,而只需将所有行添加到同一索引中即可。之后,您可以针对特定用户使用Kibana进行过滤(假设您想使用Kibana来分析数据)。过滤也可以通过ES查询来完成。
使用这种方法,您只需要配置1个logstash。
答案 1 :(得分:0)
有几种方法可以实现此目的,您将需要与他们一起找到适合您的方法。
根据我使用JDBC输入的经验,您选择的所有列都将成为文档中的字段。 JDBC输入返回的每一行将产生一个新文档。
如果选择客户端ID而不是将其用作参数/谓词,则可以在弹性搜索输出中使用该ID,并将其附加到索引输出中。
每个文档(行)随后将根据客户端ID路由到索引。 这非常类似于其基于日期的索引策略,并且在logstash中默认支持。
请记住,logstash引入所有列名称时,它们会自动小写。在logstash中,它们都区分大小写。
答案 2 :(得分:0)
我决定不为每个客户使用1个索引,而是决定为所有客户使用1个索引,并在查询中对客户进行过滤。 效果很好,没有性能问题。
请检查此以获取更多信息:My post on elastic forum