需要先下载一个mysql-connector-java mysql官网有的下载。
https://dev.mysql.com/downloads/file/?id=488444
网上大多数的模板都是这样的 ,开启分页查询,设置每次查询的数量。
官方文档地址
https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html
input {
stdin {
}
jdbc {
type => "xxx"
jdbc_connection_string => "jdbc:mysql://localhost:3306/test"
jdbc_user => "root"
jdbc_password => "root"
record_last_run => true
use_column_value => true
tracking_column => "id"
last_run_metadata_path => "/usr/local/logstash-6.5.4/data/my_info"
clean_run => "false"
jdbc_driver_library => "/opt/mysql-connector-java-8.0.17/mysql-connector-java-8.0.17.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => true
jdbc_page_size => "500"
statement => "select * from client_log_day_user where id > :sql_last_value"
schedule => "* * * * *"
}
}
#output {
# stdout {
# codec => json_lines
# }
# elasticsearch {
# "hosts" => "192.168.10.116:9200"
# "index" => "client_log_day_user"
# "document_type" => "index"
# "document_id" => "%{id}"
# }
#}
然后这样输出的结果
但是会有个问题 ,如果在大表里你的offset的值越大,查询的速度会越来越慢。如下
一个查询需要2s 一个查询只需要0.015s
应该用
SELECT * FROM (select * from api_info_log_20190823 where id > :sql_last_value) AS t1 LIMIT 500
这样来查询 会比较有效率。
首先创建一个偏移量的文件
echo “0“ > /usr/local/logstash-6.5.4/data/info.txt
贴上配置文件
input {
jdbc {
type => "xxx"
jdbc_connection_string => "jdbc:mysql://192.168.10.210:3306/pdabc"
jdbc_user => "root"
jdbc_password => "pdabc"
record_last_run => true
use_column_value => true
tracking_column => "id"
last_run_metadata_path => "/usr/local/logstash-6.5.4/data/info.txt"
#jdbc_paging_enabled => true
jdbc_driver_library => "/opt/mysql-connector-java-8.0.17.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
statement => "select * from api_info_log_20190823 where id > :sql_last_value limit 500 "
schedule => "* * * * *"
}
}
output {
elasticsearch {
"hosts" => "192.168.10.116:9200"
"index" => "api_info_log_20190823"
"document_type" => "index"
"document_id" => "%{id}"
}
}
结果如下
2.8G的数据 500行/分钟 大概需要同步3小时
数据2.8G导入es大概1G
但是到了这里又会有一个新问题,如果我把很多个表放到一个conf中,并且通过判断type的方式,把数据写入索引。 logstash 会报错failed to parse field [type] of type [long]
原因是因为我的mysql 表字段也有type这个值,由于type这个值我es搜索的时候也要用,因此需要单独跑。
就写了定时任务,不同的表写在不同的配置文件。然后每个小时的10分20分 30分跑不同的任务。
但是执行定时任务的时候杀死之前的脚本 就会报Terminated
后来排查发现是脚本的问题。
ps的时候搜的是名称为logstash的pid
结果脚本是以logstash命名的 所以杀完脚本就退出了。
还有一定要source /etc/profile
现在如下
需要同步的话可以取消注释
es中显示