通过Logstash实现Oracle数据到Elasticsearch的批量导入

一、Logstash简介

Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。logstash是ELK Stack产品套装中的一个成员。截止到2019年12月12日,最新发布的版本是7.5。
Logstash 能够动态地采集、转换和传输数据,不受格式或复杂度的影响。利用 Grok 从非结构化数据中派生出结构,从 IP 地址解码出地理坐标,匿名化或排除敏感字段,并简化整体处理过程。由输入、过滤器和输出三个部分组成。
输入:能够采集各种样式、大小和来源的数据。数据往往以各种各样的形式,或分散或集中地存在于很多系统中。 Logstash 支持 各种输入选择 ,可以在同一时间从众多常用来源捕捉事件。能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据。
过滤器:实时解析和转换数据。数据从源传输到存储库的过程中,Logstash 过滤器能够解析各个事件,识别已命名的字段以构建结构,并将它们转换成通用格式,以便更轻松、更快速地分析和实现商业价值。

  • 利用 Grok 从非结构化数据中派生出结构
  • 从 IP 地址破译出地理坐标
  • 将 PII 数据匿名化,完全排除敏感字段
  • 简化整体处理,不受数据源、格式或架构的影响
    输出:选择您的存储库,导出您的数据。尽管 Elasticsearch 是我们的首选输出方向,能够为我们的搜索和分析带来无限可能,但它并非唯一选择。
    可扩展:Logstash 采用可插拔框架,拥有 200 多个插件。您可以将不同的输入选择、过滤器和输出选择混合搭配、精心安排,让它们在管道中和谐地运行。

二、需求描述

1、将Oracle中已有的数据批量、稳定、快速地导入到Elasticsearch中建立索引;
2、新增加的数据以增量的方式追加到Elasticsearch的索引中。

三、实践环境

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

四、环境准备

1、在192.168.100.156上安装好logstash7.4.2。
2、在192.168.100.155上安装好elasticsearch7.4.2。
3、可以到官网下载或是到安装Oracle数据库的服务器上找到ojdbc6.jar(或是ojdbc7.jar,有一个即可,不同的ojdbc版本配置信息有所区别)。
不同版本的Oracle对应的ojdbc.jar的官方下载路径:https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html
linux环境下在命令行中输入以下命令可以快速找到ojdbc6.jar所在路径

find / -name "ojdbc6.jar"

五、具体实现

(一)验证logstash是否已经安装了jdbc输入插件和elasticsearch的输出插件

1、进入logstash的安装目录

cd $LOGSTASH_HOME

$LOGSTASH_HOME填写自己机器上logstash的安装路径
2、验证jdbc输入插件以及elasticsearch输出插件是否存在

bin/logstash-plugin list --verbose "jdbc"

以上命令是列出所有含jdbc字眼的插件的名称和版本号。

bin/logstash-plugin list --verbose "elastic"

如果返回的内容中含logstash-input-jdbc(4.3.16),以及logstash-output-elasticsearch(10.1.0),表明已经安装了jdbc输入插件和elasticsearch输出插件。

(二)、定义配置文件

每一个插件在logstash的配置文件中为独立的定义块。由三部分组成:输入部分(input),过滤器(filter),输出部分(output)
配置文件所在路径:$LOGSTASH_HOME/config。
配置文件基本结构如下:

input {
  ...
}

filter {
  ...
}

output {
  ...
}

1、定义jdbc输入部分。

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.bsm,t.mc,t.jzxttl,t.gshttl,t.ytshttl,sde.st_astext(t.shape) as location from 港口分布 t"
		jdbc_fetch_size=>50
	}
}

本例中定义了两个输入,一个是在控制台输入的stdin,另一个是jdbc输入。
jdbc_connection_string的值为连接Oracle 12C的连接字符串,这里我用的是EZconnection的方法。
jdbc_user:你要导入的表所在Oracle的用户名
jdbc_password:Oracle的密码
jdbc_driver_library:ojdbc所在路径。如果不填写,则LogStash到$LOGSTASH_HOME/logstash-core/lib/jars下面查找。
jdbc_driver_class:Oracle的类名。如果引用的是ojdbc7.jar,这里输入oracle.jdbc.driver.OracleDriver;如果是ojdbc6.jar,这里输入Java::oracle.jdbc.driver.OracleDriver。
statement:要导出数据的sql语句。注意不要分号结尾。
jdbc_fetch_size:Logstash一次获取的记录数。
2、定义elasticsearch输出部分。

output {
  elasticsearch {
    hosts => ["http://192.168.100.155:9200"]
    index => "test_oracle"
    #user => "elastic"
    #password => "changeme"
  }
   stdout{ codec=> rubydebug}
}

本例中定义了两个输出,一个是控制台输出,一个是输出到elasticsearch中。没有定义过滤器。
hosts :elasticsearch的主机名,可以分号隔开。
index:要建立的索引名。索引名必须为小写,而且这里填写的索引名称必须已经存在,或是能够满足elasticsearch自动创建索引的条件。
3、复制ojdbc文件到Logstash的类库中。
将下载的ojdbc6.jar或是ojdbc7.jar文件上传至logstash的默认类库中,路径为$LOGSTASH_HOME/logstash-core/lib/jars/
4、完整的配置文件

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.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}
}

(三)启动logstash

以配置文件的方式启动logstash。
cd /usr/local/logstash-7.4.2
bin/logstash -f logstash-simple.conf

(四)、注意事项

  • 输出部分中elasticsearch索引名称必须为小写。
  • 如果使用的ojdbc6.jar的时候,jdbc_driver_class的值必须为"Java::oracle.jdbc.driver.OracleDriver"
  • 配置文件中如果含有中文,必须以UTF-8编码

你可能感兴趣的:(Oracle12C,elasticsearch,Logstash)