配置多个数据源和不同的表访问多个配置
解决问题: 数据已经导入完成 logstash还一直循环导入数据(定时器设置时间有点短 )
同步数据两种方案:方案一 每一次同步都是从头同步的
1.clean_run =>true就好了
2.schedule => “* * * * " (根据你的业务需求看定多长时间比较合适) 要是想使用每分钟执行一次 schedule => "/1 * * * *” 表示每分钟执行一次
schedule => “1 * * * *” 表示每小时的第一分钟执行一次

方案一配置完成了 .sql文件不需要添加WHERE goods_id(tracking_column里面的列) > :sql_last_value
方案二 下面这种方式 (从上次导入的数据开始重新导入新的数据)但是有一个弊端就是 已经导入的数据不重新导入 如果数据库删除一部分已经导入过的数据的时候就会导致数据库中的数据和es中的数据不相同了

注意:要想配置从上次同步数据向后导入数据需要注意几点
1.clean_run => false(一定要是false)
2.use_column_value => true(表示使用数据库中的列作为标志)
3.tracking_column => 数据库中增量的列名 (数据库中的列 例如id 或者时间的列)
4. record_last_run => true(是否要记录上次导入数据的增量的数据)
5.last_run_metadata_path => “自己创建一个文件的地址” (作用使用来存储上次导入数据的位置)
jdbc.sql文件中需要添加 WHERE goods_id(tracking_column里面的列) > :sql_last_value
SELECT * from tb_goods WHERE goods_id > :sql_last_value
input {
stdin {
}
jdbc{
type => "tb_goodstest01"
#jdbc sql server 驱动
jdbc_driver_library => "D:/es/logstash-6.2.2/bin/bin/sqljdbc4-4.0.jar"
#jdbc class 不同数据库有不同的 class 配置
jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
#配置数据库连接 ip 和端口,以及数据库
jdbc_connection_string => "jdbc:sqlserver://127.0.0.1:1433;databaseName=test01"
#配置数据库用户名
jdbc_user => "sa"
#配置数据库密码
jdbc_password => "123456"
# 定时器 多久执行一次SQL,默认是一分钟
# schedule => 分 时 天 月 年
# schedule => * 22 * * * 表示每天22点执行一次
schedule => "* * * * *"
#是否清除 last_run_metadata_path 的记录,如果为true那么每次都相当于从头开始查询所有的数据库记录
clean_run => false
#是否需要记录某个column 的值,如果 record_last_run 为真,可以自定义我们需要表的字段名称,
#此时该参数就要为 true. 否则默认 track 的是 timestamp 的值.
use_column_value => true
#如果 use_column_value 为真,需配置此参数. 这个参数就是数据库给出的一个字段名称。当然该字段必须是递增的 可以是id 或者时间列(作用这个就是做为一个标识当下次执行同步操作的时候 根据这个列中的数据查起 )
tracking_column => goods_id
#是否记录上次执行同步操作数据结果 true表示记录上次操作到的位置 就是将tracking_column 中的数据写入到last_run_metadata_path 文件中
record_last_run => true
#这个文件需要自己创建出来 作用就是记录tracking_column(数据库中自增的列) 作为一个标识 下次执行同步数据库的操作的时候直接从这个标识查起 名字无所谓什么都是可以的
last_run_metadata_path => "D:\es\logstash-6.2.2\bin\tb_goodstest01.txt"
#是否将字段名称转小写。
#这里有个小的提示,如果你这前就处理过一次数据,并且在Kibana中有对应的搜索需求的话,还是改为true,
#因为默认是true,并且Kibana是大小写区分的。准确的说应该是ES大小写区分
lowercase_column_names => false
#你的SQL文件的位置,当然,你的SQL也可以直接写在这里。
statement_filepath => "jdbc.sql"
}
jdbc{
type => "tb_usertest02"
jdbc_driver_library => "D:/es/logstash-6.2.2/bin/bin/sqljdbc4-4.0.jar"
jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
jdbc_connection_string => "jdbc:sqlserver://127.0.0.1:1433;databaseName=test02"
jdbc_user => "sa"
jdbc_password => "123456"
schedule => "* * * * *"
clean_run => true
use_column_value => true
tracking_column => userid
record_last_run => true
last_run_metadata_path => "D:\es\logstash-6.2.2\bin\tb_usertest02.txt"
lowercase_column_names => false
statement_filepath => "jbdctest02.sql"
}
}
#在数据库导入到es中的数据的时候 es会自动创建出一些字段就是下面的这几个字段 要是不想要这几个字段就添加过滤器
filter {
mutate {
remove_field => ["@timestamp","@version","create_time","update_time"]
}
}
output {
if[type]=="tb_goodstest01"{
elasticsearch {
# ES的IP地址及端口
hosts => ["127.0.0.1:9200"]
# 索引名称 可自定义
index => "tb_goods_test01x"
# 需要关联的数据库中有有一个id字段,对应类型中的id
document_id => "%{goods_id}"
"document_type" => "%{type}"
}
}
if[type]=="tb_usertest02"{
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "tb_goods_test02x"
document_id => "%{userid}"
"document_type" => "%{type}"
}
}
stdout {
# JSON格式输出
codec => json_lines
}
}
要是想配置一个库一个表的话就删除一个jdbc{ }
和if 这一层好了
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "tb_goods_test02x"
document_id => "%{userid}"
"document_type" => "%{type}"
}
大家有想互相分享工作经验的,或者了解更多的,可以加群,一起进步

本文介绍了如何配置Logstash以处理多个数据源和不同表的同步,并提供了两种数据同步方案:全量同步与增量同步。全量同步通过设置`clean_run => true`和合适的定时任务实现;增量同步则需设定`clean_run => false`,利用`use_column_value`、`tracking_column`等参数跟踪数据库中变化的列,并通过`last_run_metadata_path`保存进度。在SQL文件中添加WHERE条件用于筛选增量数据。
533





