使用 logstash-integration-jdbc 同步数据库中的数据(全量 和 增量)
Posted 幸福丶如此
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 logstash-integration-jdbc 同步数据库中的数据(全量 和 增量)相关的知识,希望对你有一定的参考价值。
一、安装
logstash-integration-jdbc
是logstash 的一个插件,可以通过logstash的将mysql中的数据直接同步到es中,从而在kibana中展示。 logstash-integration-jdbc
之前的名称叫 logstash-input-jdbc
.
1、替换国内镜像
gem source --remove https://rubygems.org/
gem source --add https://gems.ruby-china.com/
备注:logstash-integration-jdbc是使用ruby语言开发的,因此需安装gem,gem是Ruby的一个包管理器
2、修改Gemfile数据源地址
①进入logstash的安装目录,修改Gemfile文件 ,将Gemfile的source
换成https://gems.ruby-china.com/
②修改Gemfile.lock文件,将GEM remote
修改为https://gems.ruby-china.com/
3、安装 logstash-integration-jdbc
插件
##进入bin目录
cd /opt/logstash/bin/
sudo ./logstash-plugin install logstash-integration-jdbc
# 显示如下信息即安装成功
Validating logstash-integration-jdbc
Installing logstash-integration-jdbc
Installation successful
二、数据全量同步
全量同步是指全部将数据同步到es,通常是刚建立es,第一次同步时使用。
编写 jdbc.conf 文件,内容如下
input
jdbc
# 驱动
jdbc_driver_library => "/opt/logstash/lib/mysql-connector-java/mysql-connector-java-5.1.49-bin.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
# 数据库连接信息
jdbc_connection_string => "jdbc:mysql://localhost:3306/report"
jdbc_user => "root"
jdbc_password => "root"
# 设置监听间隔 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
# 执行的sql
statement => "select id,shop_id,profits,record_month from month_report"
# 索引类型
type => "jdbc"
filter
json
source => "message"
remove_field => ["message"]
output
elasticsearch
hosts => ["127.0.0.1:9200"]
index => "report"
# 自增ID 需要关联的数据库中有有一个id字段,对应索引的id号
document_id => "%id"
stdout
# JSON格式输出
codec => json_lines
扩展:
input中的 statement 可以用 statement_filepath 代替,statement_filepath 书写格式如下
# 执行的sql 文件路径+名称
statement_filepath => "/opt/logstash/config/jdbc.sql"
## jdbc.sql 文件内容如下
cat > /opt/logstash/config/jdbc.sql << END
select id,shop_id,profits,record_month from month_report
END
三、数据增量同步
增量同步是指将后续的更新、插入记录同步到es。
input
jdbc
jdbc_driver_library => "/opt/logstash/lib/mysql-connector-java/mysql-connector-java-5.1.49-bin.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3306/report"
jdbc_user => "root"
jdbc_password => "root"
schedule => "* * * * *"
statement => "select id,shop_id,profits,record_month from month_report"
type => "jdbc"
#处理中文乱码问题
codec => plain charset => "UTF-8"
#使用其它字段追踪,而不是用时间
use_column_value => true
#追踪的字段
tracking_column => id
record_last_run => true
#上一个sql_last_value值的存放文件路径, 必须要在文件中指定字段的初始值
last_run_metadata_path => "/opt/logstash/config/station_parameter.txt"
#开启分页查询
jdbc_paging_enabled => true
jdbc_page_size => 300
filter
json
source => "message"
remove_field => ["message"]
output
elasticsearch
hosts => ["127.0.0.1:9200"]
index => "report"
document_id => "%id"
stdout
codec => json_lines
参数说明:
//是否记录上次执行结果, 如果为真,将会把上次执行到的 tracking_column 字段的值记录下来,保存到 last_run_metadata_path 指定的文件中
record_last_run => true
//是否需要记录某个column 的值,如果 record_last_run 为真,可以自定义我们需要 track 的 column 名称,此时该参数就要为 true. 否则默认 track 的是 timestamp 的值.
use_column_value => true
//如果 use_column_value 为真,需配置此参数. track 的数据库 column 名,该 column 必须是递增的.比如:ID.
tracking_column => MY_ID
//指定文件,来记录上次执行到的 tracking_column 字段的值
//比如上次数据库有 10000 条记录,查询完后该文件中就会有数字 10000 这样的记录,下次执行 SQL 查询可以从 10001 条处开始.
//我们只需要在 SQL 语句中 WHERE MY_ID > :last_sql_value 即可. 其中 :last_sql_value 取得就是该文件中的值(10000).
last_run_metadata_path => "/opt/logstash/config/station_parameter.txt"
//是否清除 last_run_metadata_path 的记录,如果为真那么每次都相当于从头开始查询所有的数据库记录
clean_run => false
//是否将 column 名称转小写
lowercase_column_names => false
四、运行时可能会报错Pipelines YAML文件为空
在config目录下修改pipelines.yml,将一下内容的注释去掉
- pipeline.id: test
pipeline.workers: 1
pipeline.batch.size: 1
config.string: "input generator filter sleep time => 1 out put stdout codec => dots "
- pipeline.id: another_test
queue.type: persisted
path.config: "/opt/logstash/config/*.config"
重新跑自己写好的文件即可
nohup /opt/logstash/bin/logstash -f /opt/logstash/config/jdbc.conf &
以上是关于使用 logstash-integration-jdbc 同步数据库中的数据(全量 和 增量)的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)