分享写 logstash 定时同步drds数据到es的小心得
一个同步的样例:
input {
jdbc {
jdbc_driver_library => "/home/mysql5.7/mysqlDriver/mysql-connector-java-8.0.13.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
# 8.0以上版本:一定要把serverTimezone=UTC天加上
jdbc_connection_string => "jdbc:mysql://192.168.124.8:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"
jdbc_user => "root"
jdbc_password => "root"
# 数据库重连尝试次数
connection_retry_attempts => "3"
# 数据库连接可用校验超时时间,默认3600S
jdbc_validation_timeout => "3600"
# 开启分页查询(默认false不开启);
jdbc_paging_enabled => "true"
# 单次分页查询条数(默认100000,若字段较多且更新频率较高,建议调低此值);
jdbc_page_size => "10000"
# 如果sql较复杂,建议配通过statement_filepath配置sql文件的存放路径;
#statement_filepath => "/logstash/logstash-7.10.2/config/tosql.sql"
# 需要记录查询结果某字段的值时,此字段为true,否则默认tracking_column为timestamp的值;
use_column_value => true
# 是否将字段名转换为小写,默认true(如果有数据序列化、反序列化需求,建议改为false);
#lowercase_column_names => false
# 需要记录的字段,用于增量同步,需是数据库字段
tracking_column => update_time
# Value can be any of: numeric,timestamp,Default value is "numeric"
tracking_column_type => timestamp
# record_last_run记录最后一次运行的结果()
record_last_run => true
#上一个sql_last_value值的存放文件路径, 必须要在文件中指定字段的初始值
last_run_metadata_path => "/logstash/logstash-7.10.2/config/test.txt"
# 是否清除last_run_metadata_path的记录,需要增量同步时此字段必须为false;
clean_run => false
schedule => "* * * * *"
statement => "SELECT a,b from test WHERE update_time > :sql_last_value"
#jdbc_default_timezone => "Asia/Shanghai"
#使用本地时区为local,否则sql_last_value如果是timestamp,时间会提前8小时
#值可以是任何的:utc,local,默认值为 "utc"
plugin_timezone => "local"
}
}
filter {
# 因为时区问题需要修正时间
ruby {
code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)"
}
ruby {
code => "event.set('@timestamp',event.get('timestamp'))"
}
# ruby {
# code => "event.set('create_time', event.get('create_time').time.localtime + 8*60*60)"
#}
## 转换成日期格式
# ruby {
# code => "event.set('create_time', event.get('create_time').time.localtime.strftime('%Y-%m-%d'))"
# }
mutate {
#把数据库的auto_id赋给es的id
#rename => {"auto_id" => "id"}
remove_field => ["timestamp"]
}
}
output {
elasticsearch {
# ES集群地址(如果是单机的填一个就行)
hosts => ["192.1.1.1:0000"]
user => "elastic"
password => "pass"
# 索引名称
index => "test"
# 需要关联的数据库中有有一个id字段,对应类型中的id
document_id => "%{haoma}"
}
#stdout {
# # 输出为json数据
# codec => json_lines
#}
stdout{codec => rubydebug}
file{
path => "/home/intelligent_upgrade/logstash/logstashStorage/secure/%{+YYYY.MM.dd}.log"
codec => json_lines
}
}
需要关注的几个点:
schedule => "* * * * *",不设置默认每分钟进行一次抽取,"*/5 * * * *"是5分钟抽取一次,"10 11 * * *"是11:10开始抽取一次。
增量更新时可使用:sql_last_value在sql里
use_column_value=true,则最后更新时间记录为update_time字段的值,如果是false,记录为系统时间。
last_run_metadata_path是在增量更新时记录最后一次更新时间的文件。
在filter里,需要进行时间的调整,否则时间会差8个小时
输出stdout,如果不注释会打印出所有抽取的数据到控制台,加上file是把输出写到xxx文件里。
如有问题,欢迎评论区讨论,最近研究这个颇有心得