LogStash+MySQL+Elasticsearch实现数据增量导入
1 环境准备
1.1 上传数据库驱动
LogStash本身不提供数据库驱动,需要使用者提供数据库的驱动包,且LogStash中的数据库JDBC插件就是Java开发的。需要上传数据库驱动到LogStash所在主机。
Logstash5.x & 6.3.*以下版本,上传驱动不需要固定位置,任意位置即可。
Logstash6.8.4版本的上传位置固定是:$LogStash_HOME/logstash_core/lib/jars/
1.2 准备数据库表格
LogStash实现增量导入,需要有一个定位字段,这个字段的数据,可以表示数据的新旧,代表这个数据是否是一个需要导入到ES中的数据。这里使用表格的updated字段作为定位字段,每次读取数据的时候,都会记录一个最大的updated时间,每次读取数据的时候,都读取updated大于等于记录的定位字段数据。每次查询的就都是最新的,要导入到ES中的数据。
2 编写LogStash配置文件
在$LogStash_home/config/目录中,编写配置文件ego-items-db2es.conf
vim config/ego-items-db2es.conf
input { jdbc { # 连接地址 jdbc_connection_string => "jdbc:mysql://192.168.1.2:3306/ego?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"
# 数据库用户名和密码 jdbc_user => "root" jdbc_password => "root"
# 驱动类,如果使用低版本的logstash,需要再增加配置 jdbc_driver_library,配置驱动包所在位置 jdbc_driver_class => "com.mysql.cj.jdbc.Driver" # 是否开启分页逻辑 jdbc_paging_enabled => true # 分页的长度是多少 jdbc_page_size => "2000" # 时区 jdbc_default_timezone => "Asia/Shanghai"
# 执行的SQL statement => "select id, title, sell_point, price, image, updated from tb_item where updated >= :sql_last_value order by updated asc"
# 执行SQL的周期, [秒] 分钟 小时 天 月 年 schedule => "* * * * *"
# 是否使用字段的值作为比较策略 use_column_value => true # 作为比较策略的字段名称 tracking_column => "updated" # 作为比较策略的字段类型,可选为numberic和timestamp tracking_column_type => "timestamp"
# 记录最近的比较策略字段值的文件是什么,相对寻址路径是logstash的安装路径 last_run_metadata_path => "./ego-items-db2es-last-value" # 是否每次执行SQL的时候,都删除last_run_metadata_path文件内容 clean_run => false # 是否强制把ES中的字段名都定义为小写。 lowercase_column_names => false } }
output { elasticsearch { hosts => ["http://192.168.89.140:9200", "http://192.168.89.141:9200"] index => "ego-items-index" action => "index" document_id => "%{id}" } } |
3 安装logstash-input-jdbc插件
在LogStash6.3.x和5.x版本中,logstash-input-jdbc插件是默认安装的。在6.8.4版本的LogStash中是未安装的,需要手工安装。安装命令如下:
$Logstash_HOME/bin/logstash-plugin install logstash-input-jdbc
4 启动测试
启动LogStash命令不变:
bin/logstash -f 配置文件