一、Logstash增量同步,使用自增ID或last_update_time字段去控制同步
注:使用ID的话是没办法同步更新的数据,所以建议使用last_update_time字段去做增量同步。
使用方式:
input {
jdbc {
jdbc_driver_library => "xxxxx.jar"
#jdbc驱动类全类名
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
#jdbc连接url
jdbc_connection_string => "xxxx"
#数据库用户名
jdbc_user => "root"
#数据库密码
jdbc_password => "xxxxxx"
#数据同步时间(都是*则每一分钟同步一次)
schedule => "* * * * *"
#jdbc分页查询开启
jdbc_paging_enabled => true
#查询每页显示数据条数
jdbc_page_size => 1000
#直接执行sql,其中:sql_last_value 这个是固定写法
statement =>"select * from xxxx where update_time>= :sql_last_value"
#上次更新位置标记文件路径
last_run_metadata_path => "D:/logstash-7.12.0/mysql/statement.txt"
#每次启动是否清除上一项配置文件中数据
clean_run => false
#开启所有字段名转成小写
lowercase_column_names => true
#解决中文乱码问题
codec => plain { charset => "UTF-8"}
#是否记录上次运行的记录
record_last_run => true
#是否使用其他字段判断进行数据库同步
use_column_value => true
#数据库中的增量指标字段名
tracking_column => "update_time"
#此处配置必须填写
tracking_column_type => "timestamp"
}
}
二、Logstash同步mysql多数据表时到elasticsearch时数据错乱
问题:同步两个表A、B时(或两个以上),可能会出现数据错乱,如将A数据放到B索引里面。
解决:在input->jdbc中添加type,且在output中添加if判断,如
input {
jdbc {
jdbc_driver_library => "xxxxx"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "xxxxxx"
jdbc_user => "root"
jdbc_password => "xxxx"
schedule => "* * * * *"
....
type => "test1" # 定义type
}
}
output {
if [type] == "test1" { # 判断 type
elasticsearch {
index => "A"
document_id => "%{id}"
user => "logstash"
password => "xxxx"
}
}
}