本人在前面写的《通过Logstash实现Oracle数据到Elasticsearch的批量导入》一文中介绍的方法适用于在搭建初始环境时,把原始数据一次性导入到Elasticsearch中。但是实际生产过程中,往往是需要实现Oracle到Elasticsearch的实时同步。下面我就来介绍一下借助Logstash7.4实现Oracle12.1.01到Elasticsearch7.4的动态增量更新的方法。
一、实践环境
1、Oracle所在操作系统:Linux redhat enterprise 6.8
2、Oracle版本:12.1.0.1
3、Oracle集群:2个节点的RAC
4、Logstash、elasticsearch所在操作系统:centos 7
5、logstash版本:7.4.2,IP地址:192.168.100.156
6、elasticsearch版本:7.4.2,IP地址:192.168.100.155
7、logstash、elasticsearch为独立部署单机模式。
8、logstash_input_jdbc版本:v4.3.16
9、logstash-output-elasticsearch版本:10.1.0
至于logstash、elasticsearch的搭建,可以参照本人的相关博文。
二、具体实现
1、根据批量导入的方式,修改logstash配置文件。输入组件为logstash-input-jdbc。输出组件为logstash-output-elasticsearch。
input {
stdin{
}
jdbc{
jdbc_connection_string=> "jdbc:oracle:thin:@192.168.100.53:1521/gis01"
jdbc_user=> "**"
jdbc_password=> "**"
jdbc_driver_library=> ""
jdbc_driver_class=> "Java::oracle.jdbc.driver.OracleDriver"
statement=> "select t.id,t.bsm,t.mc,t.jzxttl,t.gshttl,t.ytshttl,sde.st_astext(t.shape) as location from 港口分布 t"
jdbc_fetch_size=>50
}
}
output {
elasticsearch {
hosts => ["http://192.168.100.155:9200"]
index => "test_oracle"
#user => "elastic"
#password => "changeme"
}
stdout{ codec=> rubydebug}
}
2、配置logstash-input-jdbc的预定义参数实现增量更新
sql_last_value参数:是一个预定义参数,这个值用来标记需要检索的行。在查找开始之前,该值被设置为1970年1月1日,星期二。如果use_column_value设置为true时,并且tracking_column设置为sql语句中的某个字段名称后,该值默认为0。当SQL语句开始执行后,该值就会动态更新。
在jdbc{}体中增加以下内容
use_column_value => true
tracking_column => "id"
上面的“id”是sql语句中的字段名称,在Oracle中是数值型。建议tracking_column中使用的字段为关键字段,且随着数据变化该值进行增长的日期型或是数值型字段。
同时修改jdbc{}中的SQL语句为:
statement=> "select t.id,t.bsm,t.mc,t.jzxttl,t.gshttl,t.ytshttl,sde.st_astext(t.shape) as location from 港口分布 t where t.id > :sql_last_value"
三、配置定时任务
logstash-input-jdbc组件可以实现定时任务,定时任务的配置语法可以参照“rufus-scheduler”。这个语法类似于cron中的定时任务。
在本例中,在jdbc{}体中增加schedule配置信息,表示logstash每秒发起一次查询:
schedule => "* * * * *"
完整的配置文件如下:
input {
stdin{
}
jdbc{
jdbc_connection_string=> "jdbc:oracle:thin:@192.168.100.53:1521/gis01"
jdbc_user=> "**"
jdbc_password=> "**"
jdbc_driver_library=> ""
jdbc_driver_class=> "Java::oracle.jdbc.driver.OracleDriver"
statement=> "select t.id,t.bsm,t.mc,t.jzxttl,t.gshttl,t.ytshttl,sde.st_astext(t.shape) as location from 港口分布 t where t.id > :sql_last_value"
use_column_value => true
tracking_column => "id"
jdbc_fetch_size=>50
schedule => "* * * * *"
}
}
output {
elasticsearch {
hosts => [“http://192.168.100.155:9200”]
index => “test_oracle”
#user => “elastic”
#password => “changeme”
}
stdout{ codec=> rubydebug}
}
启动logstash
至此,动态增量更新Oracle数据到elasticsearch中的配置完成,接下来用配置文件启动Logstash即可。
以配置文件的方式启动logstash。
cd /usr/local/logstash-7.4.2
bin/logstash -f logstash-simple.conf