安装和ES版本相同的logstash,然后在bin的同级目录创建一个文件夹,名字自起:
此文件夹中主要存放需要同步的文件:
以下是jdbc1101.conf文件的数据:
input {
stdin {
}
jdbc {
# mysql 数据库链接
jdbc_connection_string => "jdbc:mysql://IP:端口/数据库?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8"
#oracle数据库
#jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"
#jdbc_connection_string => "jdbc:oracle:thin:@192.168.1.11:1521:orcl"
# 用户名和密码
jdbc_user => "用户"
jdbc_password => "密码"
# 驱动
jdbc_driver_library => "G:\elasticsearch\logstash-7.8.0\mysql\mysql-connector-java-8.0.20.jar"
# 驱动类名
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
# 执行的sql 就是上一步创建的sql文件的绝对路径+文件名字
#statement_filepath => "G:\elasticsearch\logstash-7.8.0\mysql\data.sql"
#由于没有自增ID,避免重复数据
statement => "SELECT *, UNIX_TIMESTAMP(UPDATETIME) AS unix_ts_in_secs FROM gb_1101 where (UNIX_TIMESTAMP(UPDATETIME)) > :sql_last_value AND UPDATETIME < NOW() order by UPDATETIME asc"
# 是否需要记录某个column 的值,如果record_last_run为真,可以自定义我们需要 track 的 column 名称,此时该参数就要为 true. 否则默认 track 的是 timestamp 的值.
use_column_value => true
# 如果 use_column_value 为真,需配置此参数. track 的数据库 column 名,该 column 必须是递增的. 一般是mysql主键
tracking_column => "unix_ts_in_secs"
record_last_run => true
#:sql_last_value执行后存放点
last_run_metadata_path => "G:\elasticsearch\logstash-7.8.0\mysql\mysql_last_num.txt"
tracking_column_type => "numeric"
# 设置监听间隔 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
# 索引类型
type => "js_name"
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
}
output {
if [type]=="js_name" {
elasticsearch {
# ES的IP地址及端口
hosts => ["localhost:9200"]
# 索引名称
index => "index_name"
# 自增ID id必须是待查询的数据表的序列字段;或主键字段
#document_id => "%{id/主键}"
}
}
stdout {
# JSON格式输出
codec => json_lines
}
}
input中个别字段详解:
# 数据库重连尝试次数
connection_retry_attempts => "3"
# 数据库连接可用校验超时时间,默认3600S
jdbc_validation_timeout => "3600"
# 开启分页查询(默认false不开启);
jdbc_paging_enabled => "true"
# 单次分页查询条数(默认100000,若字段较多且更新频率较高,建议调低此值);
jdbc_page_size => "500"
# 如果sql较复杂,建议配通过statement_filepath配置sql文件的存放路径;
statement_filepath => "/home/logstash-7.8.1/addStudent.sql"
# 需要记录查询结果某字段的值时,此字段为true,否则默认tracking_column为timestamp的值;
use_column_value => true
# 是否将字段名转换为小写,默认true(如果有数据序列化、反序列化需求,建议改为false);
lowercase_column_names => false
# 需要记录的字段,用于增量同步,需是数据库字段
tracking_column => sid
# Value can be any of: numeric,timestamp,Default value is "numeric"
tracking_column_type => numeric
# record_last_run上次数据存放位置;
record_last_run => true
#上一个sql_last_value值的存放文件路径, 必须要在文件中指定字段的初始值
last_run_metadata_path => "/home/logstash-7.8.1/config/station_parameter.txt"
# 是否清除last_run_metadata_path的记录,需要增量同步时此字段必须为false;true则每次都从头开始查询所有的数据库记录,默认false
clean_run => false
详细配置详见:https://www.jianshu.com/p/d127c3799ad1
进入bin文件夹下,执行同步:
logstash -f ../mysql/jdbc1101.conf
ps:摸着石头过河,走了不少弯路,由于需要同步的表中没有自增ID,所以找了很多栗子,经过多次测试,还是解决了重复数据的问题,详情见input中的片段,如果不是自增ID,把document_id注掉