本文只做操作记录,不做深度研究
笔者的业务需求是多快好省的将mysql的指定数据迁移到elasticsearch中
安装logstash
- ⚠环境是centos7,已经配置好java环境且安装配置了可用的elasticsearch6.6
下载tar包
https://artifacts.elastic.co/downloads/logstash/logstash-6.6.0.tar.gz
使用shell工具将tar放入服务器并解压
tar -zxvf logstash-6.6.0.tar.gz
下载mysql驱动包(本人放置在logstash/bin目录下),可以去maven官网下载,或者从你本地的gradle或者maven仓库里拿(基本都有的吧)
安装之后编写脚本文件fileName.conf
#数据source
input {
stdin { }
jdbc {
#mysql信息
jdbc_connection_string => "jdbc:mysql://ip:port/dbName?***"
jdbc_user => "root"
jdbc_password => "ZHjPDhoigjk="
#本地jar包,注意路径
jdbc_driver_library => "mysql-connector-java-8.0.18.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
#获取到记录的SQL查询语句
statement => "SELECT * FROM tb"
#定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
#schedule => "* * * * *"
}
}
#数据target
output {
stdout {
codec => json_lines
}
elasticsearch {
#ES信息
hosts => "ip:9200"
index => "book"
document_type => "book"
#这里指定es的id由sql中的哪个列映射
document_id => "%{id}"
}
}
指定脚本文件启动logstash
cd logstash-6.6.0/bin/ ./logstash -f fileName.conf
另外也可以直接写脚本命令,如
cd logstash-6.6.0/bin/ ./logstash -e input{{stdin {}}output {stdout {}}
以上的步骤可实现最基本的数据迁移,使用kibana或者head插件查看es上是否成功导入数据
⚠问题
centos中执行logstash的用户问题
elasticsearch的中不允许使用root账户进行操作,本想着logstash应如是,笔者创建新用户并授权文件夹进行操作—chomd -R logstash6.6/ newUser
,却发现只有在root用户的执行下,才能稳定的执行成功。
字段映射问题
- 意料外的字段@version、@timestamp
直接使用默认模板进行数据迁移,生成的elasticsearch的mappings会多出@timestamp
、@version
字段
- 字段驼峰命名问题
select bookName from tb
bookName
会在elasticsearch存在为 bookname
,解决方法为在.conf
文件的jdbc
配置中新增配置lowercase_column_names => false
;感谢
- mysql的timestamp数据类型问题
想要获得理想的时间格式可以使用date插件去完成,笔者将mysql数据导入到elasticsearch后,数据的格式是这样的2020-01-09T07:02:02.000Z
,并且时间也不对,而时候springboot写的程序获取es数据时,数据的时间却是合理的格式正确的时间,故笔者没在logstash的执行脚本上做任何时间格式化的操作。
.conf文件的编写规范文档
(!!*******!脏话系统自动屏蔽),由于网络原因,笔者无法打开logstash的文档,查不了,后续会补上!
END
PS:
springboot可以整合logstash进行日志的操作,有时间的话可以尝试一下直接在springboot中做mysql-elasticsearch的数据迁移,只要代码的植入性不要太强